注意:避免将 props 的值复制给 state!这是一个常见的错误:

constructor(props) {super(props);// 不要这样做this.state = { color: props.color };
}

如此做毫无必要(你可以直接使用 this.props.color),同时还产生了 bug(更新 prop 中的 color 时,并不会影响 state)。

只有在你刻意忽略 prop 更新的情况下使用。此时,应将 prop 重命名为 initialColor 或 defaultColor。必要时,你可以修改它的 key,以强制“重置”其内部 state。

直接复制 prop 到 state

最常见的误解就是 getDerivedStateFromProps 和 componentWillReceiveProps 只会在 props “改变”时才会调用。实际上只要父级重新渲染时,这两个生命周期函数就会重新调用,不管 props 有没有“变化”。所以,在这两个方法内直接复制(unconditionally)props 到 state 是不安全的。这样做会导致 state 后没有正确渲染。

重现一下这个问题。这个 EmailInput 组件复制 props 到 state:

class EmailInput extends Component {state = { email: this.props.email };render() {return <input onChange={this.handleChange} value={this.state.email} />;}handleChange = event => {this.setState({ email: event.target.value });};componentWillReceiveProps(nextProps) {// 这会覆盖所有组件内的 state 更新!// 不要这样做。this.setState({ email: nextProps.email });}
}

乍看之下还可以。。state 的初始值是 props 传来的,当在 input 里输入时,修改 state。但是如果父组件重新渲染,我们输入的所有东西都会丢失!(查看这个示例),即使在重置 state 前比较 nextProps.email !== this.state.email 仍然会导致更新。

注意:示例中使用了 componentWillReceiveProps ,使用 getDerivedStateFromProps 也是一样。

getDerivedStateFromProps 的存在只有一个目的:让组件在 props 变化时更新 state。比如 props 的 offset 变化时,修改当前的滚动方向和根据 props 变化加载外部数据。

class ExampleComponent extends React.Component {state = {externalData: null,};static getDerivedStateFromProps(props, state) {// 保存 prevId 在 state 中,以便我们在 props 变化时进行对比。// 清除之前加载的数据(这样我们就不会渲染旧的内容)。if (props.id !== state.prevId) {return {externalData: null,prevId: props.id,};}// 无需更新 statereturn null;}componentDidMount() {this._loadAsyncData(this.props.id);}componentDidUpdate(prevProps, prevState) {if (this.state.externalData === null) {this._loadAsyncData(this.props.id);}}componentWillUnmount() {if (this._asyncRequest) {this._asyncRequest.cancel();}}render() {if (this.state.externalData === null) {// 渲染加载状态 ...} else {// 渲染真实 UI ...}}_loadAsyncData(id) {this._asyncRequest = loadMyAsyncData(id).then(externalData => {this._asyncRequest = null;this.setState({externalData});});}
}

从 16.3 版本开始,当 props 变化时,建议使用新的 static getDerivedStateFromProps 生命周期更新 state。创建组件以及每次组件由于 props 或 state 的改变而重新渲染时都会调用该生命周期。

避免将 props 的值复制给 state!相关推荐

  1. vue打印props的值_vue中props传值方法

    vue中props传值方法 1.开发环境 vue 2.电脑系统 windows10专业版 3.在使用 vue开发的过程中,我们经常会使用 props进行组件的传值,下面是我的分享,希望对你有所帮助! ...

  2. 组件间数据交互——父组件向子组件传值( props属性值类型) 子组件向父组件传值-携带参数 || 非父子组件间传值

    父组件向子组件传值 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  3. C语言结构体值复制与字符数组值复制的比较测试

    结构体值复制与变量值复制看起来用法差不多,字符数组值复制才是比较特殊的,因为它的名字代表的是指针而不知直接指向内存 下面是各自值复制的代码 #include <stdio.h> #incl ...

  4. reactjs组件的三大属性之props基本使用及props属性值检验

    reactjs组件的三大属性之props基本使用及props属性值检验

  5. SQL Server 将一个表中字段的值复制到另一个表的字段中

    原文:SQL Server 将一个表中字段的值复制到另一个表的字段中 具体方法如下 一:update 表2 set (要插入的列名)= select 表1.某一列 from 表1 left jion ...

  6. 将对象的属性值复制到另一个对象中

    将对象的属性值复制到另一个对象中 /**** 将第一个对象的属性值复制到第二个对象中* @param <T> 第一个对象* @param <R> 第二个对象*/ class H ...

  7. 关于props的值,从哪来到哪去,什么时候要用到props。

    首先Vue中子组件中不应该有值,所有的值,都应该从父组件中获取.但是怎么取呢? 直接调用父组件的data?显然行不通,因为根本获取不到.所以props出现了,Vue中子组件需要父组件的值,通过prop ...

  8. java对象上有横线_对象bean间属性值复制:无视大小写和下划线_和横杠-

    1.简要说明:在java代码开发过程中,总会遇到实体类bean直接的属性复制问题,将一个bean中的值复制到另一个bean中,这时如果属性名是形同的,(仅仅有大小写或带下划线_或带横杠-)的区别,那就 ...

  9. vue中props传值给data时-props有值但data却是空的问题

    问题 设计vue组件时,常常有这样一个应用场景:父组件通过接口请求回来的数据传给子组件, 然后在子组件内部我们会用一个props来接收,并且将该props赋值给data里面的一个变量(便于我们后期对这 ...

最新文章

  1. 聊聊Service Mesh:linkerd
  2. 清华大学大数据研究中心“RONG”奖学金申请通知
  3. ubuntu 中安装memcache,并给出一个简单的实例·
  4. request和response对象如何解决中文乱码问题?
  5. 【GitHub】GitHub 的 Pull Request 和 GitLab 的 Merge Request 有区别吗?
  6. 软银领投Petuum 9300万美元融资,CMU邢波想让AI走进普通企业
  7. torch --用法
  8. 热门好用的邮编查询API
  9. 强化学习——A3C,GA3C
  10. win11取消右键菜单折叠恢复经典传统菜单模式方法解决
  11. 每日英语--Week10
  12. Essay Writing Guide
  13. 使用mysql数据库_wuli大世界_新浪博客
  14. 50岁的程序员该何去何从
  15. 食疗肠易激综合征 心脏神经官能症
  16. 智联招聘如何设置公司屏蔽
  17. 双目视觉集合框架详解
  18. PTA 习题5-2 使用函数求奇数和 (15分)
  19. python-文章相似度计算
  20. antd 设置表单校验触发时机

热门文章

  1. 让软件自己写软件,机器编程未来会取代程序员吗?
  2. 基于 OpenCV 的图像阴影去除,你会吗?
  3. 解析 PowerJob 的序列化方案
  4. 统信 UOS 适配支持百度飞桨 AI 深度学习平台;阿里回应“马云遭印度法院传唤”;fastjson 1.2.73 发布 | 极客头条
  5. 网易易盾升级内容安全体系 发布智能审核管理系统
  6. 直接拿来用!一文学会 Docker 镜像!
  7. 为什么雷军指责“华为不懂研发”?| 畅言
  8. 阿里云计算赶超 IBM;扎克伯格或遭逼宫;IntelliJ IDEA 新版支持 Java 11 | CSDN极客头条...
  9. 美团百度联合布局无人驾驶外卖;高通裁员千人;英特尔关闭可穿戴业务 | CSDN极客头条...
  10. 苹果发布最新版本系统,弥补iOS 11耗电快等问题