Study. React
이벤트
[이벤트 state props 그리고 render 함수]
📌이벤트는 props, state, 이벤트 이 세 가지가 서로 상호작용하며 애플리케이션의 역동성을 형성
📌WEB에 링크를 걸면 본문에 Welcome 메세지가 나옴
📌Subject를 클릭하면 그것에 해당하는 것들이 나옴
📌링크를 클릭하면 App컴포넌트에 state가 바뀌고 그 바뀐 state가 content 컴포넌트의 props 값으로 전달
📌mode: 사용자가 보고 있는 페이지가 Welcome페이지 인지 읽기 페이지 인지 구분
📌App.js
this.state = {
mode:'welcome',
subject:{title:'WEB', sub:'World Wide Web!'},
welcom:{title:'Welcome', desc:'Hello, React!!'},
// content 배열에 담겨있는 것을 TOC에 담음
contents:[
{id:1, title:'HTML', desc:'HTML is for information'},
{id:2, title:'CSS', desc:'CSS is form design'},
{id:3, title:'JavaScript', desc:'HTML is for interactive'}
],
explain:{title:'HTML', desc:'HTML is Hypertext Markup Language.'}
}
📌props값이나 state의 값이 바뀌면 그 state를 가지고 있는 컴포넌트의 render함수가 다시 호출됨 그래서 그 render함수 하위에 있는 컴포넌트들도 다시 호출됨
📌render(): 어떤 html을 그릴 것인지 나타냄, props값이나 state값이 바뀌면 render함수 하위의 컴포넌트들이 재호출 됨
📌mode의 값에 따라서 만들어지는 render함수의 결과가 달라지게 됨(welcome/read)
📌App.js
import React, { Component } from 'react';
import TOC from "./components/TOC";
import Content from "./components/Content";
import Subject from "./components/Subject";
import Aside from "./components/Aside";
import './App.css';
class App extends Component {
constructor(props){
super(props);
this.state = {
mode:'read',
subject:{title:'WEB', sub:'World Wide Web!'},
welcome:{title:'Welcome', desc:'Hello, React!!'},
contents:[
{id:1, title:'HTML', desc:'HTML is for information'},
{id:2, title:'CSS', desc:'CSS is form design'},
{id:3, title:'JavaScript', desc:'HTML is for interactive'}
],
// explain:{title:'HTML', desc:'HTML is Hypertext Markup Language.'}
}
}
render() {
console.log('App render');
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">
<Subject title={this.state.subject.title}
sub={this.state.subject.sub}>
</Subject>
<TOC data={this.state.contents}></TOC>
<Content title={_title} desc={_desc}></Content>
<Aside></Aside>
</div>
);
}
}
export default App;
📌Content.js
import React, { Component } from 'react';
class Content extends Component{
render(){
console.log('Content render');
return(
<article>
<h2>{this.props.title}</h2>
{this.props.desc}
</article>
);
}
}
export default Content;
📌mode가 welcome이 될 수도 있고 read가 될 수도 있는데, welcome이 되면 if문 안에서 welcome에 해당하는 부분이 실행돼서 state의 title과 desc를 바꾸고 read가 되면 if문 안에서 read에 해당하는 부분의 state가 실행
[이벤트 설치]
📌클릭 이벤트: onClick={}
📌debugger: 크롬 개발자 도구를 켜 뒀을 때 코드의 debugger 라인에서 실행을 멈추고 Sources페이지로 이동하여 정보들을 쉽게 볼 수 있게 해 줌
📌코드를 실행하고 Sources 페이지로 가보면 debugger에서 실행을 멈춰있음
📌preventDefault(): 이벤트가 발생했을 때 기본적인 동작방법을 막음
📌App.js
import React, { Component } from 'react';
import TOC from "./components/TOC";
import Content from "./components/Content";
import Subject from "./components/Subject";
import Aside from "./components/Aside";
import './App.css';
class App extends Component {
constructor(props){
super(props);
this.state = {
mode:'read',
subject:{title:'WEB', sub:'World Wide Web!'},
welcome:{title:'Welcome', desc:'Hello, React!!'},
contents:[
{id:1, title:'HTML', desc:'HTML is for information'},
{id:2, title:'CSS', desc:'CSS is form design'},
{id:3, title:'JavaScript', desc:'HTML is for interactive'}
],
// explain:{title:'HTML', desc:'HTML is Hypertext Markup Language.'}
}
}
render() {
console.log('App render');
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">
{/* <Subject title={this.state.subject.title}
sub={this.state.subject.sub}>
</Subject> */}
<header>
<h1><a href="/" onClick={function(e){
console.log(e);
e.preventDefault();
debugger;
}}>{this.state.subject.title}</a></h1>
{this.state.subject.sub}
</header>
<TOC data={this.state.contents}></TOC>
<Content title={_title} desc={_desc}></Content>
{/* <Aside></Aside> */}
</div>
);
}
}
export default App;
[이벤트에서 state 변경하기]
📌이벤트를 설치할 때 state를 찾을 수 없다고 하면 bind(this)를 함수가 끝난 직후에 추가해주면 됨
📌this.state.mode = 'welcome'; 을 써서 welcome 모드를 불러오고 React에게 mode가 welcome으로 바뀌었다는 것을 알리기 위해서 setState를 사용
📌App.js
return (
<div className="App">
{/* <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.mode = 'welcome';
this.setState({
mode: 'welcome'
})
}.bind(this)}>{this.state.subject.title}</a></h1>
{this.state.subject.sub}
</header>
<TOC data={this.state.contents}></TOC>
<Content title={_title} desc={_desc}></Content>
{/* <Aside></Aside> */}
</div>
);