Skip to content

static getDerivedStateFromProps

props变动后的回调,替代原来的componentWillReceiveProps

why static

因为不想要用户可以在这个方法里修改实例方法。

需要尽量避免该种方法的调用

如果涉及到state与props相关,切记不要每次props变化都将值同步到state去。

E.g. input框输入,既有默认展现值,用户也可以修改。

如果每次props变化都通过componentWillReceiveProps或是getDerivedStateFromProps将值同步到 state 去,组件里的值会非常轻易的被 props 的值覆盖。因为上述钩子在以下两个时机都会被触发:

  1. 父组件其他 prop 变动
  2. 父组件 rerender

所以尽量不要这么做。可以通过以下方式修改:

  • 改成完全受控的组件
  • 将相关运算放到 render 里来做,将原本的 state 变成 render 里的局域变量。
  • 如果相关运算比较重,可借助官方推出的 memoize-one 记忆高阶函数。

  • 依然是不受控组件

  • 初始 props 值应该命名为 defaultValue 或是 initValue,类似 antd 里的设计。
  • 需要明确 getDerivedStateFromProps里 state 派生值进行修改的判断依据:
    • 关键 id 发生变化,相当于登录表单里若关键 id (email) 改变,pw框里的值也需重设为初始值。
    • 暴露一个 forceReset 方法给父组件,由父组件调用。

Ref

react 文档