所以我试图做一个待办事项列表,当我试图用addItemToList
向列表中添加一个项目时,它不起作用。我得到这个错误:
Each child in a list should have a unique “key” prop
应用程序代码:
function App() {
const [currentItem, setCurrentItem] = useState("");
const [itemlist, updateItemList] = useState([]);
const onChangeHandler = (e) => {
setCurrentItem(e.target.value);
};
const addItemToList = () => {
updateItemList([...itemlist, { item: currentItem, key: Date.now() }]);
setCurrentItem("");
};
return (
<div className="App">
<header>
<form id="to-do-form">
<input
type="text"
placeholder="Enter Text"
value={currentItem}
onChange={onChangeHandler}
/>
<button onClick={addItemToList} type="submit">
Add
</button>
</form>
<List itemlist={itemlist} />{" "}
</header>
</div>
);
}
列表代码:
function List(props) {
return (
<div>
{props.itemlist.map((itemObj) => {
return <p>{itemObj.item}</p>;
})}
</div>
);
}
3条答案
按热度按时间qij5mzcb1#
因为在你的例子中,每个item对象已经有一个等于
Date.now()
的key prop,你可以这样使用它:但是如果你的项目没有关键属性,你可以使用
map
的索引,如下所示:此外,您需要防止浏览器在使用
e.preventDefault()
提交addItemToList
中的form
后刷新页面,以查看添加的项目:tuwxkamq2#
你可能有一个
itemlist.map
,它将这个数组转换为jsx元素来呈现。这个元素需要一个唯一的键,它是一个帮助react正确呈现列表的 prop 。
因此,您可以在map this list
{itemlist.map(item => <element key={item.UNIQUE_KEY} />)}
之后传递此prop如果你没有一个唯一的键,你可以通过你的Map的索引,但不建议,因为如果你修改这个列表,react将重新计算所有这些索引了
{itemlist.map((item, index) => <element key={index} />)}
h5qlskok3#
这个问题是一个反复出现的问题,已经被回答了很多次。请确保在发布问题之前提前使用搜索,以确保您的问题没有重复。
但你看:
作为错误
警告:列表中的每个子元素都应该有一个唯一的“键”属性。
React要求数组中的子元素具有稳定的身份,允许React识别在组件生命周期中哪些元素被更改,添加或删除。标识被分配给具有
key
属性的组件。文档对此非常清楚。事实上,建议使用在所有列表兄弟中唯一的字符串。假设项目具有唯一的名称,e。例如
item1
和item2
,你可以沿着这些线做一些事情,在渲染时将它们用作组件键: