首页 > 解决方案 > 在没有任何新状态值的情况下,如何在函数中将“setState”作为回调调用成功更新状态?

问题描述

我最近看到了这个代码片段,我想知道状态变量是如何在这里更新的。这是在 firebase 身份验证中使用的身份验证状态观察器,以确定用户是否已登录(文档参考)。通常,它是这样运行的:

const [userData, setUserData] = useState(null)
firebase.auth().onAuthStateChanged(user => {
  if (user) {
    // User is signed in.
    setUserData(user); // can now access properties of user
  }
});

但是,此代码userData以完全相同的方式更新,方法是setUserData在函数中放置回调:

const [userData, setUserData] = useState(null)
firebase.auth().onAuthStateChanged(setUserData);

这两个函数都设置userData为同一个对象。这是如何工作的,在第二个片段中,通过不使用有形值来更新状态来更新状态?

标签: javascriptreactjs

解决方案


第二次调用使用在别处定义的函数作为回调,而第一次调用使用新定义的函数。

请参见下面的示例:

function log(data) {
  console.log(data);
}

function someFunction(callback) {
  setTimeout(()=>{ callback("my data")}, 1000);
}


someFunction( (data)=> console.log(data) ); // use new function
someFunction( log ); // reuse a defined function


推荐阅读