我应该记住自定义 React hook 返回的对象吗?

Gre*_*rel 13 memoization reactjs react-hooks

如果我用于useCallback自定义挂钩的方法,我是否还应该记住返回的对象?我假设它不会每次都创建一个新对象,因为它是由记忆方法和原语组成的。

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Shu*_*tri 8

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

useCallback如果您像这样使用它,则不需要添加额外的记忆层:

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

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

然而,像下面的代码这样的用法将需要返回的对象的记忆

const Comp = () => {
   const toggle = useToggle();

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