当前位置: 首页 > 知识库问答 >
问题:

将函数作为回调传递给使用挂钩创建的React状态并没有反映变量的新值

商璞
2023-03-14

当我们在ReactJS状态上存储函数时,我在这里遇到了一些非常奇怪的事情。

我用钩子创建了一个react状态,其中包含:

  1. 数字变量
  2. 回调函数

由于钩子本身在setState期间没有回调,所以我使用此方法在状态更改后的useEffect期间切换回调。

我在setState期间传递的回调是打印state.number和secondNumber值的值。设置状态完成后,state.number的值应为4,secondNumber的值应为15(如果我要在useEffect开始时对console.log进行测试)。

但是触发回调函数的state.callback()仍然打印出原始数字,即state.number=2和secondNumber=10。

我觉得很奇怪,因为回调是在state.number的值之后调用的,第二个数字是更改的。

有人知道这里的代码会发生什么吗?



    function App(){
      const [state, setState] = useState({
        number : 2,
        callback : null
      });
      let secondNumber = 10;
    
      useEffect(() => {
        if (state.callback){
          secondNumber = 15;
          state.callback();
        }
      }, [state]);
    
      const toggleButton1 = () => {
       setState({
         number : 4,
         callback : () => {
           console.log('state number',state.number);
           console.log('second number', secondNumber);
         }
       })
      }
      
      return (
        //button trigger function toggleButton1
      )
    }
    
    export default App;


共有1个答案

梁承恩
2023-03-14
const toggleButton1 = () => {
  setState({
    number : 4,
    callback : () => {
      console.log('state number', state.number);
      console.log('second number', secondNumber);
    }
  })
}

这将包含存储回调中当前呈现周期的当前状态和第二个值。稍后调用它将在存储时使用该值。

只需在effect钩子中执行您想要对更新状态执行的操作。功能组件状态更新实际上没有基于类的组件的setState回调参数的等价物,具有适当依赖关系的useffect是其等价物。

function App(){
  const [state, setState] = useState({
    number : 2,
    callback : null
  });
  let secondNumber = 10;

  useEffect(() => {
    console.log('state number', state.number);
    console.log('second number', secondNumber);
  }, [state.number]);

  const toggleButton1 = () => {
   setState({
     number : 4,
   })
  }
  
  return (
    //button trigger function toggleButton1
  )
}

export default App;

仅供参考,根据定义,secondNumber将被重置/重新定义回每个渲染周期10,您可以在每个周期内对其进行变异,但每次都会重置。

 类似资料:
  • 假设我们有以下设置,其中父组件有两个子组件C1和C2: 这里是代码和代码: 注意,在C2的构造函数中,我们引用了。如果我们将该变量设置为类属性,如,React即使在单击update按钮并且示例的this.state.data已经更改之后,也无法更新C1。我已经注释掉了直接引用this.props.data的行。

  • 我有一个函数反应组件,它有一个从10000开始到0的计数器。 我正在组件安装期间使用useEffect挂钩设置setInterval回调。然后,回调更新计数器状态。 但是不知道为什么,值从来没有减少过。每次回调运行为10000。 (我正在使用react 功能组件如下所示: 这里是codesandbox的链接:链接

  • 很抱歉,标题令人困惑,但下面是发生的情况: 在中,我正在使用React钩子设置状态。一旦组件挂载(即没有依赖项的),我将实例化两个对象,其中第一个参数作为一个回调函数来递增状态,第二个参数是调用回调函数的

  • 问题内容: 与Firebase问题相比,这更像是JavaScript关闭问题。在以下代码中,Firebase回调无法识别父作用域中的变量myArr。 问题答案: 回调函数可以很好地识别/修改。问题是,当执行标记为“不工作”的标签时,回调尚未触发。 让我们稍微更改一下代码: 现在,可能会更容易了解发生了什么。 您注册一个侦听器,该侦听器将调用添加到Firebase中的每个帖子 这将导致对服务器的调用

  • 我正在尝试使用状态将一个表单输入值复制到另一个表单输入值,但状态没有更新 我创建了一个带有按钮的表单,其中左侧表单输入的值应复制到右侧表单输入。这是我的代码: 无论我做什么,dbSecName的状态都不会改变。我试着设置一个新的常量。我尝试使onclick函数异步并等待。如果我为我试图设置的变量的值添加,我可以正确地看到它,但是dbSecName的console.log总是显示原始值。 我真的不知

  • 问题内容: 我正在尝试通过jQuery AJAX调用预加载一些图像,但是在将(url)字符串传递到AJAX调用的成功函数内的函数时遇到了实际问题(如果有意义)。 这是我的代码,原样: 可以看到我(失败的)尝试将url传递到调用中- 最终得到了递增整数的值。不确定为什么或与这些东西有什么关系,也许是jpg文件的数量? …无论如何,它当然应该在我原始的urls数组中使用单个值。 感谢您的帮助-我似乎总