reactstate

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  }})

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容