前提・実現したいこと
React HooksからAPIを叩いて、ヘッダー通知の数を取得したい。
現在React Hooksを利用して、とあるアプリケーションを開発していて、各ページで使いまわしているヘッダーに未読通知の数を表示したいです。
その際に、ヘッダーコンポーネントから直接APIを叩けば全ページで共通の処理ができると思い、ヘッダーの useEffect()
からAPIにアクセスしています。
その際、 useEffect()
に第2引数を設定しているにもかかわらず、無限ループが発生してしまうため、間違っている部分をご指摘いただければと思います。
発生している問題・エラーメッセージ
APIをたたいている useEffect()
が無限ループしてしまう。
該当のソースコード
ヘッダーコンポーネント
javascript
1const HeaderComponent = (props) => { 2 const { t, i18n } = useTranslation() 3//未読通知は noticesに格納 4 const [notices, setNotices] = useState(props.unreadNotices) 5 console.log(props); 6 7 console.log(notices); 8 useEffect(() => { 9 i18n.changeLanguage(props.lng) 10 }, [i18n, props.lng]); 11 12 const changeHandle = e => { 13 props.langChange(e.value) 14 } 15 16 useEffect(() => { 17// ここで無限ループが発生 18 async function getNotices() { 19 const results = await E2.getUnreadNotices(props.loginInfo.token) 20 console.log(results); 21 setNotices(results) 22 } 23 getNotices() 24 }, [notices, props]) 25 26 const options = [ 27 { value: 'en', label: props.lng === 'en' ? 'English ✔️' : 'English' }, 28 { value: 'jp', label: props.lng === 'jp' ? '日本語 ✔️' : '日本語' }, 29 ] 30 const unreadNoticeCount = notices ? <span className='header__notice-count'>{notices.length}</span> : '' 31 let headerContents 32...
API
javascript
1export function getUnreadNotices(token) { 2 return Axios({ 3 method: 'GET', 4 url: `${apiHost}/api/v2/notice/unread`, 5 headers: { Authorization: `Bearer ${token}` }, 6 }) 7 .then(function (res) { 8 console.log(res.data); 9 return res.data; 10 }) 11 .catch(function (error) { 12 console.log('ERROR!! occurred in Backend.'); 13 return error; 14 }); 15}
試したこと
useEffectの第2引数を色々変更してみた
javascript
1 useEffect(() => { 2// ここで無限ループが発生 3 async function getNotices() { 4 const results = await E2.getUnreadNotices(props.loginInfo.token) 5 console.log(results); 6 setNotices(results) 7 } 8 getNotices() 9 }, [])
javascript
1 useEffect(() => { 2// ここで無限ループが発生 3 async function getNotices() { 4 const results = await E2.getUnreadNotices(props.loginInfo.token) 5 console.log(results); 6 setNotices(results) 7 } 8 getNotices() 9 }, [notices,props])
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
React: 16.12.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/22 04:21
2020/06/22 04:30