简体   繁体   English

React useEffect 无法更新 function 变量

[英]React useEffect can not update function variables

Regarding this part of code:关于这部分代码:

const MyComponent = props => {

    let number = 0
    React.useEffect(() => {
        number = number + 1
        console.log('inside useEffect: ', number);
    }, [number])

    console.log('outside useEffect: ', number);

    return <div/>
}

I expect the number to be 1 after executing the useEffect but here is the log:我希望执行useEffect后数字为1 ,但这里是日志:

outside useEffect:  0
inside useEffect:  1
outside useEffect:  0
outside useEffect:  0

My question is why useEffect can't update number ?我的问题是为什么useEffect不能更新number How can I update a simple variable in useEffect ?如何更新useEffect中的简单变量?

Note: This code is just a sample注意:此代码只是一个示例

You should use react-hook's useState .你应该使用 react-hook 的useState

 const MyComponent = props => { const [number, setNumber] = React.useState(0) React.useEffect(() => { setNumber(number+1) }, []) React.useEffect(() => { console.log(number) }, [number]) return <div/> }

Your number is not in state, and every time your function is re-renderd your number do not preserve value, but create new value, which is initial one (0).您的号码不在 state 中,并且每次重新渲染您的 function 时,您的号码不会保留价值,而是创建新的价值,即初始值 (0)。

You have three possibilities:你有三种可能:

  1. Put number in const [number, setNumber] = useState();将数字放入 const [number, setNumber] = useState();
  2. useRef(number)使用参考(编号)
  3. You can also try to put number outside of MyComponent function, and then it should preserve value.您也可以尝试将number放在 MyComponent function 之外,然后它应该保留值。

In my opinion preferable way to do this is with useRef .在我看来,最好的方法是使用useRef

Whenever you see console.log('outside useEffect: ', number) executed, it means there's been a re-render triggered.每当您看到执行了console.log('outside useEffect: ', number)时,就意味着触发了重新渲染。 Since you put the log inside the render function body.由于您将日志放在渲染 function 主体中。

Now take a closer look, what else is inside the render function body?现在仔细看看,render function body 里面还有什么?

let number = 0

Of course, this line of code will reset number back to 0 every time a re-render is triggered.当然,这行代码会在每次触发重新渲染时将number重置为0 That's the why.这就是为什么。

Ok, what solution we have?好的,我们有什么解决方案? useRef() it is: useRef()它是:

const MyComponent = props => {
    const number = useRef(0);
    React.useEffect(() => {
        number.current = number.current + 1
        console.log('inside useEffect: ', number.current);
    }, [number.current])

    console.log('outside useEffect: ', number.current);

    return <div/>
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 React:“无法在未安装的组件上执行 React 状态更新”没有 useEffect 函数 - React: "Can't perform a React state update on an unmounted component" without useEffect function 在useEffect清理函数执行之前获取“无法对卸载的组件执行React状态更新” - Getting 'Can't perform a React state update on an unmounted component' before useEffect cleanup function executes React:如何防止在 useEffect 中调用的 function 超出最大更新深度 - React : How can i prevent Maximum update depth exceeded from a function beign called in useEffect 警告:无法对未安装的组件执行 React state 更新。 使用效果清理 function - Warning: Can't perform a React state update on an unmounted component. useEffect cleanup function React useEffect:返回函数中的setState没有及时更新状态 - React useEffect: setState in return function does not update state in time 如何防止 state 对反应 onClick function (外部 useEffect)的更新? - How to prevent a state update on a react onClick function (outside useEffect)? 在 function 中反应 useEffect - React useEffect in function 在 function 道具上反应 useEffect - React useEffect on function props 反应 - function inside useEffect - react - function inside useEffect 无法使用 useEffect 挂钩对未安装的组件执行 React state 更新 - Can't perform a React state update on an unmounted component with useEffect hook
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM