仅当标签属性发生更改时,我才会尝试获得改进机的使用效果。只有在发生更改时,我才希望获取标签属性中的最新更改。我的代码如下:
const usePrevious = (value: any) => {
const ref = useRef()
useEffect(() => {
ref.current = value
}, value)
return ref.current
}
const prevLabels = usePrevious(labels)
useEffect(() => {
if (labels !== prevLabels) {
fetchUpdatedLabels()
}
}, [labels, prevLabels])
const fetchUpdatedLabels = async () => {
await axios
.get(`/events/${printEvent.id}`)
.then((response) => {
const newLabels = response.data.labels
// filter response to empty array if there are no splits left
// if is null return empty string
let fetchedLabels =
newLabels !== null
? newLabels
.toString()
.split(',')
.filter((label: string) => {
return label !== ''
}) || ''
: ''
getLabels(fetchedLabels)
print.updateEvent(printEvent.id, 'value', printEvent.value)
})
.catch((err) => {
console.error(err, 'cant fetch labels from api')
})
}
它不断地不停地重取,我如何做到这一点?
发布于 2022-10-10 19:27:05
这很可能是因为您正在使用等效运算符!==
将数组与数组进行比较。对于刚接触JS的人来说,这可能是令人惊讶的,但是如果您在JS控制台中这样做:
[1,2,3] === [1,2,3]
它返回false
。原因是数组是一个对象,你要问的是“左边的数组和右边的数组一样”--就像在同一个变量中一样。而这两个单独的数组实例恰好具有相同的内容。您可能想知道为什么它会在字符串和数字等上工作,但这是因为它们是原始值,而不是实例化的对象。奇怪的JS抓到你了。
There are several ways to compare an array。试试这个:
useEffect(() => {
if (labels.sort().join(',') !== prevLabels.sort().join(',')) {
fetchUpdatedLabels()
}
}, [labels, prevLabels])
在这里,我不确定您的用例,因为当标签不同时,您可以获取它们,但是它们更改的唯一方法是获取它们?代码中还有什么东西可以改变标签吗?如果是这样的话,一旦他们改变了,他们不会马上被服务器上的人消灭吗?
我想这里还有别的地方不对劲。你在哪里设置标签进入状态?
https://stackoverflow.com/questions/74019726
复制相似问题