reactjs - 我应该记住自定义 React 钩子(Hook)的返回对象吗?

标签 reactjs react-hooks memoization

如果我使用 useCallback对于我的自定义钩子(Hook)的方法,我还应该记住返回的对象吗?我认为它不会每次都创建一个新对象,因为它是由记忆化的方法和原语组成的。

export const useToggle = (args: UseToggleProps) => {
    const initialState=
        args.initialState !== undefined ? args.initialState : false
    const [active, setActive] = useState(initialState)

    const toggleOff = useCallback(() => {
        setActive(false)
    }, [])

    const toggleOn = useCallback(() => {
        setActive(true)
    }, [])

    const toggle = useCallback(() => {
        setActive((active) => !active)
    }, [])

    // Should this also be memoized with useMemo?
    return {
        active,
        toggle,
        toggleOff,
        toggleOn
    }
}

最佳答案

您不需要记住返回的对象,除非您将对象直接传递给 useEffect 的函数,在这种情况下引用将失败

您不需要在 useCallback 上添加额外的内存层如果你像这样使用它:

const Comp = () => {
   const { toggleOn, toggleOff } = useToggle();

   useEffect(() => {
      console.log('Something here')
   }, [toggleOn]);  
   return (
       <Child toggleOn={toggleOn} toggleOff={toggleOff} />
   )
}

然而,像下面代码这样的用法需要记住返回的对象
const Comp = () => {
   const toggle = useToggle();

   useEffect(() => {
      console.log('Something here')
   }, [toggle]);  
   return (
       <Child toggleHandlers={toggle} />
   )
}

关于reactjs - 我应该记住自定义 React 钩子(Hook)的返回对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61726173/

相关文章:

reactjs - 我可以在所有钩子(Hook)的依赖数组中放入什么类型的变量

javascript - 是否有推荐的通用模式来内存 ajax 调用?

javascript - 如何使用热图 apexchart 中的数组值设置自定义工具提示?

css - react 动画容器高度

javascript - 如何在 React 中将数组作为 props 传递而不转换为字符串

reactjs - 在哪里使用 URL 参数中的值设置 React 组件的状态

javascript - useEffect 导致组件无限重新渲染

javascript - 使用 useEffect 钩子(Hook)获取数据时,React 组件不会在 URL 参数更改时重新渲染

c++ - 无法理解为什么动态编程在这里不起作用

javascript - 内存一个原型(prototype)方法