[英]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注意:此代码只是一个示例
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:你有三种可能:
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.