javascript - 如何在 React 组件中每分钟调用一个函数?
问题描述
我做了一个表格来获取股票报价,效果很好,但是当我尝试在组件中放置一个函数 include setState 时,它陷入了无限循环,它会触发 setState 并立即重新渲染并再次触发。
加载此组件时,如何在不触发无限循环的情况下调用此函数?我会每 10 秒或每分钟调用一次该函数。
import React, { useState } from 'react'
import api from '../../api'
function CreateRow(props){
const [stock, setStock] = useState({symbol:'',last:'',change:''})
async function check() {
const result = await api.getStock(props.item)
console.log(props.item)
const symbol = result.data.symbol
const lastest = result.data.latestPrice
const change = result.data.change
setStock({symbol:symbol, lastest:lastest, change:change})
}
// check() <----------! if I call the function here, it becomes an infinite loop.
return(
<tr>
<th scope="row"></th>
<td>{stock.symbol}</td>
<td>{stock.lastest}</td>
<td>{stock.change}</td>
</tr>
)
}
export default CreateRow
解决方案
您想在生命周期方法中启动超时功能。
生命周期方法是调用的方法,例如 mount 和 unmount (还有更多示例,但为了解释起见,我将在这里停止)
您感兴趣的是挂载生命周期。
在功能组件中,可以这样访问:
const { useEffect } from 'react';
useEffect(() => {
// This will fire only on mount.
}, [])
在该函数中,您要初始化一个 setTimeout
函数。
const MINUTE_MS = 60000;
useEffect(() => {
const interval = setInterval(() => {
console.log('Logs every minute');
}, MINUTE_MS);
return () => clearInterval(interval); // This represents the unmount function, in which you need to clear your interval to prevent memory leaks.
}, [])
推荐阅读
- google-cloud-platform - 无法在 Google Cloud 中添加结算信息。出现意外错误。请稍后再试。[OR-3DSRFT-08]
- flutter - Flutter 如何对 Dio 401、500 响应进行单元测试
- reactjs - React.js - 将数据作为子参数传递给父方法
- c# - WPF 框架内容在单元测试中为空
- javascript - 从反应组件中查找和更改物化生成的 html 元素
- karate - 根据日志级别(WARN、INFO、DEBUG 等)在报告门户中不显示日志
- java - 2021-04-05T16:25:45.000+00:00 SimpleDateFormat 中的时间戳更改(“yyyy-MM-dd hh:mm:ss a”)
- html - 如何在闪亮中利用 navlistPanel 下方的空间?
- java - ElasticSearch BulkProcessor的工作,如果ES服务器和客户端服务器之间的链接波动怎么办
- kubernetes - 使用 kustomize 覆盖替换多个 gke 入口主机