【React】State和props

124 阅读4分钟

state(状态)

React State(状态) - 菜鸟教程

概念

state是React组件的数据状态管理器,是一个组件的UI数据模型。

React里,如果需要重新渲染用户界面,只需要更新组件的state。

另外,React推荐组件的状态是不可变对象。一方面是因为不可变对象方便管理和调试;另一方面是出于性能考虑,当对象组件状态都是不可变对象时,我们在组件的shouldComponentUpdate方法中,仅需要比较状态的引用就可以判断状态是否真的改变,从而避免不必要的render调用。当我们使用React提供的PureComponent时,更是要保证组件状态是不可变对象,否则在组件的shouldComponentUpdate方法中,状态比较就可能出现错误,因为PureComponent执行的是浅比较(比较对象的引用)。

本质:state是组件对内的接口

使用

  • 初始化:参数所决定,而数据状态就是 state,一般
  • 修改:
    • 调用setState来改变。从而达到更新组件内部数据的作用,并且重新调用组件render方法。
      class Button extends React.Component {
        constructor() {
          super();
          this.state = {
            count: 0,
          };
        }
      
        updateCount() {
          this.setState((prevState, props) => {
            return { count: prevState.count + 1 };
          });
        }
      
        render() {
          return (
            <button onClick={() => this.updateCount()}>
              Clicked {this.state.count} times
            </button>
          );
        }
      }
      
    • setState是一个函数,可以接受两个参数。会在setState调用完成并且组件开始重新渲染时被调用,可以用来监听渲染是否完成
      this.setState(
        (prevState, props) => {
          return { count: prevState.count + 1 };
        },
        () => console.log("setState finished")
      );
      

    修改的注意点:

    • 不能直接修改state,直接修改state组件并不会重新触发render

    • state的更新是异步的。

      调用setState组件的state并不会立即改变,只是把要修改的状态放入一个队列中,React会优化真正的执行时机,并且React会处于性能原因,可能会将多次setState的状态修改合并成一次状态修改。所以不要依赖当期的state,计算下个State。

    • state的更新时一个浅合并(Shallow Merge)的过程

      当调用setState修改组件状态时,只需要传入发生改变的State,而不是组件完整的State,因为组件State的更新是一个浅合并(Shallow Merge)的过程。例如,一个组件的状态为:

      this.state = {
        title : 'React',
        content : 'React is an wonderful JS library!'
      }
      

      当只需要修改状态title时,只需要将修改后的title传给setState:

      this.setState({title: 'Reactjs'});
      

      React会合并新的title到原来的组件状态中,同时保留原有的状态content,合并后的State为:

      {
        title : 'Reactjs',
        content : 'React is an wonderful JS library!'
      }
      

props

React props - 菜鸟教程

概念

React的核心思想是组件化,页面会被拆分成一些独立的、可复用的组件。

组件从概念上看就是一个函数,可以接受一个参数作为输入值,这个参数就是props,所以可以把props理解为从外部传入组件内部的数据。

react 具有单向数据流的特性,所以props的主要作用是从父组件向子组件中传递数据

props 除了可以传字符串,数字,还可以传递对象,数组甚至是回调函数,如下:

class Welcome extends React.Component {
  render() {
    return <h1>Hello {this.props.name}</h1>;
  }
}

const element = <Welcome name="Sara" onNameChanged={this.handleName} />;

上述 name 属性与 onNameChanged 方法都能在子组件的 props 变量中访问

本质:props是组件对外的接口

注意点:

  • 不能依赖当前的props计算下个状态,因为Props一般是从父组件的state中获取的,依然无法确定在组件状态更新时的值。
  • 在子组件中,props 在内部不可变的。如果需要修改props,只能通过外部组件传入新的 props,否则子组件的props和展示形式不会改变

state和props的区别:

  • 相同的:
    • 两者都是JavaScript对象
    • 两者都是用于保存信息
    • props 和 state 都能触发渲染更新
  • 区别:
    • props是外部传递给组件的,而state是在组件内部被组价自己管理的,一般在constructor中初始化
    • props在组件内部是不可修改的,单state在组件内部可以进行修改
    • state是多变的、可以修改

参考: