javascript - 在使用 hooks 实现的 React 组件中,如何从 setInterval 中读取最新的组件状态值?
问题描述
使用 React 的基于类的组件,组件的状态值可以从类方法中的 setInterval 中读取,因为组件中其他地方的逻辑会更改状态:
...
constructor(props) {
super(props);
this.state = {
someChangingStateValue: 'initial value'
}
}
...
// Elsewhere, at random:
this.setState({someChangingStateValue: 'suddenly changed'})
...
_handleLoop() {
setInterval(() => {
console.log(this.state.someChangingStateValue)
console.log("The above line prints the current state value correctly.")
}, 500)
}
...
但是,这种模式不能与基于钩子的功能性 React 组件一起使用:
...
[someChangingStateValue, setSomeChangingStateValue] = useState('initial value')
...
// Elsewhere, at random:
setSomeChangingStateValue('suddenly changed')
...
const _handleLoop () => {
setInterval(() => {
console.log(someChangingStateValue)
console.log("The above line would always print 'initial value'.")
}, 500)
}
...
使用这些功能组件实现此目的的最佳方法是什么?
解决方案
目前最干净的解决方案似乎是使用以下方法创建参考useRef()
:
import React, { useState, useRef } from "react";
...
[someChangingStateValue, setSomeChangingStateValue] = useState('initial value')
const someChangingStateValueRef = useRef();
someChangingStateValueRef.current = someChangingStateValue;
...
// Elsewhere, at random:
setSomeChangingStateValue('suddenly changed')
...
const _handleLoop () => {
setInterval(() => {
console.log(someChangingStateValueRef.current)
console.log("The above line prints the current state value correctly.")
}, 500)
}
...
推荐阅读
- bazel - bazel:从环境变量设置全局变量
- amazon-web-services - AWS CLI 获取对象 url 非英文字符
- python - Django - 'elif'。您是否忘记注册或加载此标签?
- r - 如何根据两个字符变量在 ggplot 中进行子集化?
- node.js - Node/Express 中的嵌套 Mongo 调用
- ubuntu - 在其他窗口上工作时,Firefox 忽略了 xdotool 键
- javascript - 在没有内联脚本的情况下在 Shopify Checkout 页面上按地理位置隐藏元素?
- javascript - 当我运行一个包含他的 JS 时,一个元素正在跳跃
- python-3.x - 修改程序,让它仍然打印字符串“What's that?”,但这次它使用了转义字符
- r - 如何从 R 中的多列中提取文本并粘贴到同一列中?