从 localstorage 获取项目返回 null
2019-10-28
10100
我有一个 React 应用,如果本地存储中没有数据,它会通过数据库的 API 调用加载项目。然后,我将使用数据设置状态,并将数据加载到本地存储中。下次加载应用时,它将从本地存储中获取数据。数据在 return 语句中映射出来。
问题是,即使本地存储中有数据,它仍然返回 null。
我将从 componentDidMount 加载数据:
以下代码将运行函数“loadItems”,该函数首先检查本地存储中是否有任何数据(名称为“workItems”),如果有,则将其存储在状态中。如果没有,它将在 API 调用中调用数据库,将数据存储到状态,并将数据存储在本地存储中,下次组件安装时将使用这些数据。我已确认数据存储在浏览器中。但是当来自 localstorage 的数据存在、映射到状态并最终在渲染函数的返回中映射出来时,它会抱怨数据为“null”。怎么回事?数据存储在本地存储中,当我从开发工具检查它时,它就在那里。
componentDidMount() {
this.loadItems(false);
}
async loadItems(forcedUpdate) {
const payload = {
forcedUpdate: forcedUpdate
};
if (localStorage.getItem('workItems').length > 0) {
let data = localStorage.getItem("workItems");
this.setState({
workitems: localStorage.getItem("workItems"),
loading: false,
sources: allSources,
showSources: allSources,
}, () => {
return;
});
}
var apiUrl = "api/WorkItem/GetWorkItems";
const response = await Axios.default.post(apiUrl, payload);
console.log(response);
var allSources = response.data.items
.map(item => item.source)
.filter((value, index, self) => self.indexOf(value) === index);
this.setState({
workitems: response.data.items,
loading: false,
sources: allSources,
showSources: allSources,
failedScrape: response.data.failedscrape,
lastUpdated: response.data.lastUpdated
});
localStorage.setItem('workItems', response.data.items);
}
2个回答
localStorage.setItem(key, value)
期望值为字符串。当您传递诸如
[{id: 1}]
之类的对象时,它会将其类型转换为字符串。因此,对象变为字符串,如
"[object Object]"
。
localStorage.setItem('test', [{id: 1}]);
const item = localStorage.getItem('test');
console.log(item) // "[object Object]" a string
console.log(item[0]) // "["
console.log(item[1)) // "o"
解决方案
解决方案是在保存到 localStrage 之前将其字符串化,并在获取项目后对其进行解析。
localStorage.setItem('workItems', JSON.stringify(response.data.items));
// when you get the items
if (JSON.parse(localStorage.getItem('workItems')).length > 0)
Abdullah Danyal
2019-10-28
您可以使用 此钩子 。否则,要从本地存储获取数据,请使用以下函数:
const getValue = (key, defaultValue = {}) => {
try {
// read value from local storage
const item = window.localStorage.getItem(key);
return item ? JSON.parse(item) : defaultValue;
} catch (error) {
console.log(error);
return defaultValue;
}
}
const setValue = (key, value) => {
try {
window.localStorage.setItem(key, JSON.stringify(value));
} catch (error) {
console.log(error);
}
}
setValue("test", {test: "Test value"})
console.log(getValue("test"))
tolotra
2019-10-28