localStorage 与 sessionStorage
localStorage 与 sessionStorage 很多小伙伴对它们俩都很熟悉了;
最熟悉的莫过下面这2条
1,localStorage 存储的数据没有时间限制,理论上永久有效;除非手动清除。
sessionStorage 存储的数据在关闭当前页面后失效;
2,有存储大小限制,两者存储大约5MB,但实际大小可能会因浏览器而异。
但是下面的这2条小伙伴不一定知道。
2,localStorage可以被storage监听到,但是sessionStorage不能监听到。
3,在地址复制url到另外一个窗口,localStorage的数据会被复制一份,
但是sessionStorage中的数据不会被复制;
下面我们一起来看下

localStorage 可以监听到数据变化

就是浏览器打开了一个页面A,点击A页面会在浏览中打开一个新创建的页面B;
点击B页面的推荐功能,A页面的推荐数据也会实时跟新。

简单的思路

我们的相关是vue技术栈;
我们需要在A页面监听 localStorage 的变化
监听
window.addEventListener('storage',(storageData)=>{
console.log(storageData)
})
storageData这个参数中有newValue,和oldValue;以及key
newValue:新值;oldValue:旧值
key是我们存储的key,通过key可以判断是否是我们监听的那个对象
我们获取到新值后只需要重新赋值即可;
在B页面中,如果用户点击了推荐;
我们就需要把新值存储到localStorage中

监听 localStorage数据的变化

A页面代码

<template>
<div>
<div >
<div @click="goToPages" class="item-box">
<h4>{{infoObj.time }}</h4>
<span>喜欢{{infoObj.like }}</span>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
infoObj: {time:'【2024】前端,该卷什么呢?', id:'7329126541320536074', like:244},
}
},
created(){
},
methods:{
goToPages(){
// 监听 storage 事件
window.addEventListener('storage',(storageData)=>{
if(storageData.key == this.infoObj.id){
// 获取到变化后的新值
let obj = JSON.parse(storageData.newValue)
// 重新赋值
this.infoObj.like = obj.like
}
console.log(storageData)
})
// 通过 setItem 存储在 localStorage 中,接受2个参数 key 和 value
localStorage.setItem(this.infoObj.id,JSON.stringify(this.infoObj))
const {href} = this.$router.resolve({
path: "/details",
query:{
id:this.infoObj.id
}
});
// 新窗口打开页面
window.open(href, '_blank');
}
},
}
</script>
<style scoped lang="scss">
.item-box{
display: flex;
padding-left: 20px;
box-sizing: border-box;
height: 100px;
line-height: 100px;
background-color: azure;
margin-bottom:10px;
span{
display: inline-block;
margin-left: 10px;
}
}
</style>

B页面代码

<template>
<div>
<div >
<div class="item-box">
<h4>{{details.time }}</h4>
<!-- 只能触发一次 once-->
<span @click.once="addLikeHandler">喜欢{{details.like }}</span>
</div>
</div>
</div>
</template> <script>
export default {
data() {
return {
details:{}
}
},
mounted() {
this.getDetails()
},
methods:{
getDetails(){
// 获取数据
const details = JSON.parse( localStorage.getItem(this.$route.query.id))
this.details = details
},
addLikeHandler(){
this.details.like = this.details.like + 1
// 用户点击喜欢后,重新存储在 localStorage 中,这样A页面就可以监听了
localStorage.setItem(this.$route.query.id,JSON.stringify(this.details))
},
}
}
</script>

监听storage无法知晓sessionStorage数据的变化

上面的代码我们只需要将localStorage改成sessionStorage即可,
我们看下页面效果;发现监听storage无法知晓sessionStorage数据是否发生变化;
无论打开是否有_blank这属性;都是无法监听sessionStorage数据变化的。
再次提醒:监听storage无法知晓sessionStorage数据的变化

在地址复制url到另外一个窗口,localStorage和sessionStorage表现如何?

在地址复制url到另外一个窗口,
localStorage的数据会被复制一份。
但是sessionStorage中的数据不会被复制;

sessionStorage -数据不会被复制



localStorage-数据会被复制

window.open()的方式打开窗口,localStorage 和 sessionStorage表现如何?

localStorage的数据会被复制一份。
但是sessionStorage中的数据也会被复制;
无论是否是 window.open(href)还是window.open(href, '_blank')

localStorage设置过期时间

为啥要写这个,因为很多面试官都喜欢问。
设置过期的时间的基本思路是:在存储的时候,设置一个有效期的时间戳;
通过new Date().getTime() + 我们的有效时间
在读取的时候,
如果当前时间戳大于存储时设置的时间戳,说明已经过期;
需要移除当前这条Storage数据,返回 null;
如果当前时间戳小于存储时设置的时间戳;没有过期,正常返回;
class Storage {
/**
* key表示设置的key值,value存储的时候,time有效期单位分钟
*/
setItem(key, value, minuteTime){
let expires = 0
if(minuteTime){
// 计算存储时的有效时间需要转化为毫秒
expires = new Date().getTime() + minuteTime * 1000 * 60
}
let storageData = JSON.stringify({value, expires})
localStorage.setItem(key, storageData) // 存储数据
}
getItem(key){
const item = localStorage.getItem(key)
const getData = JSON.parse(item)
if(!getData){
return null
}
// 说明已经过期了
if(getData.expires < new Date().getTime()){
// 移除 Storage
this.removeItem(key)
return null
}
return getData.value
}
// 移除 Storage
removeItem(key){
localStorage.removeItem(key)
}
}
export const storage = new Storage()

使用的时候

import {storage} from './storage.js'
// 设置storage有效时间
storage.setItem('info',this.infoObj, 1)
// 读取storage数据
const details = storage.getItem('info')

尾声

如果阅读后,有所收获;
可以给我点个推荐吗? 也可以打赏我
感谢了!

重写学习 localStorage 与 sessionStorage的更多相关文章

  1. (转)HTML5开发学习(2):本地存储之localStorage 、sessionStorage、globalStorage

    原文:http://www.cnblogs.com/xumingxiang/archive/2012/03/25/2416386.html HTML5开发学习(2):本地存储之localStorage ...

  2. HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)

    一.HTML4客户端存储 B/S架构的应用大量的信息存储在服务器端,客户端通过请求响应的方式从服务器获得数据,这样集中存储也会给服务器带来相应的压力,有些数据可以直接存储在客户端,传统的Web技术中会 ...

  3. HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)

    HTML5问世以后,前端加入了一个重要的功能,便是本地存储,本地存储可分为4类: Local Storage:总的存储量有所限制,并不能提供真正的检索API,数据的生命期比窗口或浏览器的生命期长,数据 ...

  4. localStorage,sessionStorage的方法重写

    本文是针对于localStorage,sessionStorage对于object,string,number,bollean类型的存取方法 我们知道,在布尔类型的值localStorage保存到本地 ...

  5. Cookie、Session、localStorage、sessionStorage区别和用法

    Cookie 在学习一个新知识点前,我们应该明白自己的学习目标,要带着疑问去学习,该小节须要了解 Cookies 什么是cookie,cookie的作用 cookie的工作机制,即cookie是运作流 ...

  6. 6.cookie、session,localStorage、sessionStorage

    必须在服务器下运行 cookie/session 存东西 cookie 时间 过期时间 4k 服务器把一部分数据保存在客户端(浏览器) session 回话 时间 服务器存取用户信息 5M local ...

  7. 前端cookie、localStorage、sessionStorage缓存技术总结

    转载自:https://www.cnblogs.com/belove8013/p/8134067.html 1.Cookie JavaScript是运行在客户端的脚本,因此一般是不能够设置Sessio ...

  8. web前端使用localstorage、sessionstorage、cookie增删获方法

    今天主要的学习内容是cookie与本地储存的知识, 在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别, ...

  9. localStorage、sessionStorage和cookie的区别

    本地客户端(浏览器)查看三者信息: HTML4的本地存储:cookie 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等根服务端进行数据交互. 一.co ...

  10. vuex知识笔记,及与localStorage和sessionStorage的区别

    菜单快捷导航 Vuex是什么东东,有什么应用场景?localStorage和sessionStorage能否替代它? Vuex知识点State.Getter.Mutaion.Action Vuex模块 ...

随机推荐

  1. leetcode:763. 划分字母区间

    763. 划分字母区间 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = & ...

  2. aop 阶段性概况

    前言 对aop进行一个阶段性的总结. 正文 首先什么是aop呢? 那么首先看aop的解决什么样的问题. public class Program { public static void Main(s ...

  3. Lattice高速下载器HW-USBN-2B 如何申请 license

    如果用的芯片不是停产老旧芯片,Diamond programmer 是不需要 license 绑定支持的. 但是有些需要编程老旧的芯片.需要安装 Diamond programmer stand-al ...

  4. 《c#高级编程》第2章C#2.0中的更改(四)——空值类型

    一.概念 在C#中,空值类型(Nullable Types)是一种特殊的数据类型,它可以包含正常值或者一个null值.当我们需要在程序中处理可能不存在的值时,空值类型就会派上用场. 空值类型的语法形式 ...

  5. watch对比computed

    总结:      computed和watch之间的区别:             1.computed能完成的功能,Watch都可以实现             2.watch能完成的功能,comp ...

  6. 力扣594(java&python)-最长和谐子序列(简单)

    题目: 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 . 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度. 数组的子序列是一个由数组派生出来 ...

  7. 第 6章 Python 应对反爬虫策略

    第 6章 Python 应对反爬虫策略 爬取一个网站的基本步骤 (1)分析请求:URL 规则.请求头规则.请求参数规则. (2)模拟请求:通过 Requests 库或 urllib 库来模拟请求. ( ...

  8. 压测场景下的 TIME_WAIT 处理

    简介: 压测场景下的 TIME_WAIT 处理 1. 序 某专有云项目具备压测场景,在Windows的压测机上用 LoadRunner 进行业务的压力测试,压测运行一段时间后出现大量端口无法分配的报错 ...

  9. Snowflake核心技术解读系列——架构设计

    ​简介:Snowflake取得了巨大的商业成功,技术是如何支撑起它的千亿美元市值呢?它技术强在哪?本文为大家倾情解读Snowflake的核心技术原理. 背景:2020年9月16日,Snowflake成 ...

  10. 鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)

    前言 页面转场动画是指在应用程序中,当用户导航到另一个页面时,使用动画效果来过渡页面之间的切换.这样做的目的是为了提升用户体验,使页面之间的切换更加平滑和有趣. 常见的页面转场动画包括淡入淡出.滑动. ...