gpt4 book ai didi

reactjs - 我可以忽略 useContext 的 exhaustive-deps 警告吗?

转载 作者:行者123 更新时间:2023-12-05 06:16:42 27 4
gpt4 key购买 nike

在我的 react-typescript 应用程序中,我尝试使用一个上下文提供程序来封装属性和方法并将它们公开给消费者:

const StockPriceConsumer: React.FC = () => {
const stockPrice = useContext(myContext);
let val = stockPrice.val;
useEffect(() => {
stockPrice.fetch();
}, [val]);
return <h1>{val}</h1>;
};

问题是以下警告:

React Hook useEffect has a missing dependency: 'stockPrice'. Either include it or remove the dependency array. eslint(react-hooks/exhaustive-deps)

对我来说,将 stockPrice(基本上是提供商的 API)包含到 useEffect 的依赖项中没有任何意义。只有包含股票价格的实际值以防止无限调用 useEffect 的函数才有意义。

问题:我尝试使用的方法有什么问题吗?或者我可以忽略这个警告吗?


提供商:

interface StockPrice {
val: number;
fetch: () => void;
}

const initialStockPrice = {val: NaN, fetch: () => {}};

type Action = {
type: string;
payload: any;
};

const stockPriceReducer = (state: StockPrice, action: Action): StockPrice => {
if (action.type === 'fetch') {
return {...state, val: action.payload};
}
return {...state};
};

const myContext = React.createContext<StockPrice>(initialStockPrice);

const StockPriceProvider: React.FC = ({children}) => {
const [state, dispatch] = React.useReducer(stockPriceReducer, initialStockPrice);
const contextVal = {
...state,
fetch: (): void => {
setTimeout(() => {
dispatch({type: 'fetch', payload: 200});
}, 200);
},
};
return <myContext.Provider value={contextVal}>{children}</myContext.Provider>;
};

最佳答案

我建议从提供者控制整个获取逻辑:

const StockPriceProvider = ({children}) => {
const [price, setPrice] = React.useState(NaN);

useEffect(() => {
const fetchPrice = () => {
window.fetch('http...')
.then(response => response.json())
.then(data => setPrice(data.price))
}
const intervalId = setInterval(fetchPrice, 200)
return () => clearInterval(intervalId)
}, [])

return <myContext.Provider value={price}>{children}</myContext.Provider>;
};

const StockPriceConsumer = () => {
const stockPrice = useContext(myContext);
return <h1>{stockPrice}</h1>;
};

...作为原始方法中几个问题的解决方案:

  1. 你真的只想获取val吗?是不同的?如果 2 次渲染之间的股票价格相同,则不会执行 useEffect。
  2. 你需要创建一个新的fetch吗?每次方法<StockPriceProvider>被渲染?这确实不适合 useEffect 的依赖。

    • 如果两者都正常,请随意禁用 eslint 警告
    • 如果您希望在挂载消费者后继续以 200 毫秒为间隔进行抓取:
  // StockPriceProvider
...
fetch: useCallback(() => dispatch({type: 'fetch', payload: 200}), [])
...
// StockPriceConsumer
...
useEffect(() => {
const i = setInterval(fetch, 200)
return () => clearInterval(i)
}, [fetch])
...

关于reactjs - 我可以忽略 useContext 的 exhaustive-deps 警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61969259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com