【前端学习笔记】React的state和生命周期

参考自:http://react.html.cn/docs/state-and-lifecycle.html
生命周期图

React的生命周期:

  • 挂载时 componentDidMount() 钩子在组件输出被渲染到 DOM 之后运行。 适合代码:适合 AJAX 请求

  • 卸载前 componentWillUnmount() 钩子在组件卸载之前立即调用。 适合代码:清理监听器

  • 获取对象信息更新组件 getDeriveStateFromProps(nextProps, prevProps) 从此函数返回的对象。适合代码:

正确使用state

1,不要直接修改state状态,唯一可以修改的地方是构造函数。
应该使用setState()修改state状态。
2,state状态更新可能是异步的
因为this.props和this.state可能是异步更新的,此时应该使用setState的第二个形式。
接收一个函数,而不是一个对象。
该函数接收前一个状态值作为第 1 个参数, 并将更新后的值作为第 2 个参数:

// 正确
this.setState((state, props) => ({
  counter: state.counter + props.increment
}));

3,state状态更新会被合并
当你调用 setState(), React 将合并你提供的对象到当前的状态中。

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(属性)

<h2>It is {this.state.date.toLocaleTimeString()}.</h2>

同样适用于用户定义组件:

<FormattedDate date={this.state.date} />

FormattedDate 组件通过 props(属性) 接收了 date 的值,但它仍然不能获知该值是来自于 Clock的 state(状态) ,还是 Clock 的 props(属性),或者是直接手动创建的:

function FormattedDate(props) {
  return <h2>It is {props.date.toLocaleTimeString()}.</h2>;
}

这通常称为一个**“从上到下”,或者“单向”**的数据流。
任何 state(状态) 始终由某个特定组件所有,并且从该 state(状态) 导出的任何数据 或 UI 只能影响树中 “下方” 的组件。

如果把组件树想像为 props(属性) 的瀑布,所有组件的 state(状态) 就如同一个额外的水源汇入主流,且只能随着主流的方向向下流动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值