state狀態(tài)state 是組件實(shí)例對象最重要的屬性,必須是對象的形式
組件被稱為狀態(tài)機(jī)泡孩,通過更改 state 的值來達(dá)到更新頁面顯示(重新渲染組件)
組件 render 中的 this 指的是組件實(shí)例對象
組件自定義方法中的 this 為 undefined赚瘦,怎么解決粟誓?
①將自定義函數(shù)改為表達(dá)式 + 箭頭函數(shù)的形式(推薦)
②在構(gòu)造器中用 bind()強(qiáng)制綁定 this狀態(tài)數(shù)據(jù)不能直接賦值,需要用 setState()
setState()有同步有異步起意,基本上都是異步更新鹰服,自己定義的DOM事件里setState()是同步的同步
異步原理:看是否能命中 batchUpdate 機(jī)制,就是判斷 isBatchingUpdates揽咕,true 為同步悲酷,false 為異步
class ListDemo extends React.component{? constructor(props){...}
render(){...}
increase = () =>{
// 開始:處于 batchUpdate
// isBatchingUpdates = true? ? this.setState({? ? ? count : this.state.count + 1? ? })
// 結(jié)束
// isBatchingUpdates = false
}}
class ListDemo extends React.component{
constructor(props){...}
render(){...}
increase = () =>{
// 開始:處于 batchUpdate
// isBatchingUpdates = true
setTimeout(() => {
// 由于異步,所以此時(shí) isBatchingUpdates 是 false
this.setState({? ? ? count : this.state.count + 1? ? })? })
// 結(jié)束
// isBatchingUpdates = false? }}
能命中 batchUpdate 機(jī)制:生命周期(和它調(diào)用的函數(shù))亲善、React 中注冊的事件(和它調(diào)用的函數(shù))设易,其實(shí)就是 React 可以“管理”的入口
不能命中 batchUpdate 機(jī)制:setTimeout/setInterval等(和它調(diào)用的函數(shù))、自定義 DOM 事件(和它調(diào)用的函數(shù))蛹头,其實(shí)就是 React “管不到”的入口顿肺,因?yàn)椴皇窃?React 中注冊的
state 異步更新的話,更新前會被合并:setState()傳入對象會被合并(類似于Object.assgin)渣蜗,傳入函數(shù)不會被合并
// 傳入對象會被合并挟冠,每次+1
this.setState({? count:this.state.count + 1})
this.setState({? count:this.state.count + 1})
this.setState({? count:this.state.count + 1})
// 傳入函數(shù)不會被合并,每次+3
this.setState((prevState,proprs) => {? return{? ? count:prevState.count + 1? }})
this.setState((prevState,proprs) => {? return{? ? count:prevState.count + 1? }})
this.setState((prevState,proprs) => {? return{? ? count:prevState.count + 1? }})