이번에는 React에서 setState를 사용하는 방법에 대해 자세히 설명하겠습니다. React에서 setState를 사용할 때 주의사항은 무엇인가요?
class Example extends Component { contructor () { super() this.state = { value: 0, index: 0 } } componentDidMount () { this.setState({value: this.state.value + 1}) console.log(this.state.value) // 第一次输出 this.setState({value: this.state.value + 1}) console.log(this.state.value) // 第二次输出 setTimeout(() => { this.setState({value: this.state.value + 1}) console.log(this.state.value) // 第三次输出 this.setState({value: this.state.value + 1}) console.log(this.state.value) // 第四次输出 }, 0); this.refs.button.addEventListener('click', this.click) } click = () => { this.setState({value: this.state.index + 1}) this.setState({value: this.state.index + 1}) } render () { return ( <p><span>value: {this.state.value}index: {this.props.index}</span> <button ref="button" onClick={this.click}>点击</button> </p> ) } }
상식에 따르면 이 네 가지 출력은 1, 2, 3, 4입니다. 그러나 실제 출력은 0, 0, 2, 3입니다.
setState는 React 구성 요소의 상태 값을 즉시 변경하지 않습니다(즉, setState는 비동기 업데이트입니다)
setState 통과 대기열 메커니즘은 상태 업데이트를 구현합니다.
setState가 실행되면 업데이트해야 하는 상태가 즉시 업데이트되는 대신 병합되어 상태 대기열에 저장됩니다.
이를 통해 상태에서 직접 수정한 값은 상태 큐에 추가되지 않습니다. 다음에 setState를 호출하고 상태 큐를 병합하면 이전에 직접 수정된 상태가 무시됩니다.
this.setState({name: 'Pororo'}) this.setState({age: 20})
this.setState({name: 'Pororo',age: 20})
효과 위의 두 코드 블록은 동일합니다. 각 호출이 수명 주기 업데이트를 트리거하면 성능이 매우 높아집니다. 따라서 React는 여러 this.setState에 의해 생성된 수정 사항을 대기열에 넣고 거의 동일하면 수명 주기 업데이트를 트리거합니다.
문제 분석
처음 두 setState의 경우:
this.setState({value: this.state.val + 1}); console.log(this.state.value); // 第一次输出 this.setState({value: this.state.val + 1}); console.log(this.state.value); // 第二次输出
그래서 React에서 설정한 setState 함수를 통해 this.state를 변경해야 재렌더링이 발생합니다. settimeout의 두 세트 스테이트 :
setTimeout(() => { this.setState({value: this.state.value + 1}) console.log(this.state.value) // 第三次输出 this.setState({value: this.state.value + 1}) console.log(this.state.value) // 第四次输出 }, 0);
this.state.value=this.state.value+1;
isBatchingUpdates의 기본값은 false입니다. 이는 setState가 this.state를 동기식으로 업데이트한다는 의미입니다.
但是,当React在调用事件处理函数之前就会调用batchedUpdates,这个函数会把isBatchingUpdates修改为true,造成的后果就是由React控制的事件处理过程setState不会同步更新this.state。
如果this.setState的参数不是一个对象而是一个函数时,这个函数会接收到两个参数,第一个是当前的state值,第二个是当前的props,这个函数应该返回一个对象,这个对象代表想要对this.state的更改;
换句话说,之前你想给this.setState传递什么对象参数,在这种函数里就返回什么对象。不过,计算这个对象的方法有些改变,不再依赖于this.state,而是依赖于输入参数state。
function increment(state, props) { return {count: state.count + 1}; } function incrementMultiple() { this.setState(increment); this.setState(increment); this.setState(increment); }
假如当前this.state.count的值是0,第一次调用this.setState(increment),传给increment的state参数是0,第二调用时,state参数是1,第三次调用是,参数是2,最终incrementMultiple让this.state.count变成了3。
对于多次调用函数式setState的情况,React会保证调用每次increment时,state都已经合并了之前的状态修改结果。
要注意的是,在increment函数被调用时,this.state并没有被改变,依然,要等到render函数被重新执行时(或者shouldComponentUpdate函数返回false之后)才被改变。
function incrementMultiple() { this.setState(increment); this.setState(increment); this.setState({count: this.state.count + 1}); this.setState(increment); }
在几个函数式setState调用中插入一个传统式setState调用,最后得到的结果是让this.state.count增加了2,而不是增加4。
这是因为React会依次合并所有setState产生的效果,虽然前两个函数式setState调用产生的效果是count加2,但是中间出现一个传统式setState调用,一下子强行把积攒的效果清空,用count加1取代。
所以,传统式setState与函数式setState一定不要混用。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
EasyCanvas绘图库在Pixeler项目开发中使用实战总结
위 내용은 React에서 setState 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!