class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false
}
}
render() {
return (
<div
className="btn"
onClick={()=>{this.setState({ clicked: !this.state.clicked })}}
>
{this.state.clicked ? '좋아요' : '싫어요'}
</div>
);
}
}
ReactDOM.render(
<Button />,
document.getElementById('root')
);
onClick={()=>{this.setState({ clicked: !this.state.clicked })}}
- click하면 this.setState() 함수가 state를 업데이트 한다. clicked라는 state를 수정한다.
- 처음에 false였던 state를 !this.state.clicked를 이용하여 현재 clicked의 반대로 true로 바꾼다. (true -> false / false -> true)
- onClick event가 달려있는 div를 클릭할 때 마다 clicked의 상태가 true나, false로 업데이트 된다.
{this.state.clicked ? '좋아요' : '싫어요'}
- clicked의 state가 true면 '좋아요', false면 '싫어요'를 보여 준다.
constructor() {
super();
this.state = {
clicked: false
}
}
class Button extends React.Component {
constructor() {
super();
this.state = {
clicked: false
}
}
render() {
return (
<div
className={`btn ${this.props.type === 'like' ? 'like-btn' : ''}`}
onClick={()=>{this.setState({ clicked: !this.state.clicked })}}
>
{this.state.clicked ? '좋아요' : '싫어요'}
</div>
);
}
}
ReactDOM.render(
<Button type="like" />,
document.getElementById('root')
);
constructor(){
super(); // 를 꼭 써줘야 한다.
}
함수 위치
handleChange=(e)=>{
consolelog(e.target.value);
}
render() {
return (
JSX
)
}
<input onChange = {함수} />
<input onChange={this.handleChange} />
<input onChange={this.handleChange()} /> ()
를 사용하면 Componenet가 실행 되면 바로 실행된다 그래서 () 사용하지 않는 것이다.
함수를 만들 때 항상 arrow 함수로 선언한다. arrow 함수를 사용하지 않으면 bind를 해줘야 하며, 직접 만든 함수가 아닌 react에서 제공하는 함수를 사용할 때는 arrow 함수 형태로 사용하지 않아도 된다.
e-> event(객체형태 / 여러 가지 정보를 담고 있다. target에 변화를 일으키는 것의 정보.
target의 value에 접급해야 input 태그에 무엇을 입력 했는지 알 수 있다.)
State 컴포넌트 상태를 유지하는 데이터 공간
(state는 객체 / constructor 안에서 불린다 / return 안에서 변하는 값을 보여주기 위해 사용 / state는 직접 변화를 주면 안된다.)
this.setState() => state에 변화를 준다 / () 안에 바꾸고 싶은 것만 넣어 준다.
비동기!!
state의 변화가 감지되면 다시 render 한다
onChange에서 변화가 일어날 때 마다 handleChange() => {} 이벤트 감지(정보를 가져 옴)
handle Change() => {
this.setState({
username : e.target.value
});
}