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,所以可以把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是多变的、可以修改
- props是外部传递给组件的,而state是在组件内部被组价自己管理的,一般在
参考: