我具有以下react类组件,每10秒调用一次API。它的工作没有问题。
class Alerts extends Component {
constructor() {
this.state = {
alerts: {},
}
}
componentDidMount() {
this.getAlerts()
this.timerId = setInterval(() => this.getAlerts(), 10000)
}
componentWillUnmount() {
clearInterval(this.timerId)
}
getAlerts() {
fetch(this.getEndpoint('api/alerts/all"))
.then(result => result.json())
.then(result => this.setState({ alerts: result }))
}
render() {
return (
<>
<ListAlerts alerts={this.state.alerts} />
</>
)
}
}
我正在尝试将其秘密化为反应功能组件。到目前为止,这是我的尝试。
const Alerts = () => {
const [alerts, setAlerts] = useState([])
useEffect(() => {
getAlerts()
setInterval(() => getAlerts(), 10000)
}, [])
getAlerts() {
fetch(this.getEndpoint('api/alerts/all"))
.then(result => result.json())
.then(result => setAlerts(result)
}
return (
<>
<ListAlerts alerts={alerts} />
</>
)
}
[有人可以帮我完成示例吗? useEffect是否正确使用还是有更好的选择?
任何帮助将不胜感激
这里的一个问题是this.getEndpoint
无法通过功能组件工作。似乎原始的Alerts
类组件缺少某些代码,因为必须在某个地方实现。
另一个问题是间隔没有被清理-您应该从效果主体返回清理函数以清除计时器。
几乎没有理由在每个渲染器上重新定义getAlerts
,将其在效果主体内部定义一次会更好。
清理了一些丢失的括号后,我的最终实现看起来像:
function getEndpoint(path) {
return ...; // finish implementing this
}
const Alerts = () => {
const [alerts, setAlerts] = useState([])
useEffect(() => {
function getAlerts() {
fetch(getEndpoint('api/alerts/all'))
.then(result => result.json())
.then(result => setAlerts(result))
}
getAlerts()
const interval = setInterval(() => getAlerts(), 10000)
return () => {
clearInterval(interval);
}
}, [])
return (
<>
<ListAlerts alerts={alerts} />
</>
)
}