【发布时间】:2021-05-19 05:50:27
【问题描述】:
所以我正在运行具有以下设置的应用程序:
- Hook - 提供 state 和 setter 来更新状态
- 组件 A - 仅使用挂钩中的 状态 并显示其中的数据
- 组件 B - 仅使用 setter 并更新 hooks 状态
但是,在我当前的设置中,当钩子状态确实在数组中获得新项目时,组件 A 不会重新呈现,任何想法为什么会发生这种情况?我提供了一些代码进行澄清:
挂钩
const initialValue = [];
function getLocalStorageItem() {
const item = window.localStorage.getItem("queries");
return item ? JSON.parse(item) : initialValue;
}
function useLocalStorageQueryHistory() {
const { dispatch } = useAlertContext();
const [recentQueries, setRecentQueries] = useState(() => {
try {
return getLocalStorageItem();
} catch (error) {
dispatch(receiveMessageInterceptor(error));
return initialValue;
}
});
const setValue = (value) => {
try {
const recentQueries = getLocalStorageItem();
if (recentQueries.length >= 6) {
recentQueries.shift();
}
if (!recentQueries.some((query) => query.params === value.params)) {
window.localStorage.setItem(
"queries",
JSON.stringify([...recentQueries, value])
);
setRecentQueries([...recentQueries, value]);
}
} catch (error) {
dispatch(receiveMessageInterceptor(error));
}
};
return { recentQueries, setValue };
}
组件 A
function RecentQueriesContainer() {
const { recentQueries } = useLocalStorageQueryHistory();
return (
<Container disableGutters>
{recentQueries.length ? (
recentQueries.map((item) => (
<Card key={`${item.params}`}>
<CardHeader
title={item.description}
/>
<Typography variant={"body2"}>
Mode: {item.params.split("&visualization=")[1]}
</Typography>
<Typography variant={"body2"}>Unit: {item.unit}</Typography>
</Card>
))
) : (
<Typography
variant={"subtitle2"}
color={"secondary"}
align={"center"}
mt={2}
>
No recent queries available
</Typography>
)}
</Container>
);
}
组件 B
只在useEffect中使用setter
useEffect(() => {
const {
features,
description,
unit,
amountOfCountries,
} = geoJsonFromSelectedStatistic;
if (features) {
setValue({
description,
unit,
amountOfCountries,
params: window.location.search,
});
}
}, [geoJsonFromSelectedStatistic]);
【问题讨论】:
标签: javascript reactjs