state状态state 是组件实例对象最重要的属性,必须是对象的形式
组件被称为状态机,通过更改 state 的值来达到更新页面显示(重新渲染组件)
组件 render 中的 this 指的是组件实例对象
组件自定义方法中的 this 为 undefined,怎么解决?
①将自定义函数改为表达式 + 箭头函数的形式(推荐)
②在构造器中用 bind()强制绑定 this状态数据不能直接赋值,需要用 setState()
setState()有同步有异步,基本上都是异步更新,自己定义的DOM事件里setState()是同步的同步
异步原理:看是否能命中 batchUpdate 机制,就是判断 isBatchingUpdates,true 为同步,false 为异步
class ListDemo extends React.component{ constructor(props){...}
render(){...}
increase = () =>{
// 开始:处于 batchUpdate
// isBatchingUpdates = true this.setState({ count : this.state.count + 1 })
// 结束
// isBatchingUpdates = false
}}
class ListDemo extends React.component{
constructor(props){...}
render(){...}
increase = () =>{
// 开始:处于 batchUpdate
// isBatchingUpdates = true
setTimeout(() => {
// 由于异步,所以此时 isBatchingUpdates 是 false
this.setState({ count : this.state.count + 1 }) })
// 结束
// isBatchingUpdates = false }}
能命中 batchUpdate 机制:生命周期(和它调用的函数)、React 中注册的事件(和它调用的函数),其实就是 React 可以“管理”的入口
不能命中 batchUpdate 机制:setTimeout/setInterval等(和它调用的函数)、自定义 DOM 事件(和它调用的函数),其实就是 React “管不到”的入口,因为不是在 React 中注册的
state 异步更新的话,更新前会被合并:setState()传入对象会被合并(类似于Object.assgin),传入函数不会被合并
// 传入对象会被合并,每次+1
this.setState({ count:this.state.count + 1})
this.setState({ count:this.state.count + 1})
this.setState({ count:this.state.count + 1})
// 传入函数不会被合并,每次+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 }})