1 回答
TA贡献1784条经验 获得超9个赞
state返回的内容[state, setState] = useState([])是您应该只阅读的内容。如果你修改它,React 不会知道数据已经改变并且需要重新渲染。当您需要修改数据时,您必须使用setState, 或在您的情况下使用setSelectedCharacters.
此外,如果稍后在其他地方读取数组,则通过引用修改数据可能会导致不可预测的结果。
除此之外,如果你给 相同的值setState,那个钩子返回给你state,React 将完全跳过更新。使用数字或字符串时这不是问题,但是当您使用数组时它会变成一个问题,因为引用(React 用来判断是否存在差异的值)可能是相同的,而内容可能已经改变。所以你必须将一个新数组传递给setState.
考虑到这一点,您的onChange函数可能如下所示:
onChange={e => {
const index = selectedCharacters.indexOf(
e.target.value
);
if (index === -1) {
// creating a new array with [], so the original one stays intact
setSelectedCharacters([...selectedCharacters, e.target.value]);
} else {
// Array.filter also creates new array
setSelectedCharacters(selectedCharacters.filter((char, i) => i !== index));
}
}}
文档在这里https://en.reactjs.org/docs/hooks-reference.html#usestate
添加回答
举报