javascript - 在函数中调用 "setState"作为回调,在没有任何新状态值的情况下如何成功更新状态?

标签 javascript reactjs

我最近看到了这个代码片段,我想知道状态变量实际上是如何在这里更新的。这是 Firebase 身份验证中使用的身份验证状态观察器,用于确定用户是否已登录 ( docs reference )。 通常,它的功能是这样的:

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

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

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

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

最佳答案

第二个调用使用在其他地方定义的函数作为回调,而第一个调用使用新定义的函数。

参见下面的示例:

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

关于javascript - 在函数中调用 "setState"作为回调,在没有任何新状态值的情况下如何成功更新状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59906241/

相关文章:

javascript - 如何在 Javascript 中使用循环创建比较表达式?

reactjs - 是否可以将带有 jsdoc 子项或渲染 Prop 用作函数的文档?

reactjs - Jest stub 方法

javascript - React 热加载程序不适用于样式组件

javascript - 点击navlink后刷新内容reactJs

javascript - Mapbox-GL-绘图 : Cannot set property 'modes' of undefined

javascript - 在 <textarea> 中设置文本,包括换行符

javascript - 为什么 throttle 将超时、上下文和参数设置为空?

javascript - 三个.js导入纹理

reactjs - ref 在事件处理程序中没有值