原则上保守使用派生state
派生state的使用场景
1、直接复制 prop 到 state,或者一个props的计算值到state;
直接复制 prop 到 state 是一个非常糟糕的想法
2、在 props 变化后修改 state
一、受控组件
1、不要直接复制 props 的值到 state 中,而是去实现一个受控的组件,然后在父组件里合并两个值,子组件state重置,通过父组件手动修改state为默认值
二、非受控组件
1、如果是组件自己存储临时的state:组件实例化时props中的值作为默认值复制给state,之后state的修改与props再无关系。
如果想要props.ID修改时,需要重置 state
1、使用key,如果没有合适ID,可以随机或者用自增的key(推荐使用)
2、如果key不起作用(可能是组件初始化的开销太大或者找不到合适的key)
方案1:用 prop 的 ID 重置非受控组件。static getDerivedStateFromProps中,根据props.ID的变化重置state(麻烦但实用)
方案2:使用实例方法重置非受控组件,父级组件可以使用 ref 调用这个方法.
谨慎使用,会导致两次而不是一次渲染,props改变渲染一次、调用实例方法渲染一次(不推荐)
三、只是为了缓存(memoize)基于当前 props 计算后的结果,使用memoize-one