当前位置: 首页 > 知识库问答 >
问题:

反应-警告:列表中的每个孩子都应该有一个唯一的“键”道具

秋阳旭
2023-03-14

在这个简单的React应用程序中,我不明白为什么我会收到以下警告信息:

警告:列表中的每个孩子都应该有一个唯一的“键”道具。

对我来说,似乎我把密钥放在了正确的位置,形式为key={item.login.uuid}

我怎样才能摆脱警告信息?把钥匙放在哪里合适?

应用程序。js

import UserList from './List'

const App = props => {
  const [id, newID] = useState(null)
  return (
    <>
      <UserList id={id} setID={newID} />
    </>
  )
}

export default App

列表js

const UserList = ({ id, setID }) => {
  const [resources, setResources] = useState([])

  const fetchResource = async () => {
    const response = await axios.get(
      'https://api.randomuser.me'
    )
    setResources(response.data.results)
  }

  useEffect(() => {
    fetchResource()
  }, [])

  const renderItem = (item, newID) => {

    return (
      <>
        {newID ? (
          // User view
          <div key={item.login.uuid}>
            <div>
              <h2>
                {item.name.first} {item.name.last}
              </h2>
              <p>
                {item.phone}
                <br />
                {item.email}
              </p>
              <button onClick={() => setID(null)}>
                Back to the list
              </button>
            </div>
          </div>
        ) : (
          // List view
          <li key={item.login.uuid}>
            <div>
              <h2>
                {item.name.first} {item.name.last}
              </h2>
              <button onClick={() => setID(item.login.uuid)}>
                Details
              </button>
            </div>
          </li>
        )}
      </>
    )
  }

  const user = resources.find(user => user.login.uuid === id)

  if (user) {
    // User view
    return <div>{renderItem(user, true)}</div>
  } else {
    // List view
    return (
      <ul>
        {resources.map(user => renderItem(user, false))}
      </ul>
    )
  }
}

export default UserList

共有2个答案

常源
2023-03-14

如果创建两个单独的组件,一个用于用户视图,另一个用于列表项,会怎么样。这样你只需要通过用户道具。另外,使用JSX并从那里传递wht密钥。

const UserList = ({ id, setID }) => {
  const [resources, setResources] = useState([])

  const fetchResource = async () => {
    const response = await axios.get(
      'https://api.randomuser.me'
    )
    setResources(response.data.results)
  }

  useEffect(() => {
    fetchResource()
  }, [])

  const User = ({user}) => (
    <div key={user.login.uuid}>
      <div>
        <h2>
          {user.name.first} {user.name.last}
        </h2>
        <p>
          {user.phone}
          <br />
          {user.email}
        </p>
        <button onClick={() => setID(null)}>
          Back to the list
        </button>
      </div>
    </div>
  )

  const ListItem = ({user}) => (
    <li key={user.login.uuid}>
      <div>
        <h2>
          {user.name.first} {user.name.last}
        </h2>
        <button onClick={() => setID(user.login.uuid)}>
          Details
        </button>
      </div>
    </li>
  )

  const user = resources.find(user => user.login.uuid === id)

  if (user) {
    // User view
    return <User user={user}</div>
  } else {
    // List view
    return (
      <ul>
        {resources.map((user, index) => <ListItem key={index} user={user} />)}
      </ul>
    )
  }
}

export default UserList
韦知
2023-03-14

需要位于循环内的根级元素上。在你的例子中,那是片段(

要做到这一点,您需要完整地写出:

const renderItem = (item, newID) => {

  return (
    <Fragment key={item.login.uuid}>
      {newID ? (
        ...
      )}
    </Fragment>
  );
}

(您可以添加片段到您的其他导入从反应)。

请注意,在您的示例中,片段实际上并不需要,您可以将其删除,并保留s的位置,从那时起

const renderItem = (item, newId) => {

  return newID ? (
    <div key={item.login.uuid}>
      ...
    </div>
  ) : (
    <li  key={item.login.uuid}>
      ...
    </li>
  )
}

 类似资料:
  • 我对如何创建一个简单的todo应用程序的反应和探索方式还不熟悉。我当前收到错误“警告:列表中的每个孩子都应该有一个唯一的“键”道具。”一切似乎都很好,但我一定是做错了什么。 如果有人能帮上忙,那就br太好了/解释为什么会发生这个错误,那就太好了。

  • 问题内容: 我正在使用Google Books API构建应用,并且似乎正在向列表中的每个孩子传递唯一键,但是错误不会消失。我一定在做错事,但不确定。 请注意,在返回const books之后,我有一个console.log(book.id),它将在控制台中显示所有10个唯一的id键。但是,当我尝试使用key = {book.id}将其传递给该组件的子组件时,会出现此错误。 问题答案: 在需要去最

  • 我调用一个APIendpoint,将其数据保存到一个状态,然后呈现它。它显示在浏览器中,但控制台上有一个警告:。 我的: 我不明白在render()中该将关键道具放在哪里。这是我的代码片段: 不使用钥匙道具会带来什么改进?我被这些

  • 所以我想渲染数组,但它一直在说,警告:列表中的每个孩子都应该有一个唯一的“键”道具,即使它有唯一的键,我的数组包含三个元素,它甚至没有正确渲染第三个数组,按钮没有甚至因为某种原因第三李的工作。 更新:我从firebase获得的数据如下所示: 此代码将选择每个数据的标题 当我将鼠标悬停在“fikka-fikka”上时,“fikka-fikka”的按钮甚至不起作用。在ed sheeran和一个方向上,

  • 我正在使用GoogleBooksAPI构建一个应用程序,我似乎正在向列表中的每个孩子传递一个唯一的密钥,但错误不会消失。我一定是做错了什么,但我不知道是什么。 注意,在const books中返回后,我有一个控制台。日志(book.id),它将在控制台中显示所有10个唯一的id键。但是当我试图使用key={book.id}将它传递给这个组件的子组件时,我得到了这个错误。

  • 我写了一个BlackJack游戏,但是在我从卡片API中查询API后,卡片从未显示在屏幕上。我有控制台记录了玩家甲板和交易甲板,它有卡片数据,但没有显示。 错误如下:index.js:1375警告:列表中的每个子级都应该有一个唯一的“键”道具。 检查的渲染方法。参见https://reactjs.org/link/warning-keys了解更多信息。在黑杰克(http://localhost:3