javascript - 过滤器未返回新数组
问题描述
我正在使用 React 并使用过滤器数组将返回数组的值与原始数组进行比较。但是,不返回过滤后的数组。这是我的代码:
const removeFromCart = id => {
const filteredCart = cart.filter(product => product.id !== id)
setCart(filteredCart)
如果我在 setCart 设置的购物车变量上使用 console.log,则会显示新的过滤数组。如果我在filteredCart 上使用console.log,则会显示一个空数组。过滤后的数组还显示 !== 是否更改为 ==。
当通过 id 搜索产品以更新属性时,将返回一个空数组。这是代码:
const addToCart = (id, name, price) => {
let inCart = cart.filter(product => product.id === id)
...
}
我知道过滤器函数返回通过测试的元素,因此对于第二个代码块,应该返回具有相同 id 值的对象而不是空数组。
解决方案
如果对象中的 id 是整数,则需要将传递给函数的字符串 id 强制转换为整数。
如果要在状态更新后记录状态,则需要使用并作为依赖项
useEffect
传入,因为排队状态函数是异步处理的。cart
const { useEffect, useState } = React;
function Example({ data }) {
const [ cart, setCart ] = useState(data);
function removeFromCart(e) {
const { id } = e.target.dataset;
const filteredCart = cart.filter(product => product.id !== +id);
console.log(filteredCart)
setCart(filteredCart);
}
useEffect(() => {
console.log(JSON.stringify(cart));
}, [cart]);
return (
<div>
{cart.map(obj => {
return (
<div>
<div>{obj.name}
<span
className="remove"
data-id={obj.id}
onClick={removeFromCart}
>[Remove]
</span>
</div>
</div>
);
})}
</div>
);
};
const data = [
{ id: 1, name: 'Cheese' },
{ id: 2, name: 'Bread' },
{ id: 3, name: 'Jam' }
];
ReactDOM.render(
<Example data={data} />,
document.getElementById("react")
);
.remove { cursor: pointer; }
.remove:hover { font-weight: bold; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="react"></div>
推荐阅读
- css - 手机中的容器尺寸错误
- c++ - 我需要用 nullptr 初始化吗?
- ruby - 如何在 Ruby 的模块中定义类级宏?
- scala - FS2:如何从 fs2.Stream 获取 java.io.InputStream?
- python - 将变量从 Python Flask 发送到 HTML
- xml - 网格视图错位删除网格视图与其他元素之间的空间
- r - 重新构造 dist.Multivariate.Normal rmvn(n,mu,V) 函数
- spring-boot - Spring 不会在 JAX-RS 定义的子资源中注入依赖项
- microsoft-graph-api - 我们如何以编程方式生成 MS Teams 代码
- php - 在 PHP 中每隔几秒更改一次文本