javascript 在todo列表中添加元素不起作用,并在React中获得“列表中的每个孩子都应该有一个唯一的键 prop ”

qvk1mo1f  于 2023-05-05  发布在  Java
关注(0)|答案(3)|浏览(150)

所以我试图做一个待办事项列表,当我试图用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>
  );
}
qij5mzcb

qij5mzcb1#

因为在你的例子中,每个item对象已经有一个等于Date.now()的key prop,你可以这样使用它:

function List(props) {
  return (
    <div>
      {props.itemlist.map((itemObj) => {
        return <p key={itemObj.key}>{itemObj.item}</p>;
      })}
    </div>
  );
}

但是如果你的项目没有关键属性,你可以使用map的索引,如下所示:

function List(props) {
  return (
    <div>
      {props.itemlist.map((itemObj, index) => {
        return <p key={index}>{itemObj.item}</p>;
      })}
    </div>
  );
}

此外,您需要防止浏览器在使用e.preventDefault()提交addItemToList中的form后刷新页面,以查看添加的项目:

const addItemToList = (e) => {
    e.preventDefault();
    updateItemList([...itemlist, { item: currentItem, key: Date.now() }]);
    setCurrentItem("");
  };
tuwxkamq

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} />)}

h5qlskok

h5qlskok3#

这个问题是一个反复出现的问题,已经被回答了很多次。请确保在发布问题之前提前使用搜索,以确保您的问题没有重复。
但你看:
作为错误
警告:列表中的每个子元素都应该有一个唯一的“键”属性。
React要求数组中的子元素具有稳定的身份,允许React识别在组件生命周期中哪些元素被更改,添加或删除。标识被分配给具有key属性的组件。文档对此非常清楚。事实上,建议使用在所有列表兄弟中唯一的字符串。
假设项目具有唯一的名称,e。例如item1item2,你可以沿着这些线做一些事情,在渲染时将它们用作组件键:

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 itemlist.map((item) => <p key={item.name} />)
}

相关问题