【问题标题】:"useState" cannot be called inside a callback. How to use state on "useCallback"?不能在回调中调用“useState”。如何在“useCallback”上使用状态?
【发布时间】:2020-05-28 07:29:50
【问题描述】:

我想更新子组件中的状态,但它不起作用。其实有很多东西。我想用map列出每个项目。

错误:

无法在回调中调用 React Hook "useState"。 React Hooks 必须在 React 函数组件或自定义 React Hook 函数中调用

代码:

const renderItems = useCallback(() => {
  return items.map((item, idx) => {
    const { name } = room
    const [isCopiedURL, setIsCopiedURL] = useState(false)

    return (
      <li key={idx}>
        <CopyToClipboard
          text={item.name}
          onCopy={() => setIsCopiedURL(true)}
        >
          {item.name}
        </CopyToClipboard>
      </li>
    )
  })
}, [items])

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您可以将映射的返回值转换为组件,然后在其中使用useState,因为钩子旨在用于功能组件。

    根据你的情况,你可以在map等函数中使用规则的规则

    const Item = ({room, item}) => {
        const { name } = room
        const [isCopiedURL, setIsCopiedURL] = useState(false)
    
        return (
          <li key={idx}>
            <CopyToClipboard
              text={item.name}
              onCopy={() => setIsCopiedURL(true)}
            >
              {item.name}
            </CopyToClipboard>
          </li>
        )
    }
    
    ...
    const renderItems = useCallback(() => {
      return items.map((item, idx) => {
         return <Item room={room} item={item} key={idx} />
      })
    }, [items])
    ...
    

    【讨论】:

    • 这是一个不错的 hack ,喜欢它 ♥
    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2021-01-17
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多