Chamada API cada X segundos em Reagir componente funcional

votos
0

Eu tenho a seguinte reagir componente classe para chamar uma API a cada 10 segundos. Sua funciona sem problemas.

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} />
      </>
    )
  }
}

Eu estou tentando converter isto a um reagem componente funcional. Esta é minha tentativa até agora.

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} />
      </>
    )
}

Por favor, alguém pode me ajudar a completar o exemplo? useEffect é o uso correto ou se há uma opção melhor?

Qualquer ajuda seria apreciada

Publicado 02/12/2019 em 23:55
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Uma questão aqui é que this.getEndpointnão vai trabalhar a partir de um componente de função. Parece o original Alertscomponente classe está faltando algum código uma vez que deve ser implementada em algum lugar.

Outra questão é que o intervalo não está sendo limpo - você deve retornar uma função de limpeza do corpo efeito para limpar o timer.

Por último, não há razão para re-definir getAlertsem cada render, definindo-o uma vez dentro do corpo efeito seria melhor.

Depois de limpar alguns parênteses ausentes, etc. minha implementação final seria algo parecido com:

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} />
      </>
    )
}
Respondeu 03/12/2019 em 00:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more