简体   繁体   English

“useState”不能在回调中调用。 如何在“useCallback”上使用 state?

[英]“useState” cannot be called inside a callback. How to use state on “useCallback”?

I want to update state in Child component but it doesn't work.我想更新子组件中的 state 但它不起作用。 Actually, there're a lot of items.其实有很多东西。 And I want to list each item with map .我想用map列出每个项目。

The error:错误:

React Hook "useState" cannot be called inside a callback.不能在回调中调用 React Hook “useState”。 React Hooks must be called in a React function component or a custom React Hook function必须在 React function 组件或自定义 React Hook function 中调用 React Hooks

The code:编码:

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])

You can convert the mapped return value to a component and then use useState within it since hooks are meant to be used within functional components.您可以将映射的返回值转换为组件,然后在其中使用useState ,因为钩子旨在在功能组件中使用。

According to the rules of rules you can use them within functions such as map in your case根据规则的规则,您可以在您的情况下在 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])
...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM