【发布时间】:2019-11-16 18:19:11
【问题描述】:
我刚开始 React,在这个项目列表教程中我有一些关于更新项目状态的问题。另外,我正在使用功能组件。所以在 app.js 中
const [items, setItems] = useState([
{
id: 1,
title: 'Banana',
bought: false
},
...
])
然后我在 app.js 中有一个函数可以在我选中一个框时将购买的内容更新为真或假
// The id is passed in from Item.js down below
const markBought = (id) => {
setItems(
items.map(
item => {
if (item.id === id) {
/// If bought is false, checking it will make it true and vice versa
item.bought = !item.bought; // (1)
}
return item; // (2)
})
);
};
return (
<div className="App">
<Items items={items} markBought={markBought}></Items>
</div>
);
老师说我们正在使用一种叫做组件钻孔的东西。所以在Items.js中,我们通过映射每一个item来一个一个的展示出来,但是我觉得没必要展示出来。
终于在 Item.js 中
<input type="checkbox" onChange={() => props.markBought(props.item.id)} />
{props.item.title}
该应用程序运行良好,但对我来说有点混乱。所以:
- 在app.js中,我们改变购买状态后,是不是也需要退货,和条件为假时退货一样?为什么说错了才退货,对了才改不退货?
- 我读到 map 不会修改数组,所以 markBought 函数应该创建一个新的 items 数组,已经修改了买的,但是这个数组会发生什么,React 怎么知道将这个“道具”到 item.js,而不是我硬编码的那些?
对不起,如果这有点长,任何帮助将不胜感激。感谢阅读
【问题讨论】:
-
欢迎堆栈溢出!通常最好一次只针对一个问题发布您的帖子。关于您的第一个问题,无论条件是否为真,
return item行都会被调用。也许你会感到困惑,如果你有if和else包装你的回报,但这段代码没有......你的第二个问题最好通过阅读官方反应文档来回答 reactjs.org/docs/state-and-lifecycle.html -
对于您的第一个问题,无论是否满足 if 条件,您的 map 函数始终返回该项目。只有在 if 中放入另一个 return 语句,执行才会停止。
-
您使用 map 的方式正在改变数组,您不应该这样做。如果您想使用 map 更改数组中的一项,您应该复制该一项并更改该副本,简短的语法是扩展运算符:
copy = {...original: changed:'other value'}对于一个完整的工作示例,您可以查看我的答案并评论它,如果你有任何问题。
标签: reactjs