reactjs - 使用 useReducer 时,如何从 AsyncStorage 获取数据并将其添加到初始状态?
问题描述
我在 useEffect 中使用Hooks和AsyncStorage.setItem中的useContext 和 useReducer来在状态更新时保存数据。在应用程序重新加载时,我想确保使用AsyncStorage.getItem获取保存的数据并将其添加到初始状态。
我尝试将带有异步的 init 函数添加为 useReducer 的第三个属性,但它仍然没有用接收到的数据替换初始数据。请通过以下代码和帮助。
先感谢您!
我可以将数据保存到 AsyncStorage 的当前代码
const [user, dispatch] = useReducer(userReducer, {});
useEffect(() => {
AsyncStorage.setItem('user', JSON.stringify(user))
}, [user]);
return(
<UserContext.Provider value={{user,dispatch}}>
{props.children}
</UserContext.Provider>
);
}
下面是我尝试过的代码,但无法将现有数据保存为初始数据。
const getUser = async function() {
const userData = await AsyncStorage.getItem('user')
console.log("parse");
console.log(userData);
console.log("parsed data");
console.log(JSON.parse(userData));
return userData ? JSON.parse(userData) : {};
}
export const UserContext = createContext();
const UserContextProvider = (props) => {
const [user, dispatch] = useReducer(userReducer, {}, getUser);
useEffect(() => {
console.log("context");
console.log(JSON.stringify(user));
AsyncStorage.setItem('user', JSON.stringify(user))
}, [user]);
return(
<UserContext.Provider value={{user,dispatch}}>
{props.children}
</UserContext.Provider>
);
}
解决方案
谢谢!根据以下建议更新和工作代码并进行细微更改。
const getUser = async () => {
try {
const user = await AsyncStorage.getItem('user')
return user ? JSON.parse(user) : {};
} catch (e) {
console.log('Failed to fetch the data from storage');
}
}
export const UserContext = createContext();
const UserContextProvider = (props) => {
const [user, dispatch] = useReducer(userReducer, {});
// Loading initial Satte
useEffect(() => {
async function fetchUser() {
const user = await getUser();
dispatch({type: 'ADD_USER', user});
}
fetchUser();
}, []);
// Update AsyncStorage when user is updated
useEffect(() => {
// This check is required to avoid initial writing to asyncStorage
if(user) {
AsyncStorage.setItem('user', JSON.stringify(user))
}
}, [user]);
return(
<UserContext.Provider value={{user,dispatch}}>
{props.children}
</UserContext.Provider>
);
}
推荐阅读
- angular - 如何在按钮单击时动态添加角度材质扩展面板?
- dart - 如何在 Dart 中获取数字的长度?
- node.js - 快递服务器无法接受 html 表单发布
- python - 将模型关系指定为字符串与具体模型?
- json - Gson 将愉快地使用 List 制作 JSON
> 但如果列表在一个类中,则不是 - html - Outlook 中的 HTML 表单与 Post 功能
- sql - 如何合并这些将列插入表的查询
- node.js - 如何使用节点将用户数据对象与令牌一起发送到角度前端?
- javascript - 如何编写按钮以指向另一个网页并选中复选框
- android - 为什么android画布中的drawVertices需要禁用硬件加速?