假设我有3个输入:rate、sendAmount和receiveamount。我把这3个输入放在useEffect不同的参数上。这些规则是:
ReceiveAmount=sendAmount*Rate
SendAmount=receiveAmount/Rate
发送金额>0
时计算接收金额=发送金额*费率
或在接收金额>0
发送金额=接收金额/费率
下面是codesandbox https://codesandbox.io/s/pkl6vn7x6j来演示这个问题。
有没有一种方法可以比较oldvalues
和newvalues
,就像在componentdidupdate
上那样,而不是为这种情况创建3个处理程序?
谢谢
下面是我使用usePrevior
https://codesandbox.io/S/30N01W2R06的最终解决方案
在这种情况下,我不能使用多个useEffect
,因为每个更改都导致同一个网络调用。这就是为什么我还使用changeCount
来跟踪更改的原因。此changeCount
还有助于跟踪仅来自本地的更改,因此我可以防止由于服务器的更改而进行不必要的网络调用。
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;
}
演示
如果有人正在查找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;
};
您可以编写一个自定义钩子,使用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实