在地图函数内部时,React onClick() 不会触发

React onClick() doesn't trigger when inside map function

我正在构建我的第一个 React 应用程序,但遇到了问题。

我想创建一个简单的应用程序,我可以在边栏中单击书名,然后查看该书的摘要。我通过我在本地定义的 API 获取书名和摘要。

现在,点击书名不会执行任何操作。我在控制台中收到红色错误:

index.js:1 Warning: Each child in a list should have a unique "key" prop.

我这样称呼我的 API:

  const [viewingId, setViewingId] = useState()
  const [bookList, setBookList] = useState([])
  const [contents, setContents] = useState({})

  useEffect(() => {

    fetch("http://localhost:5000/books")
    .then(res => res.json())
    .then(res => {setBookList(res)})
  }, [])

  const fetchBookSummary = (id) => {
    fetch(`http://localhost:5000/book/${id}`)
    .then(res => res.json())
    .then(res => {
      setContents({...contents, [id]: res[0]})
    })
  }

这就是我定义 'onClick' 函数的方式:

  const seeSummary = (id) => {
    fetchBookSummary(id)
    setViewingId(id)
  }

最后,我的应用呈现如下:

  return (
    <div className="App">
      <div className="App-Container">
        <div className="BookList">
          {bookList.map(book => (
            <Node book={book} onClick={() => seeSummary(book.id)} />
          ))}
        </div>

        <div className="SummaryView">
          {contents[viewingId]?.content?.map((summaryData => (
              <Summary summaryData={summaryData}/>
          )))}
        </div>
      </div>
    </div>
  );
}

我以前只有 onClick={seeSummary(book.id)},但出现“重新渲染太多”错误...我不确定我是否理解添加 () => 的作用。

我希望在单击一本书时能够看到摘要。感谢您的帮助!

要解决 React 密钥警告,您只需为要映射的元素提供有效的 React 密钥。

{bookList.map(book => (
  <Node
    key={book.id} // <-- Add a unique key, the book id is good
    book={book}
    onClick={() => seeSummary(book.id)}
  />
))}

当您刚刚 onClick={seeSummary(book.id)} 时,这会立即调用回调,从而导致渲染循环。通过添加“() =>”,您声明了一个匿名函数来调用您的 seeSummary 函数并在节点被单击时 传递特定的图书 ID

除了获取图书详细信息所花费的时间比更新摘要 ID 所花费的时间更长之外,我没有发现您定义 onClick 处理程序的方式有任何明显的问题。

const seeSummary = (id) => {
  fetchBookSummary(id); // fetching data
  setViewingId(id); // will update first.
}

我怀疑您没有 connected/attached Node 组件的 onClick 属性到任何 DOM 元素,例如 buttondiv,等等...您需要确保 onClick 道具 实际上 附加到用户可以与之交互的 某物 .

示例:

const Node = ({ book, onClick }) => (
  <div onClick={onClick}>
    {book.title} - Click me to see summary!
  </div>
);