2 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
問(wèn)題
Array::splice進(jìn)行就地突變。
該方法通過(guò)移除或替換現(xiàn)有元素和/或就地
splice()
添加新元素來(lái)更改數(shù)組的內(nèi)容。
這里的主要問(wèn)題是狀態(tài)突變。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
const test = ([], datas)
最終將狀態(tài)引用保存data
到test
,然后由 進(jìn)行變異test.splice(index, 1)
,然后奇怪的是被覆蓋回不同的狀態(tài)setData([{ test: datas }]);
。
解決方案
一種常見(jiàn)的模式是改用array::filter并在索引上進(jìn)行過(guò)濾。filter
返回一個(gè)新數(shù)組。
const deleteItem = (index) => { setData(datas => datas.filter((_, i) => i !== index); }

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
您的項(xiàng)目太復(fù)雜了:
您可以直接使用道具,而無(wú)需通過(guò)您的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功能不會(huì)做你想要的:
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).
}
您應(yīng)該將您的更改deleteItem為:
const deleteItem = (index) => {
const newArray = datas.filter((item, i) => i !== index);
setData(newArray);
}
添加回答
舉報(bào)