![](/img/trans.png)
[英]React hooks loses updated value of state variable inside cleanup function of useEffect
[英]Variable is not updated inside a function (using react hooks)
我有這個代碼
export const SearchWidget = memo(() => {
. . .
const requestedProduct = useSelector(state => state.coverage.requestedProduct);
. . .
const addSearchWidget = () => {
search = new Search({
view: mapView,
sources: [
locatorSearchResource
],
container: searchContainer.current
});
search.on('select-result', (data) => {
dispatch(actions.registerFoundLocation({
id: generateUniqueId(),
x: attr.x,
y: attr.y,
product: requestedProduct // <--- Always old value,
// not updated from redux store!!! How to update it?
}));
});
}
useEffect(() => {
addSearchWidget();
}, []);
return <div ref={searchContainer} />;
});
在調度調用變量“requestedProduct”中總是有舊值,它是在初始化時得到的。
如何獲得“requestedProduct”的當前值?
您需要將requestedProduct
作為依賴項傳遞給 useEffect 以便您的訂閱獲得更新的值。
useEffect(() => {
addSearchWidget();
}, [requestedProduct]);
或者您可以將創建和訂閱拆分為單獨的效果
export const SearchWidget = memo(() => {
. . .
const requestedProduct = useSelector(state => state.coverage.requestedProduct);
. . .
let search = null;
useEffect(() => {
search = new Search({
view: mapView,
sources: [
locatorSearchResource
],
container: searchContainer.current
});
}, [])
useEffect(() => {
search.on('select-result', (data) => {
dispatch(actions.registerFoundLocation({
id: generateUniqueId(),
x: attr.x,
y: attr.y,
product: requestedProduct
}));
});
}, [requestedProduct]);
return <div ref={searchContainer} />;
});
PS 此外,您必須在創建新訂閱或卸載時清除訂閱
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.