reactjs - 在另一个类中反应的本地存储处理
问题描述
我有一个组件,每次将某些内容添加到状态时,也会将其添加到本地存储中。它已从 componentWillUnmnout 上的本地存储中删除。我被告知要为本地存储处理准备一个间接抽象层,以遵循单一责任原则。我很困惑如何做到这一点,有人可以举一个这样的层,类的例子吗?
componentWillUnmount() {
localStorage.removeItem('currentUser');
}
static getDerivedStateFromProps(nextProps) {
const currUser = JSON.parse(
localStorage.getItem('currentUser')
);
if (
currUser && nextProps.users.some(
(user) => user.id === currUser.id
)
) {
return {
user: currUser,
};
}
return null;
}
const onSelect = (
user
) => {
this.setState({
user,
});
localStorage.setItem('currentUser', JSON.stringify(user));
}
private onRemove = () => {
this.setState({
user: null,
});
localStorage.removeItem('currentUser');
}
解决方案
在这里应用单一职责原则可能会过度编程,因为 Javascripts 不是 OOP。但是如果你需要,直接使用有一些问题localStorage
可以分开:
- 您的组件不需要知道您存储持久数据的位置。在这种情况下,它不需要知道 localStorage 的使用情况。
- 您的组件不需要知道您如何存储数据。在这种情况下,它不需要处理
JSON.stringify
传递给 localStorage 和JSON.parse
检索。
有了这些想法,localStorage 的接口可以这样实现
const Storage = {
isReady: function() {
return !!window && !!window.localStorage;
},
setCurrentUser: function(user) {
if (!this.isReady()) throw new Error("Cannot find localStorage");
localStorage.setItem('currentUser', JSON.stringify(user));
return true;
},
getCurrentUser: function() {
if (!this.isReady()) throw new Error("Cannot find localStorage");
if (localStorage.hasOwnProperty('currentUser'))
{
return JSON.parse(localStorage.getItem('currentUser'));
}
return null;
},
removeCurrentUser: function() {
if (!this.isReady()) throw new Error("Cannot find localStorage");
localStorage.removeItem('currentUser');
return true;
}
}
通过导入Storage
对象,您可以重写您的组件:
componentWillUnmount() {
Storage.removeCurrentUser();
}
static getDerivedStateFromProps(nextProps) {
const currUser = Storage.getCurrentUser();
if (
currUser && nextProps.users.some(
(user) => user.id === currUser.id
)
) {
return {
user: currUser,
};
}
return null;
}
const onSelect = (
user
) => {
this.setState({
user,
});
Storage.setCurrentUser(user);
}
private onRemove = () => {
this.setState({
user: null,
});
Storage.removeCurrentUser();
}