为了让我们的产品更加人性化,很多时候我们需要记住用户的一些操作和设置。对于一些重要的设置,我们可以保存在服务器端,比如语言设置,优点是对于一个用户来说只需要设置一次,缺点是实现代价较大。还有大量不重要的设置,我们可以保存在浏览器端,通常通过localStorage
本地存储来保存,优点是实现方便,缺点是对于一个用户来说,每次换浏览器都需要再设置一次。今天我们就来聊一聊怎么将用户操作和设置保存localStorage
里。
假设我们有一个日历页面,该页面提供了几个视图:天视图,周视图,月视图和年视图,用户可以通过按钮组来切换。当用户切换到某个视图以后我们就保存在localStorage
里,以便当用户再次打开该页面时,我们能够自动切换到上次使用的视图。代码如下:
1 | onViewChange(view){ |
功能完成了,代码似乎也不多,但是关键信息密度特别低,我们列出关键信息如下:局部变量this.view
,本地存储键值calendar-view
,默认值week
。如果这样的代码只写一次不要紧,但是类似的需求很多,就很糟糕了。通过分析代码,我们首先看到的就是localStorage
的接口在某些极端情况下可能报错,比如超过限额等。我们可以先封装一下这个接口。
1 | // storage.js |
现在我们再来重构一下原来的文件
1 | import storage from './storage.js'; |
看起来已经很简单了,但是还是需要我们手动同步在localStorage
里,有没有什么方法能让它自动同步到localStorage
里?答案是肯定,接下里就是我们这篇文章的重点了。
装饰器(Decorator),可以作用在类,类的属性和方法上,来修改类的行为。一般用于记录日志,检查权限等通用的切面的逻辑,可以减少代码侵入性,让你更加关注于处理核心业务逻辑,可以大大减少代码量。比如我们常用的mobx
,就是通过装饰器来工作的。
1 | // store.js |
作用在属性上的装饰器写法如下:
1 | /** |
下面我们就来看看我写的用来同步数据到localStorage
里的装饰器
1 | storage.sync = function(key) { |
有了以上装饰器的实现以后,以后你再想同步某个变量到localStorage
的时候,只需要这样写
1 | class A { |
是不是非常简单,没有任何冗余信息啊?你也快来试试吧。如果你有任何问题,欢迎联系我。