// Subject.js (제목에 링크 추가)
<h1><a href="/">{this.props.title}</a></h1>
// App.js
constructor(props){ // 'mode'와 'welcome' state 추가
super(props);
this.state = {
mode: "welcome",
subject: {title: 'WEB', sub: 'World Wide Web!'},
welcome: {title: 'Welcome', desc: 'Hello, React!'},
contents: [...]
}
}
render() { // Content 컴포넌트에 표시될 '_title', '_desc'를 'mode' 값에 따라 설정
var _title, _desc = null;
if(this.state.mode === 'welcome'){
_title = this.state.welcome.title;
_desc = this.state.welcome.desc;
}else if(this.state.mode === 'read'){ // 추후 보완 필요
_title = this.state.contents[0].title;
_desc = this.state.contents[0].desc;
}
return (
<div className="App">
...
<Content title={_title} desc={_desc}></Content>
</div>
);
}
preventDefault()
: 이벤트가 가진 기본 동작을 하지 못하도록 막는 함수// App.js
render() {
...
return (
<div className="App">
// jsx 주석
{/* {<Subject
title={this.state.subject.title}
sub={this.state.subject.sub}>
</Subject>} */}
<header>
<h1><a href="/" onClick={function(e){
console.log(e);
e.preventDefault();
}}>{this.state.subject.title}</a></h1>
{this.state.subject.sub}
</header>
...
</div>
);
}
❗
태그에서 바로 함수 선언해서 이벤트 설치가 가능하다니 신기할 따름
this
는 아무런 값도 세팅되지 않은 상태bind(this)
로 현재 컴포넌트를 this
로 사용 가능!setState()
함수 이용// App.jsx
<header>
<h1><a href="/" onClick={function(e){
...
// this.state.mode = 'welcome';
this.setState({
mode:'welcome'
});
}.bind(this)}>{this.state.subject.title}</a></h1>
{this.state.subject.sub}
</header>
render()
함수 안에서 this
값은 render()
함수가 속한 컴포넌트를 가리킴var obj = {name:'bono'};
function bindTest(){
console.log(this.name);
}
bindTest(); // 값이 없음(this에 아무 값도 설정되어 있지 않으므로
// bind 함수로 obj를 this로 설정해서 새로운 함수 생성
var bindTest2 = bindTest.bind(obj);
bindTest2(); // bono 출력
bind()
함수로 컴포넌트 연결mode
를 welcome
으로 변경// App.js
<Subject
...
onChangePage={function(){
this.setState({mode:'welcome'});
}.bind(this)}>
</Subject>
// Subject.js
<header>
<h1><a href="/" onClick={function(e){
e.preventDefault();
this.props.onChangePage();
}.bind(this)}>{this.props.title}</a></h1>
{this.props.sub}
</header>
mode
를 read
로 변경// App.js
<TOC onChangePage={function(){
this.setState({mode:'read'});
}.bind(this)}
data={this.state.contents}>
</TOC>
// TOC.js
while(i < data.length){
lists.push(
<li key={data[i].id}>
<a
href={"/content/"+data[i].id}
onClick={function(e){
e.preventDefault();
this.props.onChangePage();
}.bind(this)}
>{data[i].title}</a>
</li>);
i = i + 1;
}
// App.js
constructor(props){
super(props);
this.state = {
mode:"read",
selected_content_id:2, // 기본값은 2
...
}
}
render() {
var _title, _desc = null;
if(this.state.mode === 'welcome'){
...
}else if(this.state.mode === 'read'){
var i = 0;
// state.contents의 id와 state.selected_content_id가 일치하는 정보 세팅
while(i < this.state.contents.length){
var data = this.state.contents[i];
if(data.id === this.state.selected_content_id){
_title = data.title;
_desc = data.desc;
break;
}
i = i + 1;
}
}
return (
<div className="App">
...
<TOC onChangePage={function(id){ // e.target.dataset.id
this.setState({
mode:'read',
selected_content_id:Number(id) // id를 숫자로 바꿔서 세팅
});
}.bind(this)}
data={this.state.contents}>
</TOC>
...
</div>
);
}
// TOC.js
<li key={data[i].id}>
<a
href={"/content/"+data[i].id}
data-id={data[i].id} // 이벤트 객체(e) - target - dataset - id 값 세팅
onClick={function(e){
e.preventDefault();
this.props.onChangePage(e.target.dataset.id); // 세팅한 값 가져옴
}.bind(this)}
>{data[i].title}</a>
</li>
🤷♀️
이게,,,뭐죠,,,?