(不好意思)
嗨,这段代码一半工作一半。我可以删除产品,但我必须去另一个页面,并返回,以呈现。我不知道为什么?
代码:父组件:
function ShoppingCard() {
const shoppingCard = useContext<any>(ShoppingCardContext);
const [shoppingCard2, setShoppingCard2] = useState<any>(shoppingCard);
useEffect(() => {
setShoppingCard2(shoppingCard);
}, [shoppingCard, shoppingCard2]);
const removeProduct = (shopCart: any) => {
let index = shoppingCard.findIndex(
(oneProduct: any) => oneProduct.idProduct === shopCart.idProduct
);
shoppingCard.splice(index, 1);
setShoppingCard2(shoppingCard);
};
//将这个函数传递给下一个组件通过下一个组件。
Parent component 1
child component 2
child Component 3
我在按钮中使用这个函数来删除元素。在控制台中,我看到shoppingCard和shoppingCard2被更新,但只在子3中更新。为了看到效果(渲染),我必须切换到另一个页面,然后返回。在app中,我使用React-Router。
p。这是我的第一篇文章
Issue
当从shoppingCard2
数组中删除时,您正在改变状态,然后从未创建新的数组引用,以便协调工作。换句话说,React不"看到"。shoppingCard2
数组为new数组,这样它就不会触发渲染。当导航离开并返回页面时,您会看到这种变化。
const removeProduct = (shopCart: any) => {
let index = shoppingCard.findIndex(
(oneProduct: any) => oneProduct.idProduct === shopCart.idProduct
);
shoppingCard.splice(index, 1); // <-- mutation!!
setShoppingCard2(shoppingCard); // <-- same array reference
};
<标题>解决方案浅层复制shoppingCard2
数组并移除元素。使用Array.prototype.filter
来完成此操作。
的例子:
const removeProduct = (shopCart: any) => {
setShoppingCard2(shoppingCard => shoppingCard.filter(
(oneProduct: any) => oneProduct.idProduct !== shopCart.idProduct
));
};
建议一个改进是从ShoppingCardContext
公开一个状态更新函数,这样它就可以维护状态不变,而不是将其卸载给消费者。真的没有理由"重复"。如有需要,请在当地说明购物卡状态。
最好是使用全局状态。你可以阅读更多关于
<<ul>