Hívás API X másodpercenként a reagálnak funkcionális összetevő

szavazat
0

Én a következő reagálni osztály alkatrész hívni egy API minden 10 másodpercben. A munkák nem kérdés.

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

Próbálom burkolt ez egy reagálni komponenst. Ez az én kísérlet eddig.

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

Kérjük, tud valaki segíteni befejezni a példát? Van useEffect a helyes használat, vagy van egy jobb lehetőség?

Minden segítséget szívesen vennénk

A kérdést 02/12/2019 23:55
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
2

Az egyik probléma az, hogy this.getEndpointnem fog működni egy funkció komponens. Úgy tűnik, az eredeti Alertsosztály összetevő hiányzik néhány kódot, mivel meg kell valósítani valahol.

A másik kérdés az, hogy az intervallum nem tisztítja ki -, vissza kell adnia egy razzia funkciót a hatás szervezet törölje az időzítőt.

Végül nincs ok arra, hogy újradefiniálja getAlertsminden render, meghatározó egyszer belülről a hatás test jobb lenne.

A tisztítás után akár néhány hiányzó parens stb én végső végrehajtási következőképpen néz ki:

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} />
      </>
    )
}
Válaszolt 03/12/2019 00:21
a forrás felhasználó

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