我想每1000毫秒更新一次React组件的状态。但是,我尝试在setInterval
上执行componentDidMount
,但没有运气。目前我在console.log
中得到两个结果,一个是构造函数中的空状态对象,另一个是API中的获取对象。如何使用setInterval每1000毫秒更新一次组件的状态?
这是我的代码:
let url = 'some-link-bla-bla';
class Basemap extends React.Component {
constructor(props) {
super(props);
this.state = {};
console.log(this.state);
}
render() {
return (
<Scene style={{ width: '100vw', height: '100vh' }}
mapProperties={{ basemap: 'satellite' }}
viewProperties={ this.state } />
);
}
componentDidMount() {
fetch(url)
.then(d => d.json().then(function(d) {
console.log(d);
}))
.then(d => function(d) {
this.setState({
center: [
{latitude : d.iss_position.latitude} + ', ' +
{longitude: d.iss_position.longitude}
]
})
});
}
}
export default Basemap;
答案 0 :(得分:3)
我在getCenter方法中将调用移到了fetch方法,我将在componentDidMount中将其传递给setInterval函数
在设置间隔之前调用this.getCenter()。它将在安装组件后立即获取。
使用componentWillUnmount清除间隔。它将确保在卸载组件后setInterval不会触发任何获取请求。
let url = 'some-link-bla-bla';
class Basemap extends React.Component {
constructor(props) {
super(props);
this.state = {};
console.log(this.state);
}
render() {
return (
<Scene style={{ width: '100vw', height: '100vh' }}
mapProperties={{ basemap: 'satellite' }}
viewProperties={ this.state } />
);
}
componentDidMount() {
// Call this function so that it fetch first time right after mounting the component
this.getCenter();
// set Interval
this.interval = setInterval(this.getCenter, 1000);
}
componentWillUnmount() {
// Clear the interval right before component unmount
clearInterval(this.interval);
}
getCenter = () => {
fetch(url)
.then(d => d.json().then(function(d) {
console.log(d);
}))
.then(d => function(d) {
this.setState({
center: [
{latitude : d.iss_position.latitude} + ', ' +
{longitude: d.iss_position.longitude}
]
})
});
}
}
export default Basemap;
答案 1 :(得分:2)
通常使用React我使用setTimeout
而不是setInterval
,唯一的对应是你需要在函数结束后调用它。
let url = 'some-link-bla-bla';
class Basemap extends React.Component {
constructor(props) {
super(props);
this.state = {};
console.log(this.state);
this.intervalFunc = this.intervalFunc.bind(this); // Here
this.timeout= this.timeout.bind(this); // Here
}
render() {
return (
<Scene style={{ width: '100vw', height: '100vh' }}
mapProperties={{ basemap: 'satellite' }}
viewProperties={ this.state } />
);
}
intervalFunc() {
fetch(url)
.then(d => d.json().then(function(d) {
console.log(d);
}))
.then(d => function(d) {
this.setState({
center: [
{latitude : d.iss_position.latitude} + ', ' +
{longitude: d.iss_position.longitude}
]
})
this.timeout(); // Here
});
}
timeout() {
this.setTimeout(intervalFunc, 1000); // Here
}
componentDidMount() {
this.timeout(); // Here
}
}
答案 2 :(得分:0)
尝试以下代码:
function tick() {
const element = (
<div>
<h1>Hello, world!</h1>
<h2>
It is{' '}
{new Date().toLocaleTimeString()}.
</h2>
</div>
);
ReactDOM.render(
element,
document.getElementById('root')
);
}
setInterval(tick, 1000);