自定义反应钩子不更新其价值

时间:2020-05-18 15:01:41

标签: javascript reactjs react-hooks

所以我有以下自定义挂钩,我想使用它基于应用程序内的各种触发器来启用/禁用某些按钮。

import { useState } from 'react';

interface IDisableProps {
  buttonsDisabled: boolean;
  toggleButtons: (isDisabled: boolean) => void;
}

export default function useDisable(): IDisableProps {
  const [buttonsDisabled, setButtonsDisabled] = useState<boolean>(false);

  const toggleButtons = (isDisabled: boolean) => {
    setButtonsDisabled(isDisabled);
  };

  return {
    buttonsDisabled,
    toggleButtons,
  };
}

我使用它的地方之一是另一个钩子,在这里我将其声明为

const { buttonsDisabled, toggleButtons } = useDisable();,然后在合适的时候使用它,如

if (!buttonsDisabled) {
  toggleButtons(true);
}

但是,状态始终保持为初始状态。在toggleButtons中使用调试器输入后,我看到在本地范围内,this是未定义的,看不到buttonsDisabled的值。我在这里想念什么?我采用了错误的方法吗?

3 个答案:

答案 0 :(得分:1)

来自Building Your Own Hooks – React

两个组件是否使用相同的Hook共享状态?否。自定义Hook是一种可重用有状态逻辑的机制(例如设置订阅并记住当前值),但是每次使用时自定义钩子,其中的所有状态和效果都完全隔离。

因此,当您说“您正在使用的地方之一是另一个钩子”时,您将在内存中创建一个额外的[buttonsDisabled, setButtonsDisabled],而不引用在其他地方创建的相同状态您已经调用了useDisable

两种共享状态的方式是:1)传递道具和2)使用Context

答案 1 :(得分:0)

尝试

const toggleButtons = useMemo(isDisabled: boolean) => {
    setButtonsDisabled(isDisabled)
}, [isDisabled]);

答案 2 :(得分:-1)

您可以尝试导出数组而不是导出对象

export [buttonsDisabled, toggleButtons];