使用 useState 挂钩将项目添加到存储在 React 状态的数组中的正确方法?
Correct way to add items to an array stored in React state with useState hook?
我需要将项目连接到存储在 React 组件状态中的数组。我有一个关于 stackblitz 的例子,我无法理解为什么数组没有增长,因为我使用扩展运算符添加元素以连接到现有数组。任何帮助表示赞赏
link: https://stackblitz.com/edit/react-usestate-example-ebzt6g?file=index.js
import React from 'react';
import { useState, useEffect } from 'react';
import { render } from 'react-dom';
import './style.css';
const App = () => {
const [name, setName] = useState('React');
const [coords, setCoords] = useState([]);
const success = (position) => {
// setCoords(coords.concat(position.coords))
setCoords([
...coords,
position.coords
])
console.log("success! position=", position);
}
useEffect(() => {
console.log("useEffect -> coords =", coords);
});
useEffect(() => {
setInterval(() => {
success({coords : {latitude: Math.random()*51, longitude: Math.random()*2.6}});
}, 5000);
}, []);
return (
<p>example to demonstrate growing an array stored with React usestate hook</p>
)
}
render(<App />, document.getElementById('root'));
useEffect(() => {
setInterval(() => {
success({coords : {latitude: Math.random()*51, longitude: Math.random()*2.6}});
}, 5000);
}, []);
作为第二个参数的空数组告诉反应只创建一次这个效果,并且永远不会更新它。创建时,它在其闭包中引用了成功函数,而该成功函数又引用了 coords
。由于这全部来自第一次渲染,coords
是一个空数组。
所以每次调用 success
时,您都会将新坐标添加到该空数组并调用 setCoords。该数组永远不会增长,因为您的起点始终是空数组。而且您永远不会看到新阵列,因为它们只存在于以后的渲染中。
最简单的解决方法是使用 setCoords 的函数版本。 React 会调用该函数并传入最新的 coords
值
const success = (position) => {
setCoords(prevCoords => {
return [
...prevCoords,
position.coords
]
})
}
好吧,我遇到了那个问题,感谢帮助我弄清楚如何解决这个问题的人,首先你必须克隆坐标,然后将新坐标添加到克隆中,然后设置新坐标像这样克隆坐标到状态:
const success = (position) => {
let clonedCoords = [...coords];
setCoords([...clonesCoords, position.coords]);
console.log("success! position=", position);
};
这应该可以,如果不行你可以回复,这样我可以帮助你更多
感谢 Nicholas Tower 的正确答案。
const success = (position) => {
setCoords(prevCoords => {
return [
...prevCoords,
position.coords
]
})
}
修复了问题。
我需要将项目连接到存储在 React 组件状态中的数组。我有一个关于 stackblitz 的例子,我无法理解为什么数组没有增长,因为我使用扩展运算符添加元素以连接到现有数组。任何帮助表示赞赏
link: https://stackblitz.com/edit/react-usestate-example-ebzt6g?file=index.js
import React from 'react';
import { useState, useEffect } from 'react';
import { render } from 'react-dom';
import './style.css';
const App = () => {
const [name, setName] = useState('React');
const [coords, setCoords] = useState([]);
const success = (position) => {
// setCoords(coords.concat(position.coords))
setCoords([
...coords,
position.coords
])
console.log("success! position=", position);
}
useEffect(() => {
console.log("useEffect -> coords =", coords);
});
useEffect(() => {
setInterval(() => {
success({coords : {latitude: Math.random()*51, longitude: Math.random()*2.6}});
}, 5000);
}, []);
return (
<p>example to demonstrate growing an array stored with React usestate hook</p>
)
}
render(<App />, document.getElementById('root'));
useEffect(() => {
setInterval(() => {
success({coords : {latitude: Math.random()*51, longitude: Math.random()*2.6}});
}, 5000);
}, []);
作为第二个参数的空数组告诉反应只创建一次这个效果,并且永远不会更新它。创建时,它在其闭包中引用了成功函数,而该成功函数又引用了 coords
。由于这全部来自第一次渲染,coords
是一个空数组。
所以每次调用 success
时,您都会将新坐标添加到该空数组并调用 setCoords。该数组永远不会增长,因为您的起点始终是空数组。而且您永远不会看到新阵列,因为它们只存在于以后的渲染中。
最简单的解决方法是使用 setCoords 的函数版本。 React 会调用该函数并传入最新的 coords
值const success = (position) => {
setCoords(prevCoords => {
return [
...prevCoords,
position.coords
]
})
}
好吧,我遇到了那个问题,感谢帮助我弄清楚如何解决这个问题的人,首先你必须克隆坐标,然后将新坐标添加到克隆中,然后设置新坐标像这样克隆坐标到状态:
const success = (position) => {
let clonedCoords = [...coords];
setCoords([...clonesCoords, position.coords]);
console.log("success! position=", position);
};
这应该可以,如果不行你可以回复,这样我可以帮助你更多
感谢 Nicholas Tower 的正确答案。
const success = (position) => {
setCoords(prevCoords => {
return [
...prevCoords,
position.coords
]
})
}
修复了问题。