static getDerivedStateFromProps
props变动后的回调,替代原来的componentWillReceiveProps
。
why static
因为不想要用户可以在这个方法里修改实例方法。
需要尽量避免该种方法的调用
如果涉及到state与props相关,切记不要每次props变化都将值同步到state去。
E.g. input框输入,既有默认展现值,用户也可以修改。
如果每次props变化都通过componentWillReceiveProps
或是getDerivedStateFromProps
将值同步到 state 去,组件里的值会非常轻易的被 props 的值覆盖。因为上述钩子在以下两个时机都会被触发:
- 父组件其他 prop 变动
- 父组件 rerender
所以尽量不要这么做。可以通过以下方式修改:
- 改成完全受控的组件
- 将相关运算放到
render
里来做,将原本的 state 变成 render 里的局域变量。 -
如果相关运算比较重,可借助官方推出的
memoize-one
记忆高阶函数。 -
依然是不受控组件
- 初始 props 值应该命名为
defaultValue
或是initValue
,类似 antd 里的设计。 - 需要明确
getDerivedStateFromProps
里 state 派生值进行修改的判断依据:- 关键 id 发生变化,相当于登录表单里若关键 id (email) 改变,pw框里的值也需重设为初始值。
- 暴露一个
forceReset
方法给父组件,由父组件调用。