当前位置: 首页 > 知识库问答 >
问题:

如何比较React Hooks UseEffect上的oldValues和newValues?

端木昱
2023-03-14

假设我有3个输入:rate、sendAmount和receiveamount。我把这3个输入放在useEffect不同的参数上。这些规则是:

  • 如果sendAmount已更改,则计算ReceiveAmount=sendAmount*Rate
  • 如果receiveAmount已更改,则计算SendAmount=receiveAmount/Rate
  • 如果费率更改,则在发送金额>0时计算接收金额=发送金额*费率或在接收金额>0
  • 时计算 发送金额=接收金额/费率

下面是codesandbox https://codesandbox.io/s/pkl6vn7x6j来演示这个问题。

有没有一种方法可以比较oldvaluesnewvalues,就像在componentdidupdate上那样,而不是为这种情况创建3个处理程序?

谢谢

下面是我使用usePreviorhttps://codesandbox.io/S/30N01W2R06的最终解决方案

在这种情况下,我不能使用多个useEffect,因为每个更改都导致同一个网络调用。这就是为什么我还使用changeCount来跟踪更改的原因。此changeCount还有助于跟踪仅来自本地的更改,因此我可以防止由于服务器的更改而进行不必要的网络调用。

共有3个答案

陶唯
2023-03-14
const Component = (props) => {

  useEffect(() => {
    console.log("val1 has changed");
  }, [val1]);

  return <div>...</div>;
};

演示

将当前值与前一个值进行比较是一种常见的模式,并证明它自己的自定义钩子隐藏了实现细节。

const Component = (props) => {
  const hasVal1Changed = useHasChanged(val1)

  useEffect(() => {
    if (hasVal1Changed ) {
      console.log("val1 has changed");
    }
  });

  return <div>...</div>;
};

const useHasChanged= (val: any) => {
    const prevVal = usePrevious(val)
    return prevVal !== val
}

const usePrevious = (value) => {
    const ref = useRef();
    useEffect(() => {
      ref.current = value;
    });
    return ref.current;
}


演示

郎磊
2023-03-14

如果有人正在查找UsePrevious的打字版本:

.tsx模块中:

import { useEffect, useRef } from "react";

const usePrevious = <T extends unknown>(value: T): T | undefined => {
  const ref = useRef<T>();
  useEffect(() => {
    ref.current = value;
  });
  return ref.current;
};

或在.ts模块中:

import { useEffect, useRef } from "react";

const usePrevious = <T>(value: T): T | undefined => {
  const ref = useRef<T>();
  useEffect(() => {
    ref.current = value;
  });
  return ref.current;
};
洪涵亮
2023-03-14

您可以编写一个自定义钩子,使用useRef为您提供先前的道具

function usePrevious(value) {
  const ref = useRef();
  useEffect(() => {
    ref.current = value;
  });
  return ref.current;
}

然后在useeffect中使用它

const Component = (props) => {
    const {receiveAmount, sendAmount } = props
    const prevAmount = usePrevious({receiveAmount, sendAmount});
    useEffect(() => {
        if(prevAmount.receiveAmount !== receiveAmount) {

         // process here
        }
        if(prevAmount.sendAmount !== sendAmount) {

         // process here
        }
    }, [receiveAmount, sendAmount])
}

但是,如果对每个要分别处理的更改id分别使用两个useeffect,阅读和理解起来可能会更清楚、更清楚

 类似资料:
  • 问题内容: 假设我有3个输入:rate,sendAmount和receiveAmount。我把那3个输入放在useEffect diffing params上。规则是: 如果sendAmount更改,我计算 如果receiveAmount改变了,我计算 如果费率发生变化,我计算时间或计算时间 这是codesandbox https://codesandbox.io/s/pkl6vn7x6j来演示此

  • 问题内容: 我想从Python程序中访问R。我知道Rpy2,pyrserve和PypeR。 这三种选择的优缺点是什么? 问题答案: 我比其他人更了解这三个,但按问题中给出的顺序: rpy2: Python和R之间的C级接口(R作为嵌入式进程运行) 暴露给Python的R对象,无需复制数据 相反,Python的numpy数组可以暴露给R而无需创建副本 低级接口(靠近R C-API)和高级接口(为方便

  • 我试图在elasticsearch查询中使用无痛语言来比较小时数。我想问一下这样的问题: 但我有错误: 无法应用 [ 嵌套文档的方案是: (这些值的格式为“2:00”或“18:00”)。 我尝试过使用< code >。日期 或<代码>。value,但它不起作用,因为我的变量只包含小时而不是日期时间。 有人能帮帮我吗:)

  • 我想制作一个字符串的词汇排序列表,所以我使用了基本的SortedSet 并意识到SortedSet是一个抽象类,我必须在其中实现comapartor方法。所以我去谷歌搜索,发现treeSet更好,我可以使用它预定义的比较器方法。 当我去java文档时,我意识到TreeSet扩展了AbstractSet而不是SortedSet。问题1-有人能解释一下第二行是如何工作的吗(就像我没有概括Set一样,我

  • 我读到这些方法返回值的规则是,对于obj1.compareTo(ob2),例如,如果ob2在层次结构中位于ob1之下,则返回值为负值,如果它位于ob1之上,则返回值为正(如果它等于,则返回值为0)。然而,在我的类中,我看到了使用Math.signum在compareTo方法中获得-1(表示负值)和1(表示正值)的示例。 有什么原因吗? 编辑: 以下是我的意思:

  • 问题内容: 首先,我不是要在这里发动战争。我非常了解Jersey,但是很少使用httpclient。 jersey-client和Apache的httpclient之间的主要区别是什么?在哪些方面比另一方面更好?哪里有比较好的图表?较大的文件(例如2048 MB)中,哪一个效果更好? 非常感谢您的评论! 问题答案: 这两件事可能不应该直接比较。Jersey是REST客户端,具有完整的JAX-RS实