React 正确地使用 State(状态)
2018-03-13 10:03
666 查看
关于 setState() 有三件事是你应该知道的。
用 setState() 代替:
唯一可以分配 this.state 的地方是构造函数
因为 this.props 和 this.state 可能是异步更新的,你不能依赖他们的值计算下一个state(状态)。
例如, 以下代码可能导致 counter(计数器)更新失败:
要解决这个问题,应该使用第 2 种 setState() 的格式,它接收一个函数,而不是一个对象。该函数接收前一个状态值作为第 1 个参数, 并将更新后的值作为第 21个参数:
要弥补这个问题,使用另一种 setState() 的形式,它接受一个函数而不是一个对象。这个函数将接收前一个状态作为第一个参数,应用更新时的 props 作为第二个参数:
我们在上面使用了一个箭头函数,但是也可以使用一个常规的函数:
例如,你的状态可能包含几个独立的变量:
然后通过调用独立的 setState() 调用分别更新它们:
合并是浅合并,所以 this.setState({comments}) 不会改变 this.state.posts 的值,但会完全替换this.state.comments 的值。
这就是 state(状态) 经常被称为 本地状态 或 封装状态的原因。 它不能被拥有并设置它的组件 以外的任何组件访问。
一个组件可以选择将 state(状态) 向下传递,作为其子组件的 props(属性):
http://www.css88.com/react/docs/state-and-lifecycle.html
不要直接修改 state(状态)
例如,这样将不会重新渲染一个组件:// 错误 this.state.comment = 'Hello';
用 setState() 代替:
// 正确 this.setState({comment: 'Hello'});
唯一可以分配 this.state 的地方是构造函数
state(状态) 更新可能是异步的
React 为了优化性能,有可能会将多个 setState() 调用合并为一次更新。因为 this.props 和 this.state 可能是异步更新的,你不能依赖他们的值计算下一个state(状态)。
例如, 以下代码可能导致 counter(计数器)更新失败:
// 错误 this.setState({ counter: this.state.counter + this.props.increment, });
要解决这个问题,应该使用第 2 种 setState() 的格式,它接收一个函数,而不是一个对象。该函数接收前一个状态值作为第 1 个参数, 并将更新后的值作为第 21个参数:
要弥补这个问题,使用另一种 setState() 的形式,它接受一个函数而不是一个对象。这个函数将接收前一个状态作为第一个参数,应用更新时的 props 作为第二个参数:
// 正确 this.setState((prevState, props) => ({ counter: prevState.counter + props.increment }));
我们在上面使用了一个箭头函数,但是也可以使用一个常规的函数:
// 正确 this.setState(function(prevState, props) { return { counter: prevState.counter + props.increment }; });
state(状态)更新会被合并
当你调用 setState(), React 将合并你提供的对象到当前的状态中。例如,你的状态可能包含几个独立的变量:
constructor(props) { super(props); this.state = { posts: [], comments: [] }; }
然后通过调用独立的 setState() 调用分别更新它们:
componentDidMount() { fetchPosts().then(response => { this.setState({ posts: response.posts }); }); fetchComments().then(response => { this.setState({ comments: response.comments }); }); }
合并是浅合并,所以 this.setState({comments}) 不会改变 this.state.posts 的值,但会完全替换this.state.comments 的值。
数据向下流动
无论作为父组件还是子组件,它都无法获悉一个组件是否有状态,同时也不需要关心另一个组件是定义为函数组件还是类组件。这就是 state(状态) 经常被称为 本地状态 或 封装状态的原因。 它不能被拥有并设置它的组件 以外的任何组件访问。
一个组件可以选择将 state(状态) 向下传递,作为其子组件的 props(属性):
http://www.css88.com/react/docs/state-and-lifecycle.html
相关文章推荐
- react(三)组件内部状态state使用方式
- React-Native - 使用AppState获取App运行状态(以及监听状态改变事件)
- React-Native 基础(三) 使用State改变状态
- React Native开发】React Native 基础之Props(属性)与State(状态)使用讲解
- React第三方组件2(状态管理之Refast的使用②异步修改state)
- 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。
- Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>\<system.web>\<httpModules> 节中包括..
- React Native 之 State(状态)
- react学习笔记--- 状态(state)
- React Native 学习笔记四(关于state的使用)
- 混合开发的大趋势之一React Native State (状态),Style(样式)
- React.js 基础入门三 ---组件状态state
- IOS UIPanGestureRecognizer手势使用及识别状态UIGestureRecognizerState
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括..
- 正确使用react的refs/props/state及其它
- 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态等错误解决方法(原)
- [置顶] React 项目中使用 MobX 进行状态管理
- 使用InternetGetConnectedState判断本地网络状态(C#举例)
- 夺命雷公狗-----React---7--组建的状态props和state