我正在寻找一种执行更高级比较的方法,而不是useEffect
React钩子的第二个参数。
具体地说,我正在寻找类似这样的东西:
useEffect(
() => doSomething(),
[myInstance],
(prev, curr) => { /* compare prev[0].value with curr[0].value */ }
);
请问我是否有从React文档中错过的任何东西,或者有什么方法可以在已经存在的东西之上实现这种钩子?
如果有一种方法可以实现,那就是它的工作方式:第二个参数是一个依赖项数组,就像来自React的useEffect
钩子一样,第三个是带有两个参数的回调:上一个渲染器中的依赖项数组 ,当前渲染器中的依赖项数组 。
答案 0 :(得分:2)
您可以使用React.memo函数:
const areEqual = (prevProps, nextProps) => {
return (prevProps.title === nextProps.title)
};
export default React.memo(Component, areEqual);
或为此使用自定义钩子
How to compare oldValues and newValues on React Hooks useEffect?
答案 1 :(得分:2)
在class based components
中很容易执行deep comparison
。 componentDidUpdate
提供了snapshot
和previous props
的{{1}}
previous state
问题是componentDidUpdate(prevProps, prevState, snapshot){
if(prevProps.foo !== props.foo){ /* ... */ }
}
并不完全像useEffect
。考虑以下
componentDidUpdate
当调用useEffect(() =>{
/* action() */
},[props])
时,您只能断言当前的props
是它已更改(浅比较断言为action()
)。您不能拥有false
的快照,因为prevProps
就像常规函数一样,没有生命周期的一部分(也没有实例)来确保同步性(并注入参数)。实际上,确保钩子值完整性的唯一方法是order of execution。
hooks
的替代方案
在更新之前,请检查值是否相等
usePrevious
在某些情况下,当您需要确保 const Component = props =>{
const [foo, setFoo] = useState('bar')
const updateFoo = val => foo === val ? null : setFoo(val)
}
仅运行一次(在用例中无用)时,这很有用。
effect
:
如果您想进行比较以防止不必要的useMemo
调用(render
),那么shoudComponentUpdate
是解决之道
useMemo
但是当您需要访问已经运行的效果中的export React.useMemo(Component, (prev, next) => true)
值时,就没有其他选择了。原因是如果您已经在previous
内部,则意味着它已经更新了useEffect
(当前渲染)。
为什么dependency
有效
usePrevious
不仅仅适用于useRef
,它是一种非常简单的方法,无需触发重新渲染即可获取refs
的值。因此循环如下
mutate
被安装Component
将初始值存储在usePrevious
中current
的更改触发props
内部的重新渲染Component
被称为useEffect
被称为请注意,usePrevious
总是在usePrevious
之后调用(请记住,顺序很重要!)。因此,每次您进入useEffect
时,useEffect
的{{1}}值始终会落后一个。
current