在React的useEffect

时间:2019-09-23 14:24:52

标签: reactjs react-hooks

我正在寻找一种执行更高级比较的方法,而不是useEffect React钩子的第二个参数。

具体地说,我正在寻找类似这样的东西:

useEffect(
  () => doSomething(), 
  [myInstance],
  (prev, curr) => { /* compare prev[0].value with curr[0].value */ }
);

请问我是否有从React文档中错过的任何东西,或者有什么方法可以在已经存在的东西之上实现这种钩子?

如果有一种方法可以实现,那就是它的工作方式:第二个参数是一个依赖项数组,就像来自React的useEffect钩子一样,第三个是带有两个参数的回调:上一个渲染器中的依赖项数组 ,当前渲染器中的依赖项数组

2 个答案:

答案 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 comparisoncomponentDidUpdate提供了snapshotprevious 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