[英]How do I fix “useEffect has a missing dependency” in custom hook
我正在使用自定義鈎子從 API 中獲取一些數據,以便在一組 React function 組件中使用。 然而,esLint 拋出了一個可愛的警告:
React Hook useEffect 缺少依賴項:'fetchFromAPI'。 包括它或刪除依賴數組。
我不認為這是一個依賴,因為它在useFetch()
本身內部。 我需要這樣做,因為我正在使用await
。 我究竟做錯了什么? 關閉這條線路的警告可以嗎? 還是我應該使用更規范的語法?
function useFetch (url) {
const [data, setData] = useState(null);
async function fetchFromAPI() {
const json = await( await fetch(url) ).json();
setData(json);
}
useEffect(() => {fetchFromAPI()},[url]);
return data;
};
export {
useFetch
};
在自定義效果之外聲明它,傳遞url
作為參數並return
json
以在useEffect
中設置
async function fetchFromAPI(url) {
const json = await( await fetch(url) ).json();
return json
}
function useFetch (url) {
const [data, setData] = useState(null);
useEffect(() => {
setData(fetchFromAPI(url))
},[url]);
return data;
};
或者直接在useEffect
里面
function useFetch (url) {
const [data, setData] = useState(null);
useEffect(() => {
async function fetchFromAPI() {
const json = await( await fetch(url) ).json();
return json
}
setData(fetchFromAPI())
},[url]);
return data;
};
我建議您在 useEffect 本身中定義 async function :
function useFetch (url) {
const [data, setData] = useState(null);
useEffect(() => {
async function fetchFromAPI() {
const json = await( await fetch(url) ).json();
setData(json);
}
fetchFromAPI()
},[url]);
return data;
};
您可以查看doc faqs 中的有效示例,該示例在 useEffect 本身中使用異步 function:
function ProductPage({ productId }) {
const [product, setProduct] = useState(null);
useEffect(() => {
// By moving this function inside the effect,
// we can clearly see the values it uses.
async function fetchProduct() {
const response = await fetch('http://myapi/product' + productId);
const json = await response.json();
setProduct(json);
}
fetchProduct();
}, [productId]); // ✅ Valid because our effect only uses productId
// ...
}
只需將您的 function 移動到 useEffect 中,一切都會好起來的:
import { useState, useEffect } from "react";
function useFetch(url) {
const [data, setData] = useState(null);
useEffect(() => {
async function fetchFromAPI() {
const json = await (await fetch(url)).json();
setData(json);
}
fetchFromAPI();
}, [url]);
return data;
}
export { useFetch };
async function fetchFromAPI(url) {
return ( await fetch(url) ).json();
}
function useFetch (url) {
const [data, setData] = useState(null);
useEffect(() => {
fetchFromAPI(url).then(setData);
}, [url, setData, fetchFromAPI]);
return data;
};
export {
useFetch
};
fetchFromAPI
,因為每次調用 useFetch 時都不會創建,這對單一職責也有好處。setData
和fetchFromAPI
參數。 並且完全按照這個順序。 因為在重新渲染參數比較從第一個參數到最后一個參數時,最好將更改最多的參數放在第一位,因為每次更改下一個參數時都不檢查未更改的參數,所以如果第一次更改, useEffect
不需要檢查其他人並提前致電通過 function
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.