Volání API Každý x sekund na Reagovat funkční komponenty

hlasů
0

Mám následující reagovat třídy komponentu volání API každých 10 sekund. Jeho funguje bez problémů.

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

Snažím skryté e-mail reagovat funkční složku. To je můj pokus tak daleko.

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

Prosím, může mi někdo pomůže dokončit příklad? Je useEffect správné použití, nebo je tam lepší volba?

Jakákoliv pomoc by ocenili

Položena 02/12/2019 v 23:55
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
2

Jednou z otázek je, že this.getEndpointnebude fungovat z komponenty funkce. Zdá se, že původní Alertssložka třída chybí nějaký kód, protože to musí být implementována někde.

Dalším problémem je to, že interval není vyčištěno - měli byste se vrátit funkci vyčištění od účinku těla vymazat časovač.

A konečně není důvod k re-definovat getAlertsna každý činí, definování to jednou vnitřku efektu těla by bylo lepší.

Po vyčištění nějaké chybějící parens atd moje poslední realizace bude vypadat nějak takto:

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} />
      </>
    )
}
Odpovězeno 03/12/2019 v 00:21
zdroj uživatelem

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