React Hook useEffectに依存関係がありません: 'fetchData'
Sep 23 2020
誰かがこのエラーで私を助けることができますか?でuseEffect Iリクエストと挿入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
アプリケーションは「実行中」ですが、表示される次の警告を解決したいと思います:「ReactHook useEffectには依存関係がありません: 'fetchData'。それを含めるか、依存関係マトリックスreact-hooks / exaustive-depsを削除してください」
回答
1 ShubhamVerma Sep 23 2020 at 17:31
その理由は、使用しているときuseEffect、およびuseEffectの外部にあるものを使用している場合です。UseEffectは、更新するタイミングを確認する必要があります。更新しない場合は、依存関係で渡す必要があります。
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);
})
}
より良い方法あなただけの内側の必要がある場合はuseEffect入れfetchData内側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
fetchData引数として渡すuseEffect
useEffect(() => {
fetchData();
}, [fetchData]);