工作生活

React状态管理的详细解读

2019-07-05  本文已影响0人  stevekeol

1、React中的数据

站在组件的角度,React应用中流动的数据可以分为两种:

进一步说,propsstate的区别在于:props是外部传进来的;state是属于组件自身内部的。

2、函数组件

函数组件又称为"无状态组件",只负责接收props并返回UI。自身并不能拥有可改变的数据。

3、类组件

和函数组件相对应的,就是"类组件",也成为"有状态组件"/"容器组件"。
不同于函数组件,类组件拥有可以更改的内部数据statestate属性是一个对象,代表了组件的状态,对象的每一个属性名都代表组件的一个特定状态。

由于React把变化的数据封装在组件内部,并坚持单项数据流的原则。因此有了高度抽象的UI组件,并封装了复杂的业务逻辑。因此,可以构建、组合一系列小组件开发出大型应用。

//state在组件内部的使用方式
  constructor(props) {
    super(props);
    this.state = {
      visible: false,
      isFetching: false,
      isNew: true
    };
    this.onChange = this.onChange.bind(this);
  }

通过让组件管理自己的状态,任何时候状态的变更都会令React自动更新响应的页面部分。这便是React构建组件的优势之一:当页面需要重新渲染时,我们仅仅需要思考的是如何更改状态,不必跟踪页面的哪些部分需要更改,不需要决定如何有效的重新呈现页面。

3.1 state的修改

this.setState()有两种方式使用该api:

this.setState({
  name: 'stevekeol'
})
this.setState((prevState) => ({
  name: 'Mr.' + prevState.name
}))

疑问:直接修改state对象的属性不就可以了嘛,为何需要一个this.setState()?
解释:this.setState()的作用,不仅仅是对象属性值发生变化,还需要驱动整个UI进行重新渲染。

3.2深度解析this.setState
function updateName() {
  this.setState({FirstName: 'Morgan'});
  this.setState({LastName: 'Cheng'});
}
//相当于
function updateName() {
  this.setState({FirstName: 'Morgan', LastName: 'Cheng'});
}
function incrementMultiple() {
  this.setState({count: this.state.count + 1});
  this.setState({count: this.state.count + 1});
  this.setState({count: this.state.count + 1});
}
//相当于
function incrementMultiple() {
  const currentCount = this.state.count;
  this.setState({count: currentCount + 1});
  this.setState({count: currentCount + 1});
  this.setState({count: currentCount + 1});
}
//相当于
function incrementMultiple() {
  const currentCount = this.state.count;
  this.setState({count: currentCount + 1});
}

综上,this.setState并不会立即更新。由此带来的副作用,如何解决呢?

function increment(state, props) {
  return {count: state.count + 1};
}
function incrementMultiple() {
  this.setState(increment);
  this.setState(increment);
  this.setState(increment);
}
//这样多次调用函数式的setState,可以保证每次调用increment时,state都合并了之前状态修改的结果。

this.setState可以接收一个函数作为参数,该函数接收两个参数:当前的state,当前的props。该函数返回一个对象,代表对state所作的更改。注意,此时依赖的参数是state,而不是this.state

上一篇 下一篇

猜你喜欢

热点阅读