在第一个按钮上按下状态未更新,但调用了功能

萨米尔·阿里

在第一个按钮上按onChange方法函数被调用,但是状态没有按应有的方式更新,在第二个按钮上按它正在更新,请参见此

import React,{useState} from 'react';
function MainHeader(props) {
    const [FirstName, setFirstName] = useState('')
    const [User, setUser] = useState({
        FirstName: '',
        LastName: ''
    })
    const nameOnChange = (event) => {
        setFirstName(event.target.value)
        console.log(FirstName)
    }
    const addName = () => {
        setUser({
            ...User,
            FirstName: FirstName
        })
        console.log(User)
        props.addUserToFirebase(User)
    }

    return (
        <div>
            <h1>Checking</h1>
            <input type="text" onChange={(e) => nameOnChange(e)} value={FirstName}  />
            <button onClick={() => addName()}>Enter</button>
        </div>
    );
}

在nameOnChange上,第一次按下时为console.log(FirstName),然后控制台记录为空状态(初始状态),在第二个按钮上,它更新上一个按下的按钮。我也尝试过创建类组件,但是我看到了相同的问题,在addName函数中发生了同样的事情,它在第二次单击时会更新状态。查看控制台在此处输入图片说明

普希金

我在这里没有问题。它可以正常运行。但是我看到的唯一问题是您对React的工作原理或函数式编程的总体理解是错误的。

函数式编程没有变化

    const nameOnChange = (event) => {
        // event => new value
        // FirstName => old value
        // they remain that way throughout this function call

        setFirstName(event.target.value)
        // even if you set the state, the values won't change
        // they will be updated only in next function call

        console.log(FirstName) // still old value
    }

同样的道理 addName()

对于每个重新渲染的React调用,函数MainHeader的值在整个调用或整个生命周期中都不会发生变化。值更新后,React将调用MainHeader更新后的值。

正确使用组件的方式

可行,但不是更好的方法


const addName = () => {
  setUser({
     ...User,
     FirstName: FirstName
   })

   //
   console.log({
     ...User,
     FirstName: FirstName
   }) // new value, since User is not mutated, User will still have the old value
   props.addUserToFirebase(({
     ...User,
     FirstName: FirstName
   })
 }

更好的方法

始终将useEffects用于副作用。

// Just set the state
const addName = () => {
  setUser({
     ...User,
     FirstName: FirstName
   })
}

// handle side effects here

useEffect(() => {
    // check is needed here, since it will be
    // called on component's first mount
    if(User.FirstName !== ''){
          console.log(User)
          props.addUserToFirebase(User)
    }
}, [User])

// This will be called whenever React detects a change in `User`

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在未检查的第一个输入上启用了jQuery强制

来自分类Dev

RecyclerView 在第二个按钮而不是第一个按钮上更新

来自分类Dev

每当我按下任何一个发布按钮时,列表中的第一个按钮都将被更新,而不是我按下的特定按钮

来自分类Dev

在Mithril中的第一个按钮单击上未运行Onclick事件

来自分类Dev

R闪亮:按下按钮时,应执行数据表中的多个updateSelectInput,但只有第一个被更新

来自分类Dev

仅调用第一个功能的模块

来自分类Dev

具有相同功能调用的多个按钮,但仅针对第一个按钮显示警报

来自分类Dev

PySpark在分区上的第一个和最后一个功能

来自分类Dev

Windows + Python:为什么第一个打开的窗口未显示为活动状态?

来自分类Dev

在活动状态下显示简单的“显示/隐藏内容”菜单中的第一个

来自分类Dev

默认情况下,第一个切换处于打开状态

来自分类Dev

单击另一个控制器上的按钮时,更新第一个控制器的ng-model

来自分类Dev

如何验证在第一个静态方法中调用了第二个静态方法?

来自分类Dev

反应按钮,带有音频。Js,在第一个键按下后中断,错误:setValueAtTime的无效参数:{},2.2188208616780045

来自分类Dev

检测到按下后退按钮后,如何将数据发送回第一个视图控制器?

来自分类Dev

按下另一个按钮后,如何只给一个按钮一次功能?

来自分类Dev

必须以实例作为第一个参数来调用未绑定方法(代之以无用)

来自分类Dev

必须以实例作为第一个参数调用未绑定方法-python

来自分类Dev

未绑定的方法必须以实例作为第一个参数来调用

来自分类Dev

单击第一个按钮后,React组件不会更新

来自分类Dev

用户按下主屏幕时,将第一个屏幕设置为启动器上的当前项目吗?

来自分类Dev

当用户按下主屏幕时,将第一个屏幕设置为启动器上的当前项目吗?

来自分类Dev

Django Admin按功能过滤/仅按反向外键查找中的第一个对象过滤

来自分类Dev

仅第一个单词填充提交按钮上的value字段

来自分类Dev

下拉菜单上仅第一个按钮展开

来自分类Dev

在第一个单选按钮上,单击刷新页面

来自分类Dev

影响第一个按钮上所有行的处理程序单击

来自分类Dev

ASP.NET C#页上仅未显示第一个标签

来自分类Dev

第一个 MessageBox 未显示在 FormLoad 事件上

Related 相关文章

  1. 1

    在未检查的第一个输入上启用了jQuery强制

  2. 2

    RecyclerView 在第二个按钮而不是第一个按钮上更新

  3. 3

    每当我按下任何一个发布按钮时,列表中的第一个按钮都将被更新,而不是我按下的特定按钮

  4. 4

    在Mithril中的第一个按钮单击上未运行Onclick事件

  5. 5

    R闪亮:按下按钮时,应执行数据表中的多个updateSelectInput,但只有第一个被更新

  6. 6

    仅调用第一个功能的模块

  7. 7

    具有相同功能调用的多个按钮,但仅针对第一个按钮显示警报

  8. 8

    PySpark在分区上的第一个和最后一个功能

  9. 9

    Windows + Python:为什么第一个打开的窗口未显示为活动状态?

  10. 10

    在活动状态下显示简单的“显示/隐藏内容”菜单中的第一个

  11. 11

    默认情况下,第一个切换处于打开状态

  12. 12

    单击另一个控制器上的按钮时,更新第一个控制器的ng-model

  13. 13

    如何验证在第一个静态方法中调用了第二个静态方法?

  14. 14

    反应按钮,带有音频。Js,在第一个键按下后中断,错误:setValueAtTime的无效参数:{},2.2188208616780045

  15. 15

    检测到按下后退按钮后,如何将数据发送回第一个视图控制器?

  16. 16

    按下另一个按钮后,如何只给一个按钮一次功能?

  17. 17

    必须以实例作为第一个参数来调用未绑定方法(代之以无用)

  18. 18

    必须以实例作为第一个参数调用未绑定方法-python

  19. 19

    未绑定的方法必须以实例作为第一个参数来调用

  20. 20

    单击第一个按钮后,React组件不会更新

  21. 21

    用户按下主屏幕时,将第一个屏幕设置为启动器上的当前项目吗?

  22. 22

    当用户按下主屏幕时,将第一个屏幕设置为启动器上的当前项目吗?

  23. 23

    Django Admin按功能过滤/仅按反向外键查找中的第一个对象过滤

  24. 24

    仅第一个单词填充提交按钮上的value字段

  25. 25

    下拉菜单上仅第一个按钮展开

  26. 26

    在第一个单选按钮上,单击刷新页面

  27. 27

    影响第一个按钮上所有行的处理程序单击

  28. 28

    ASP.NET C#页上仅未显示第一个标签

  29. 29

    第一个 MessageBox 未显示在 FormLoad 事件上

热门标签

归档