React Hook useEffect memiliki ketergantungan yang hilang: 'fetchData'

Sep 23 2020

adakah yang bisa membantu saya dengan kesalahan ini? Dalam useEffect saya memanggil fungsi yang membuat permintaan dan menyisipkan respons dalam status redux.

import React, { useEffect, useState } from "react";
import { BrowserRouter as Router, Switch, Route} from "react-router-dom";
import { useDispatch, useSelector } from 'react-redux'
import { actions } from './actions/actions'
import { I18nProvider } from './i18n'
import axios from 'axios'

import Home from './views/home/home';
import Page1 from './views/page1/page1';
import Page2 from './views/page2/page2'
import Page3 from './views/page3/page3'

const App = () => {

  const [isLoading, setIsLoading] = useState(true)

  const localeDefault = useSelector(state => state.audioGuideReducers.lang)

  const dispatch = useDispatch()
  const setDataRedux= (data) => dispatch(actions.setDataRedux(data))

  useEffect(() => {
    fetchData();
  }, []);

  const fetchData = async () => {
    await axios.get('https://link-api.com/alldata')
      .then((response) => {
        setDataRedux(response.data.data)
        setIsLoading(false)
      })
      .catch( (error) => {
        console.log(error.message);
      })
  }

  return (
    <I18nProvider locale={localeDefault}>
      <Router>
        {
          isLoading ?
            <h1> Loading... </h1>
            :
            <Switch>
              <Route path="/page3/:id" component={Page3} />
              <Route path="/page2" component={Page2} />
              <Route path="/page1" component={Page1} />
              <Route path="/" component={Home} />
            </Switch>
        }
      </Router>
    </I18nProvider>
  );
}

export default App

Meskipun aplikasi "berjalan", saya ingin menyelesaikan peringatan berikut yang muncul: " React Hook useEffect memiliki ketergantungan yang hilang: 'fetchData'. Sertakan atau hapus matriks ketergantungan react-hooks / exaustive-deps "

Jawaban

1 ShubhamVerma Sep 23 2020 at 17:31

Itu karena kapan pun Anda menggunakan useEffectdan jika Anda menggunakan sesuatu yang berada di luar dari useEffect. UseEffect perlu memastikan kapan harus memperbarui saat tidak, itu sebabnya Anda perlu meneruskannya dalam ketergantungannya:

useEffect(() => {
    fetchData();
  }, [fetchData]);

  const fetchData = async () => {
    await axios.get('https://link-api.com/alldata')
      .then((response) => {
        setDataRedux(response.data.data)
        setIsLoading(false)
      })
      .catch( (error) => {
        console.log(error.message);
      })
  }

Cara yang lebih baik jika Anda hanya perlu useEffectmemasukkan ke fetchDatadalam useEffect:

const setDataRedux = React.useCallback((data) => dispatch(actions.setDataRedux(data)), [])
useEffect(() => {
    const fetchData = async () => {
    await axios.get('https://link-api.com/alldata')
      .then((response) => {
        setDataRedux(response.data.data)
        setIsLoading(false)
      })
      .catch( (error) => {
        console.log(error.message);
      })
  }
    fetchData();
  }, [setDataRedux]);

  
1 akhtarvahid Sep 23 2020 at 17:29

Diteruskan fetchDatasebagai argumen untukuseEffect

 useEffect(() => {
    fetchData();
  }, [fetchData]);