你可能不知道的LocalStorage用法

简介: 你可能不知道的LocalStorage用法

写在前面


上周在看关于react-redux的一个在线ppt时,偶然发现了一个现象:

如果我开两个浏览器tab,同时访问这个页面,我在其中一个页面切换ppt,另外一个页面会跟着变化。文章链接在这里:


https://blog.isquaredsoftware.com/presentations/2019-06-react-redux-deep-dive/#/6

640.gif


研究了一下,这个效果其实是用localStorage来实现的。


LocalStorage基本知识点


localStorage, 是一个用来做本地持久化存储的Web Api。localStorage以键值对的形式存储数据。用法很简单:


// 设置localStorage.setItem('myCat', 'Tom');
// 获取let cat = localStorage.getItem('myCat');
// 移除localStorage.removeItem('myCat');
// 移除所有localStorage.clear();


有几个点需要注意:

1、localStorage是以『源(origin)』为维度进行存储的。也就是说,跨域访问其他站点的localStorage是行不通的。

2、localStorage是以字符串的形式保存数据的。

3、对于每一个域,localStorage最多允许存储几M数量级的数据(具体数字因浏览器而异)。


localStorage可以用来做什么:

存储登录token,用户信息等数据;本地持久化保存业务数据;保存代码,以提高网站性能。等等等等…还有本文所要介绍的页面同步。


监听LocalStorage变化


localStorage被改变时(从无到有,从有到无,值改变),会触发一个storage事件。我们可以在window上监听到这个事件。


window.addEventListener('storage', () => {  ...});
window.onstorage = () => {  ...};


这里需要注意的是,在改变localStorage的当前页面,是无法监听到storage事件的。如果我同时打开了多个同源的页面: A页面、B页面、C页面,当在A页面中修改localstorage时,B页面和C页面中都可以监听到storage事件,而A页面是不会触发storage事件的。


一个storage事件的实例如下:

640.jpg


其中比较关键的是keynewValueoldValue这几个值。key表示的是被改变的localStorage的key值,newValue是改变后最新的值,oldValue是旧的值。


实现两个页面同步的效果


了解了上面的知识点,就可以解释本文开头所提到的网页是如何实现多页面同步的了。来实现一个简单的


<html><head>    <style>        .count {            font-size: 20px;            color: red;        }</style></head><body>    <div class="count">0</div>    <button>click</button>    <script>        window.onload = function () {                      var btnEl = document.querySelector('button');            var countEl = document.querySelector('.count');
            btnEl.addEventListener('click', function () {                var curCount = Number(localStorage.getItem('count'));                var newCount = curCount + 1;                countEl.innerHTML = newCount;                localStorage.setItem('count', newCount);            });
            window.addEventListener('storage', function (e) {                var newValue = e.newValue;                countEl.innerHTML = newValue;            });        }</script></body>
</html>


效果如下:

640.gif


写在后面


在平时的业务开发中,localStorage使用的频率也不低,但确实是不知道还可以这么用。以后有遇到页面同步的需求时,localStorage也可以作为一个选项了。符合预期。

相关文章
|
Oracle NoSQL 安全
阿里云Linux服务器安装JDK运行环境教程
今天先跟大家聊聊最基本的jdk运行环境部署安装,后续再跟大家分享一些更加复杂的项目环境部署,比如oracle数据库安装、redis非关系型数据库安装、以及项目的部署等等,闲话也不说,接下来我们来看要怎样操作吧!
7209 3
|
机器学习/深度学习 数据采集 数据挖掘
深度学习之地形分类与变化检测
基于深度学习的地形分类与变化检测是遥感领域的一个关键应用,利用深度学习技术从卫星、无人机等地球观测平台获取的遥感数据中自动分析地表特征,并识别地形的变化。这一技术被广泛应用于城市规划、环境监测、灾害预警、土地利用变化分析等领域。
758 1
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云瑶池在2024云栖大会上重磅发布由Data+AI驱动的多模数据管理平台DMS:OneMeta+OneOps,通过统一、开放、多模的元数据服务实现跨环境、跨引擎、跨实例的统一治理,可支持高达40+种数据源,实现自建、他云数据源的无缝对接,助力业务决策效率提升10倍。
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
1341 1
|
存储 NoSQL 关系型数据库
NoSQL 数据库的优缺点?
NoSQL 数据库的优缺点?
483 4
|
JavaScript
Vue.js中使用.prevent和.stop修饰符
Vue.js中使用.prevent和.stop修饰符
|
存储 JSON 资源调度
vue3怎么使用i18n
vue3怎么使用i18n
696 5
|
JavaScript 搜索推荐
vue【详解】props —— 子组件接收父组件传入的参数
vue【详解】props —— 子组件接收父组件传入的参数
469 0
|
人工智能 监控 数据可视化
智慧工地全套源代码 智慧工地信息化管理平台源码(PC端+移动端+可视化数据大屏端)
v智慧工地全套源代码 智慧工地信息化管理平台源码(PC端+移动端+可视化数据大屏端)
890 2
【MFAC】基于紧格式动态线性化的无模型自适应控制(Matlab代码)
【MFAC】基于紧格式动态线性化的无模型自适应控制(Matlab代码)