我在React中做了一个 Jmeter 板。它没有主动更新,没有按钮、字段或下拉菜单。它将部署在一个壁挂式电视上供查看。所有面板(总共9个)都通过API调用更新。初始调用(见下文)工作正常,所有JSON数据都被获取, Jmeter 板也得到了初始更新。
底线问题:我需要在初始调用后每隔30秒到1分钟调用一次API来检查更新。
我曾尝试在componentDidMount()中使用“setInterval”,正如这里回答其他人问题的人所建议的那样,但我得到了一个错误“await is a reserved word”。我读过关于forceUpdate()的文章,考虑到facebook/react页面对它的描述,它似乎符合我的用例逻辑。但是,我也读过这里,以远离它...
下面的代码是我正在使用的代码的精简版。为了简洁起见,我删除了许多组件和导入。任何帮助都将不胜感激。
import React, { Component } from 'react';
import Panelone from './Components/Panelone';
import Paneltwo from './Components/Paneltwo';
class App extends Component {
state = {
panelone: [],
paneltwo: []
}
async componentDidMount() {
try {
const res = await fetch('https://api.apijson.com/...');
const blocks = await res.json();
const dataPanelone = blocks.panelone;
const dataPaneltwo = blocks.paneltwo;
this.setState({
panelone: dataPanelone,
paneltwo: dataPaneltwo,
})
} catch(e) {
console.log(e);
}
render () {
return (
<div className="App">
<div className="wrapper">
<Panelone panelone={this.state} />
<Paneltwo paneltwo={this.state} />
</div>
</div>
);
}
}
export default App;
7条答案
按热度按时间x8goxv8g1#
将数据获取逻辑移到一个单独的函数中,并使用
componentDidMount
方法中的setInterval
调用该函数,如下所示。下面是一个工作示例
https://codesandbox.io/s/qvzj6005w
xmd2e60i2#
为了使用
await
,直接封装它的函数必须是async
。根据您的说法,如果您想在componentDidMount
中使用setInterval
,则在内部函数中添加async将解决此问题。以下是代码,此外,您应该考虑使用react-timer-mixin,而不是全局使用setInterval。https://facebook.github.io/react-native/docs/timers.html#timermixin
wbrvyc0a3#
对于那些寻找功能组件的人,可以通过创建setInterval并在
useEffect
钩子中调用它来每n次更新状态,最后在clean up函数中调用clearInterval
方法ao218c7q4#
我想我可以稍微修改一下方法,通过函数块中的setTimeout调用来使用递归。工作原理是一样的......也许稍微干净一点,让函数从内部调用自己,而不是在代码的其他地方这样做。
This article更深入地解释了其中的原因......但是我已经在工作中的几个 Jmeter 板上使用了这种方法--完成了工作!
看起来像这样:
对不起,如果格式有点过了。还没有尝试过这个钩子,但我想你会有一个类似的实现在useEffect调用?有人这样做了吗?
hjqgdpho5#
我已经看到了很多关于这个的复杂性。没有必要在生命周期或者状态或者承诺中有它。在这里,服务API只是一个简单的axios api调用
这是我使用context API时的完整实现(省略了一些私有代码),我只关心api中的状态响应,因为我知道我需要改变什么,但api可以是任何你需要的数据。
polhcujo6#
答案
您可以为componentDidMount代码创建一个函数。
然后创建一个组件DidUpdate
r8xiu3jd7#
你还需要清除这个间隔,否则它会继续调用API。要清除间隔,你需要有一个引用,然后你可以在
ComponentWillUnmount
上清除它。你可以使用useRef
钩子和你的类组件来达到这个目的。功能组件方法