<본 사진은 state와 관련이 1정도 있습니다>
state를 update할때 어떻게 해야 안전하면서 효율적으로 업뎃이 가능한지 배웠다.
setState할때 state가 바뀐 컴포넌트만 리랜더링 된다. 그리고 리랜더링 될때 state가 적용되는 부분만 국소적으로 리랜더링 된다.
this.setState({ score: this.state.score + 1 });
this.setState({ score: this.state.score + 1 });
this.setState({ score: this.state.score + 1 });
// 그럼 리액트는 자동적으로 마지막것이 가장 최신이며 최종 결과물이라 생각하고 마지막 setState만 비동기 실행을 할 것이다. 그래서 요런 경우는 obj가 아닌 callBack 함수를 넘겨준다.
this.setState(curState => ({ score: curState.score + 1 }));
하지만 아래것이 나중에 테스팅할때 더 좋은 포맷이다. 따로 함수로 빼뒀다가 pass하는게 좋다.
increamentByOne(curSt) {
return {score:curSt.score+1}
}
this.setState(this.increamentByOne);
그리고 state 업데이트 할때 state안에 있는 값을 직접적으로 alter하려 하지 말고 copy를 만든다음 업데이트 해라.
변경될 필요가 없는 변수는 state에 저장하지 말것. state는 최대한 간결한게 좋다.
inline으로 스타일을 변경하고 싶을때는 jsx element에 style attribute를 추가하고 obj를 pass 해주면 된다.
const divStyle = {
color: 'blue',
backgroundImage: 'url(' + imgUrl + ')',
};
function HelloWorldComponent() {
return <div style={divStyle}>Hello World!</div>;
}
const coins = [
{ side: 'heads', imgSrc: 'https://www' },
{ side: 'tails', imgSrc: 'https://www' },
];
&&
나 ternary operator를 사용해서 깔끔하게 로직을 처리하자this.setState(st => {
return {
...,
nHeads:st.nHeads + (newCoin.side === 'heads' ? 1 : 0),
nTails:st.nTails + (newCoin.side === 'tails' ? 1 : 0)
}
})
{this.state.sides && <Coin />}
기존에 state에 저장되었던것과 다른 색깔이 나올때 까지 반복하다가 다른색깔이 나오면 setState하기!
let newColor;
do {
newColor = choice(this.props.allColors);
} while (this.state.color === newColor);
this.setState({ color: newColor });
bind는 즉시 하지 않고 constructor에 하는게 안전하다
// bad
<div className="blah" onMouseEnter={this.mouseHandle.bind(this)} />
부모 setState가 실행되고 자식 setState가 실행될시 자식스테이트에서 rendering이 일어나지 않는다. 부모의 setState가 실행되면 당연히 자식이 랜더링 될것이기 때문에 두번 랜더링하지않고 말그대로 state만 바꾸는 것인가?
그리고 이때 업데이트된 todos를 가지고 Todo 컴포넌트를 부모에서 다시 랜더링해서 DOM을 구성할텐데 그때 특정 자식 컴포넌트의 이전 state가 날라가지 않고 그대로 남아있는가?