REACT
[생활코딩] 컴포넌트 이벤트 만들기 3
worri-pi
2022. 2. 1. 00:26
생활코딩 https://www.youtube.com/watch?v=11mTvRtXx4g&list=PLuHgQVnccGMCRv6f8H9K5Xwsdyg4sFSdi&index=26
App state에 selected_content_id 이름을 줘서 선택된 content를 selected_content_id에 표시할 것이다.
그 값과 contents 객체에서 id 값과 비교하여 일치하는 것을 표출하도록 할 것이다.
App.js 에서 <TOC> 부분
<TOC
onChangePage={function(id){
this.setState({
mode:'read'
})
}.bind(this)}
data={this.state.contents}>
</TOC>
App.js 에서 render() 부분
mode가 read로 변경되었을 때
this.state.contents[i].id 값과 this.state.selected_content_id 값을 비교하여 일치한다면 해당 content 내용을 표출시켜준다.
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'){
var i =0;
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;
}
}
선택한 내용으로 화면에 보여지기 위해
data-id 속성 이용하기
여기서 e.target.dataset.id 정보를 onChangePage 함수를 호출하는 코드의 인자로 넣어주면 된다.
App.js
<TOC
onChangePage={function(id){
this.setState({
mode:'read',
selected_content_id:Number(id)
})
}.bind(this)}
data={this.state.contents}>
</TOC>
TOC.js render()
render(){
var lists =[];
var data = this.props.data;
var i =0;
while(i < data.length){
lists.push(
<li key={data[i].id}>
<a
href={"/content/"+data[i].id}
data-id={data[i].id}
onClick={function(e){
e.preventDefault();
this.props.onChangePage(e.target.dataset.id);
}.bind(this)}
>{data[i].title}</a>
</li>)
i=i+1;
}
return(
<nav>
<ul>
{lists}
</ul>
</nav>
);
}
Number는 문자를 강제로 숫자로 변경해주는 함수이다.
-------
data-id 가 만약 data-iddd 라면
e.target.dataset.iddd 로 변경하면 된다.
-------
만약 속성을 이용하지 않는다면 이렇게 인자 값을 수정하여 적용할 수 있다.
import React, {Component} from 'react';
class TOC extends Component{
render(){
var lists =[];
var data = this.props.data;
var i =0;
while(i < data.length){
lists.push(
<li key={data[i].id}>
<a
href={"/content/"+data[i].id}
onClick={function(id,e){
e.preventDefault();
this.props.onChangePage(id);
}.bind(this,data[i].id)}
>{data[i].title}</a>
</li>)
i=i+1;
}
return(
<nav>
<ul>
{lists}
</ul>
</nav>
);
}
}
export default TOC;
728x90