React功能组件中每隔X秒调用API

问题描述 投票:0回答:1

我具有以下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是否正确使用还是有更好的选择?

任何帮助将不胜感激

reactjs react-native react-component react-context react-functional-component
1个回答
0
投票

这里的一个问题是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} />
      </>
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.