2 回答
TA贡献1799条经验 获得超9个赞
问题
Array::splice进行就地突变。
该方法通过移除或替换现有元素和/或就地
splice()
添加新元素来更改数组的内容。
这里的主要问题是状态突变。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
const test = ([], datas)
最终将状态引用保存data
到test
,然后由 进行变异test.splice(index, 1)
,然后奇怪的是被覆盖回不同的状态setData([{ test: datas }]);
。
解决方案
一种常见的模式是改用array::filter并在索引上进行过滤。filter
返回一个新数组。
const deleteItem = (index) => { setData(datas => datas.filter((_, i) => i !== index); }
TA贡献2003条经验 获得超2个赞
您的项目太复杂了:
您可以直接使用道具,而无需通过您的div.
const Item = ({ index, id, type, label, name, pieces, deleteItem }) => {
const useItem = () => {
console.log(type + " " + index + " " + pieces )
if(pieces <= 1){
deleteItem(index);
}
}
return(
<div data-index={id} onDoubleClick={useItem} className="inventory-item">
<img className="item-pic" src={chosedtype} ></img>
<div className="item-label">{label}</div>
<div className="item-number-pieces">{pieces}</div>
</div>
);
};
export default Item;
然后你的deleteItem功能不会做你想要的:
const deleteItem = (index) => {
const test = ([], datas); //test = datas;
test.splice(index, 1); // test = test without the item at the index
setData([{test : datas}]);//data = [{test: datas}] so an array with an object with the property test = datas (the original array).
}
您应该将您的更改deleteItem为:
const deleteItem = (index) => {
const newArray = datas.filter((item, i) => i !== index);
setData(newArray);
}
添加回答
举报