uni-app,vue,react,Trao之缓存类封装
uni-app,vue,react,Trao之缓存类封装
一,介绍与需求
1.1,介绍
缓存主要分为如下几个
1、LocalStorage
LocalStorage是永久性的本地缓存,存储在客户端的浏览器上,除非主动删除,是不会过期的。LocalStorage采用的是键值对的方式进行存储,存储方式只能是字符串。存储内容可以用图片、json、样式、脚本等。
API基本使用方法:
1.1、localStorage.setItem() 存储
1.2、localStorage.getItem() 获取数据,其中使用localStorage.valueOf()获取全部数据
1.3、localStorage.removeItem(key) 删除数据
1.4、localStorage.clear()清空全部数据,localStorage.length 获取本地存储数据数量
1.5、localStorage.key(N)获取第N个数据的key键值
2、SessionSotrage
SessionStorage用于本地存储一个会话中的数据,这些数据只有在同一个会话中的页面才能访问并且会话结束,窗口关闭后,数据就会消失。是一种会话级别的存储。
SessionStorage与localStorage 的使用方法相似
3、cookie
cookie与sessionStorage、localStorage还是有很大不同的。
3.1、cookie数据始终在同源的http请求中携带,cookie在浏览器和服务器端来回传递,而localstorage和sessionstorage不会自动把数据传送给服务器端,仅在本地保存。
3.2、存储大小限制不同,cookie的存储数据大小要求不能超过4k,每次的http请求都会携带cookie,所以保存的数据需要比较小。sessionstorage和localstorage存储数据大小限制比cookie要大,可以达到5M或者更大,不同浏览器设置可能不同。
3.3、数据生命周期。cookie的生命周期一般在其设置的过期时间之前有效。而sessionstorage仅在关闭窗口前有效,localstorage持久有效,直到手动删除。
3.4、作用域不同,sessionstorage不在不同浏览器中共享,即使是同一页面也不支持。而localstorage在所有同源窗口中都是共享的,同样,cookie在所有同源窗口中也是可以共享的。
3.5、cookie的数据还有路径的概念,可以通过设置限制cookie只属于某个路径
3.6、webstorage 支持事件通知机制,可以将数据更新的通知发送给监听者。
4、离线存储
通过创建cache mainfest文件,创建应用缓存
对浏览器来说,使用 Web Storage 存储键值对比存储 Cookie 方式更直观,而且容量更大,它包含两种:localStorage 和 sessionStorage主要有以下一些优点:
1、减少网络流量:使用webstorage将数据保存在本地中,减少不必要的请求。
2、快速显示数据:从本地获取数据比通过网络从服务器获取数据效率更高,因此网页显示也比较快;
3、临时存储:很多时候数据只需在用户浏览一组页面期间使用,关闭窗口后数据就会丢失,使用sessionstorage 比较方便;
4、不影响网络效能:因为webstorage只作用在客户端的浏览器,不会占用频宽。
uni-app缓存介绍,Trao缓存介绍,不同端的缓存可以参照相应的文档,这儿主要介绍通用类的缓存封装介绍。
1.2,需求
1,记录用户登录成功的信息,比如token等,
2,减少接口请求的次数,
3,记住密码,方便下次登录。
二,封装缓存类
第一步:新建类
新建一个叫Storage的缓存类,并提供构造函数,方便接收传入的参数。
/**
* 数据缓存类
*/
export default class Storage {
/**
* 数据缓存类构造方法
* @param appKey 用于存储数据时键名的前缀
* @param storage 本地存储或会话存储
*/
constructor(appKey, storage) {
this.__storage = storage || localStorage;
this.__appKey = appKey ? appKey + '-' : '';
}
}
第二步:保存数据到本地
在上面类中添加保存数据到本地的方法,并提交有效期,如下:
/**
* 存储数据
* @param key 键名
* @param v 键值
* @param expire 有效期, ms 单位
* @param merge 新旧数据是否合并
*/
setStorageSync(key, v, expire, merge) {
const { __storage, __appKey } = this;
var str = merge ? { v: { ...{ v: this.getStorageSync(key) }, ...{ v } } } : { v: { v } };
if (expire) {
str.t = Date.now() + expire;
}
__storage.setStorageSync(__appKey + key.toString(), JSON.stringify(str));
}
第三步:获取数据
/**
* 获取数据
* @param key 键名
* @returns 返回键值, 如果过期则为空
*/
getStorageSync(key) {
const { __storage, __appKey } = this;
const k = __appKey + key.toString();
var obj = __storage.getStorageSync(k) ? JSON.parse(__storage.getStorageSync(k)) : undefined;
if (obj && obj.t && obj.t < Date.now()) {
__storage.removeStorageSync(k);
return;
}
return obj && obj.v && obj.v.v;
}
以上两步是主要的缓存类常用的方法,存取操作,下面两部将介绍删除方法
第四步:删除数据
根据指定的key值,删除指定的缓存数据
/**
* 删除存储的数据
* @param key
*/
removeStorageSync(key) {
const { __storage, __appKey } = this;
const k = __appKey + key.toString();
__storage.removeStorageSync(k);
}
第五步:清空所有缓存数据
/**
* 清空数据
*/
clear() {
const { __storage, __appKey } = this;
Object.keys(__storage).forEach(k => k.indexOf(__appKey) === 0 && __storage.removeStorageSync(k));
}
第六步:完整代码storage.js
/**
* 数据缓存类
* @author jackson影琪
* @date 2019-11-07
* @param appKey 用于存储数据时键名的前缀
* @param storage 本地存储或会话存储
**/
export default class Storage {
/**
* 数据缓存类构造方法
* @param appKey 用于存储数据时键名的前缀
* @param storage 本地存储或会话存储
*/
constructor(appKey, storage) {
this.__storage = storage || localStorage;
this.__appKey = appKey ? appKey + '-' : '';
} /**
* 存储数据
* @param key 键名
* @param v 键值
* @param expire 有效期, ms 单位
* @param merge 新旧数据是否合并
*/
setStorageSync(key, v, expire, merge) {
const { __storage, __appKey } = this;
var str = merge ? { v: { ...{ v: this.getStorageSync(key) }, ...{ v } } } : { v: { v } };
if (expire) {
str.t = Date.now() + expire;
}
__storage.setStorageSync(__appKey + key.toString(), JSON.stringify(str));
} /**
* 获取数据
* @param key 键名
* @returns 返回键值, 如果过期则为空
*/
getStorageSync(key) {
const { __storage, __appKey } = this;
const k = __appKey + key.toString();
var obj = __storage.getStorageSync(k) ? JSON.parse(__storage.getStorageSync(k)) : undefined;
if (obj && obj.t && obj.t < Date.now()) {
__storage.removeStorageSync(k);
return;
}
return obj && obj.v && obj.v.v;
} /**
* 删除存储的数据
* @param key
*/
removeStorageSync(key) {
const { __storage, __appKey } = this;
const k = __appKey + key.toString();
__storage.removeStorageSync(k);
} /**
* 清空数据
*/
clear() {
const { __storage, __appKey } = this;
Object.keys(__storage).forEach(k => k.indexOf(__appKey) === 0 && __storage.removeStorageSync(k));
}
}
三,缓存类调用
常用有效期时间定义,可根据需求自动选择
export const MINUTES: number = 60000;
export const HOURS: number = 60 * MINUTES;
export const DAY: number = 24 * HOURS;
export const WEEK: number = 7 * DAY;
export const MONTH: number = 30 * DAY;
3.1,web端调用(react,vue)
在web端调用封装的类
import Storage from '../utils/storage'; export const localCache = new Storage('jackson', window.localStorage);
export const sessionCache = new Storage('jackson', window.sessionStorage);
比如记住密码使用localCache;sessionCache的使用与localCache类似,WEEK设置记住用户密码的有效期为一周
import { localCache, WEEK } from './index'; const KEY = 'loginRemember'; export default function cache(loginRemember) {//有参数 并且是有效的 则是存储,否则是获取
return loginRemember ? localCache.setItem(KEY, loginRemember, WEEK) : localCache.getItem(KEY);
}
cache.clear = function () {
localCache.removeItem(KEY);
};
3.2,uni-app调用(vue)
在uni-app中调用封装的类
import Storage from '../utils/storage'; const UniStorage: object = {
setStorageSync: uni.setStorageSync,
getStorageSync: uni.getStorageSync,
removeStorageSync: uni.removeStorageSync,
}
export const StorageSync: object = new Storage('jackson', UniStorage);
比如记住登陆的token
import { StorageSync, MINUTES } from './index'; const KEY: string = 'setToken'; export default function cache(setToken: any) {
return setToken ? (StorageSync as any).setStorageSync(KEY, setToken, MINUTES) : (StorageSync as any).getStorageSync(KEY);
}
cache.clear = function () {
(StorageSync as any).removeStorageSync(KEY);
};
3.3,Taro调用(类react)
taro的使用与uni-app类似
import Taro from '@tarojs/taro';
import Storage from '../utils/storage'; const TaroStorage: object = {
setStorageSync: Taro.setStorageSync,
getStorageSync: Taro.getStorageSync,
removeStorageSync: Taro.removeStorageSync,
}
export const StorageSync: object = new Storage('jackson', TaroStorage);
比如记住用户密码多久
import { StorageSync, MINUTES } from './index'; const KEY: string = 'loginRemember'; export default function cache(loginRemember: any) {
return loginRemember ? (StorageSync as any).setStorageSync(KEY, loginRemember, MINUTES) : (StorageSync as any).getStorageSync(KEY);
}
cache.clear = function () {
(StorageSync as any).removeStorageSync(KEY);
};
以上缓存方法的调用皆是传参并且有效,表示是存储数据,否则是获取缓存的数据;调用clear则是清除数据
loginRemember.clear();//清除指定的key的数据
下一章->待定
uni-app,vue,react,Trao之缓存类封装的更多相关文章
- 前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化
github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手 ...
- 从DOM操作看Vue&React的前端组件化,顺带补齐React的demo
前言 接上文:谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo 上次写完博客后,有朋友反应第一内容有点深,看着迷迷糊糊:第二是感觉没什么使用场景,太过业务化,还不如直接写Vue ...
- Hybrid App 和 React Native 开发那点事
简介:Hybrid App(混合模式移动应用)开发是指介于Web-app.Native-App这两者之间的一种开发模式,兼具「Native App 良好用户交互体验的优势」和「Web App 跨平台开 ...
- 内置组件 && vue中强大的缓存机制之keep-alive
vue中强大的缓存机制之keep-alive 最近在用vue做项目,在切换页面时发现切换回原来的页面无法保存原来的状态. 如A页面需要ajax请求数据,然后切换到B页面做某些事情,再切换回A页面时,A ...
- 三种Web前端框架比较与介绍--Vue, react, angular
一.Angular 1.MVVM(Model)(View)(View-model): 2.模块化(Module)控制器(Contoller)依赖注入: 3.双向数据绑定:界面的操作能实时反映到数据,数 ...
- uni app 零基础小白到项目实战-1
uni-app是一个使用vue.js开发跨平台应用的前端框架. 开发者通过编写vue.js代码,uni-app将其编译到Ios,android,微信小程序等多个平台,保证其正确并达到优秀体验. Uni ...
- 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
- 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。
转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序 在开发过程中,client 和 server 数据交流一 ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式
以静态缓存为例. 修改 file.php line:11 去掉 path 参数(方便),加上缓存时间参数: public function cacheData($k,$v = '',$cacheTim ...
随机推荐
- Spring Data Jpa一对多单向映射
/** @author StormMaybin @date 2017-01-17 */ 生命不息,奋斗不止! 一对多映射关系 在JPA中,用@OneToMany来标识一对多的关系.实现一对多的单向关联 ...
- Mysql5.7在忘记密码的情况下如何修改密码?
1.停止服务 2.mysqld --skip-grant-tables 3.回车之后就不要动了,再新打开一个命令提示符窗口,同样进入mysql的安装目录下, 输入:mysql -u root -p 密 ...
- P1028 过河问题
题目描述 为了躲避黑暗大魔王的追杀,zifeiy与他的伙伴们共N人连夜逃出了黑暗城堡,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时间T ...
- linux seqlock 锁
内核包含了一对新机制打算来提供快速地, 无锁地存取一个共享资源. seqlock 在这 种情况下工作, 要保护的资源小, 简单, 并且常常被存取, 并且很少写存取但是必须要快. 基本上, 它们通过允许 ...
- Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- CF1209
CF1209 A B 水题不管 C 因为要求最终整个序列是要单调的 所以我们就考虑枚举断点$x$ 之后把$<x$的数放到第一个集合 把$> x$的数放到第二个集合 至于$=x$的数 他能放 ...
- codeforces 1194F (组合数学)
Codeforces 11194F (组合数学) 传送门:https://codeforces.com/contest/1194/problem/F 题意: 你有n个事件,你需要按照1~n的顺序完成这 ...
- Libra和中国央行数字货币(DCEP)的对比
最近偶然和朋友讨论起Libra,对Libra和央行的数字货币方案很感兴趣.梳理了阅读资料(参考见文末)和自己的思考,发知乎留个记录. Libra 是什么? 无国界货币 + 为全球数十亿人服务的金融基础 ...
- Go处理PDF
工作中经常会遇到一些pdf文件处理的问题,一千种pdf有一千种处理方式,每次都是绞尽脑汁和这些pdf战斗到底. 本人又是一个gopher,所以这篇文章会以一个goper的视角,列举一下我所经历过的每一 ...
- 老板让阿粉学习 flink 中的 Watermark,现在他出教程了
1 前言 在时间 Time 那一篇中,介绍了三种时间概念 Event.Ingestin 和 Process, 其中还简单介绍了乱序 Event Time 事件和它的解决方案 Watermark 水位线 ...