- state, props
- 사용자가 조작하는 부분 (props) : 유저 인터페이스(버튼, 터치스크린 등)
- 구현자가 조작하는 부분 (state) : 상태
- 컴포넌트 사용 : props (사용자가 조작하는 속성), state (컴포넌트가 내부적으로 관리하는 정보)
> state를 알아보며 props도 이해하자
- App > Subject : props 하드코딩 > state로 전환하여 개선하자
<!-- 하드코딩된 props 값 : "WEB2","React JSX." -->
<Subject title="WEB2" sub="React JSX."></Subject>
- 생성자(constructor)를 이용해 state 값을 정의하고 초기화한다.
> 컴포넌트가 실행될때 render()를 실행하기 전에 constructor를 실행하여 컴포넌트 초기화를 담당함
constructor(props){
super(props);
this.state = {
subject : {title:"WEB", sub:"World Wid Web!"}
}
}
- 생성자에서 정의한 state를 이용하여 Subject 컴포넌트의 props 정보를 정의한다.
<Subject
title={this.state.subject.title}
sub={this.state.subject.sub}>
</Subject>
- App을 호출하는 index에서는 App의 state정보를 알지 못한다.(알 필요가 없고, 알아서도 안된다.)
- 상위컴포넌트(App)에서 정의한 state 값은 하위컴포넌트(Subject)에서 사용(전달)할 수 있다.
- TOC 의 내용을 App의 state를 이용하여 변경할 수 있도록 개선
- App의 생성자에서 TOC에 전달할 속성 정의
this.state = {
subject : {title:"WEB0", sub:"World Wid Web!!"},
contents:[
{id:1, title:'HTML', desc:'HTML is for information'},
{id:2, title:'CSS', desc:'CSS is for design'},
{id:3, title:'JavaScript', desc:'JavaScript is for interactive'}
]
}
- TOC에서 전달받은 속성정보를 이용하여 내용을 표시할 수 있도록 수정
<Toc data={this.state.contents}></Toc>
- TOC의 render 함수를 수정하여 App에 설정된 state에 따라 표시되도록 수정
> App에 설정된 contents의 항목을 지우면 Toc의 render로 생성되는 항목도 함께 삭제됨
render(){
var lists = [];
var data = this.props.data;
var i = 0;
while(i < data.length){
lists.push(<li><a href={"/content/"+data[i].id}>{data[i].title}</a></li>);
i = i + 1;
}
return(
<nav>
<ul>
{lists}
</ul>
</nav>
);
}
> 오류발생 : react에서 스크립트로 생성하는 화면요소는 식별정보(key)를 표시해야 함.
lists.push(<li key={data[i].id}><a href={"/content/"+data[i].id}>{data[i].title}</a></li>);
* react에서 여러 엘리먼트를 자동으로 생성하도록 작업하기위해서 각 항목을 구분할 수 있도록 key값을 정의해야함
* App에서 상태를 정의하고 하위컴포넌트에서 props를 이용하여 사용한다.
* 실습결과 - 링크를 클릭하면 /content/ 폴더아래 key에 해당하는 자원이 표시됨
'front > react' 카테고리의 다른 글
생활코딩 react (16.2-이벤트 설치) (0) | 2021.08.25 |
---|---|
생활코딩 react (16.1-이벤트 state props 그리고 render 함수) (0) | 2021.06.29 |
생활코딩 react (13~14-React Developer Tools, Component 파일로 분리) (0) | 2021.06.22 |
생활코딩 react (10~12-컴포넌트 만들기) (0) | 2021.06.22 |
생활코딩 react (7~9-js, css 코딩 및 배포) (0) | 2021.06.20 |