【发布时间】:2020-05-28 13:05:01
【问题描述】:
我有一个MarketOverview 组件,它呈现了一堆加密货币交易对市场。在初始化时,我希望它默认呈现BTC/USD 市场,我正在通过useEffect() 执行此操作。问题是每次渲染都会调用defaultMarket。此外,defaultMarket 依赖于 tickers 属性,所以如果我将它包装在 useMemo() 中,那么 eslint react-hooks 插件会自动填充 tickers 作为依赖项。
没有useMemo():
const defaultMarket = tickers.find((ticker) => {
return ticker.market_id === "BTC-USD";
});
与useMemo():
const defaultMarket = useMemo(
() =>
tickers.find((ticker) => {
return ticker.market_id === "BTC-USD";
}),
[tickers]
);
整个组件:
export const MarketOverview = memo(({ tickers }: TProps) => {
// Set default market on initialisation to BTC/USD
const defaultMarket = tickers.find((ticker) => {
return ticker.market_id === "BTC-USD";
});
const [selectedMarket, setSelectedMarket] = useState<ITicker | undefined>(
undefined
);
useEffect(() => {
setSelectedMarket(defaultMarket);
}, [defaultMarket]);
// Select market
const selectMarket = (market: ITicker) => {
history.push(`${PUBLIC_URL}/markets/${market.market_id}`);
setSelectedMarket(market);
};
return (
<div className="market-overview-container">
<MarketSelector
tickers={tickers}
selectMarket={selectMarket}
selectedMarket={selectedMarket}
/>
{selectedMarket && <MarketStats selectedMarket={selectedMarket} />}
</div>
);
});
【问题讨论】:
标签: reactjs react-hooks react-usememo