React Hooks createContext:当它是数组时如何更新 UserContext?
React Hooks createContext: How to update UserContext when its an array?
我的 UserContext 组件中有状态:
var initialState = {
avatar: '/static/uploads/profile-avatars/placeholder.jpg',
markers: []
};
var UserContext = React.createContext();
function setLocalStorage(key, value) {
try {
window.localStorage.setItem(key, JSON.stringify(value));
} catch (errors) {
// catch possible errors:
console.log(errors);
}
}
function getLocalStorage(key, initialValue) {
try {
const value = window.localStorage.getItem(key);
return value ? JSON.parse(value) : initialValue;
} catch (e) {
// if error, return initial value
return initialValue;
}
}
function UserProvider({ children }) {
const [user, setUser] = useState(() => getLocalStorage('user', initialState));
const [isAvatarUploading, setIsAvatarUploading] = useState(true);
并返回一个更新数组的函数:
return (
<UserContext.Provider
value={{
userMarkers: user.markers,
setUserMarkers: markers => setUser({ ...user, markers }),
}}
>
{children}
</UserContext.Provider>
);
在我的消费函数中,我试图使用该函数来 添加 一个对象到初始数组,即标记。
export default function MyMap() {
var { userMarkers, setUserMarkers } = useContext(UserContext);
假设上面有一个操作改变了这个值:
setUserMarkers({"id":1,"lat":40.73977053760343,"lng":-73.55357676744462});
发生的事情是旧对象被完全覆盖。所以数组会更新为一个新对象。未添加。请帮忙。我也试过 concat 但它没有用?
setUserMarkers: markers => setUser(()=> user.markers.concat(markers)),
所以标记应该是:
markers: [{"id":0,"lat":40.73977033730345,"lng":-66.55357676744462},{"id":1,"lat":40.73977053760343,"lng":-73.55357676744462}]
像这样调用您的函数以获取先前的值并附加到它。
setUserMarkers([...userMarkers, {"id":1,"lat":40.73977053760343,"lng":-73.55357676744462}])
如果您永远不需要覆盖其中的值,您还可以将函数调用更新为始终追加。然后你可以用新值调用它。
setUserMarkers: markers => setUser({ ...user, markers: [...user.markers, markers] }),
我的 UserContext 组件中有状态:
var initialState = {
avatar: '/static/uploads/profile-avatars/placeholder.jpg',
markers: []
};
var UserContext = React.createContext();
function setLocalStorage(key, value) {
try {
window.localStorage.setItem(key, JSON.stringify(value));
} catch (errors) {
// catch possible errors:
console.log(errors);
}
}
function getLocalStorage(key, initialValue) {
try {
const value = window.localStorage.getItem(key);
return value ? JSON.parse(value) : initialValue;
} catch (e) {
// if error, return initial value
return initialValue;
}
}
function UserProvider({ children }) {
const [user, setUser] = useState(() => getLocalStorage('user', initialState));
const [isAvatarUploading, setIsAvatarUploading] = useState(true);
并返回一个更新数组的函数:
return (
<UserContext.Provider
value={{
userMarkers: user.markers,
setUserMarkers: markers => setUser({ ...user, markers }),
}}
>
{children}
</UserContext.Provider>
);
在我的消费函数中,我试图使用该函数来 添加 一个对象到初始数组,即标记。
export default function MyMap() {
var { userMarkers, setUserMarkers } = useContext(UserContext);
假设上面有一个操作改变了这个值:
setUserMarkers({"id":1,"lat":40.73977053760343,"lng":-73.55357676744462});
发生的事情是旧对象被完全覆盖。所以数组会更新为一个新对象。未添加。请帮忙。我也试过 concat 但它没有用?
setUserMarkers: markers => setUser(()=> user.markers.concat(markers)),
所以标记应该是:
markers: [{"id":0,"lat":40.73977033730345,"lng":-66.55357676744462},{"id":1,"lat":40.73977053760343,"lng":-73.55357676744462}]
像这样调用您的函数以获取先前的值并附加到它。
setUserMarkers([...userMarkers, {"id":1,"lat":40.73977053760343,"lng":-73.55357676744462}])
如果您永远不需要覆盖其中的值,您还可以将函数调用更新为始终追加。然后你可以用新值调用它。
setUserMarkers: markers => setUser({ ...user, markers: [...user.markers, markers] }),