JavaScript实时监听localStorage变化的实现方法小结

 更新时间:2024年06月30日 13:35:49   作者:接着奏乐接着舞。  
很多时候,我们在A页面通过点击之类的操作获得一个数值,然后拿到B页面使用,我们希望这个值是响应式的,当然你可以使用vue或者react的实现,这篇文章适合想偷懒或者很多后端小伙不愿意去用的使用,效果是差不多的主要是适用于任何基于JavaScript的项目,需要的朋友可以参考下

在不同窗口/选项卡中监听 localStorage 变化

当 localStorage 的数据在一个窗口/选项卡中改变时,其他同源的窗口/选项卡会触发 storage 事件。我们可以利用这个事件来监听 localStorage 的变化。

示例代码

// 添加 storage 事件监听器
window.addEventListener('storage', function(event) {
  if (event.key === 'groupID') {
    console.log('New value:', event.newValue);
  }
});

解释

  • storage 事件会在同源的其他窗口/选项卡中触发。
  • event.key 是变化的 localStorage 项的键。
  • event.newValue 是变化后的新值。

注意事项

  • 只有在不同的窗口/选项卡之间修改 localStorage 时,才会触发 storage 事件。
  • 如果在同一个窗口/选项卡中修改 localStorage,则不会触发 storage 事件。

在同一个窗口/选项卡中监听 localStorage 变化

在同一个窗口/选项卡中,storage 事件不会被触发。我们可以通过自定义事件或其他手段来实现对 localStorage 变化的监听。

方法一:使用自定义事件

  • 设置 localStorage 并触发自定义事件
function setLocalStorageItem(key, value) {
  localStorage.setItem(key, value);
  const event = new CustomEvent('localStorageChange', { detail: { key, value } });
  window.dispatchEvent(event);
}
  • 监听自定义事件
window.addEventListener('localStorageChange', function(event) {
  if (event.detail.key === 'groupID') {
    console.log('New value:', event.detail.value);
  }
});

方法二:使用定时器轮询

另一种方法是在一定时间间隔内轮询 localStorage 的值,检查是否发生变化。

let lastValue = localStorage.getItem('groupID');

setInterval(function() {
  const newValue = localStorage.getItem('groupID');
  if (newValue !== lastValue) {
    console.log('New value:', newValue);
    lastValue = newValue;
  }
}, 1000); // 每秒检查一次

方法三:使用 Proxy 对象

如果希望对所有的 localStorage 操作进行代理,可以使用 Proxy 对象。

const localStorageProxy = new Proxy(localStorage, {
  set(target, key, value) {
    target.setItem(key, value);
    const event = new CustomEvent('localStorageChange', { detail: { key, value } });
    window.dispatchEvent(event);
    return true;
  }
});

// 设置值时使用代理对象
localStorageProxy.groupID = 'newValue';

// 监听自定义事件
window.addEventListener('localStorageChange', function(event) {
  if (event.detail.key === 'groupID') {
    console.log('New value:', event.detail.value);
  }
});

示例:通过 localStorage 监听实现页面间通信

假设我们有两个页面,页面A设置 localStorage 中的 groupID 值,页面B监听 groupID 的变化并根据最新的值执行相应的逻辑。

页面A:设置 localStorage 并触发自定义事件

const sss = (node, data) => {
  let id = data.id.split('_')[1];
  alert(id);

  localStorage.setItem('groupID', id);
  // 手动触发自定义事件
  const event = new CustomEvent('localStorageChange', { detail: { key: 'groupID', value: id } });
  window.dispatchEvent(event);
};

页面B:监听自定义事件并获取最新的 groupID 值

mounted() {
  let _this = this;

  // 初次加载时获取数据
  _this.getData();

  // 使用自定义事件监听 groupID 变化
  window.addEventListener('localStorageChange', function(event) {
    if (event.detail.key === 'groupID') {
      alert('1');
      _this.getData();
    }
  });
},

methods: {
  async getData() {
    const id = localStorage.getItem('groupID');

    // 检查 id 是否存在
    if (!id) {
      this.$message({
        message: 'Group ID 不存在,请先选择一个组。',
        type: 'warning'
      });
      return;
    }

    try {
      const res = await traffic.trafficvulndel({
        page: this.formData.page_num,
        size: this.pageSize,
        search: this.formData.search_field,
        groupID: id,
        ...this.formData
      });
      
      if (res.code === 200) {
        this.tableData = res.data.assetsInfo;
        console.log(this.tableData, 'this.tableData');
        this.totalpage = res.data.count;
      } else {
        this.$message({
          message: res.msg,
          type: 'error'
        });
      }
    } catch (error) {
      console.log(error);
      this.$message({
        message: '请求失败,请稍后再试。',
        type: 'error'
      });
    }
  }
}

以上就是JavaScript实时监听localStorage变化的实现方法小结的详细内容,更多关于JavaScript监听localStorage变化的资料请关注脚本之家其它相关文章!

相关文章

  • Javascript中字符串相关常用的使用方法总结

    Javascript中字符串相关常用的使用方法总结

    本篇文章主要介绍了Javascript中字符串相关常用的使用方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • JavaScript精炼之构造函数 Constructor及Constructor属性详解

    JavaScript精炼之构造函数 Constructor及Constructor属性详解

    对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)
    2015-11-11
  • 基于JS实现网页中的选项卡(两种方法)

    基于JS实现网页中的选项卡(两种方法)

    这篇文章主要介绍了用js语句实现网页中的选项卡(两种方法),非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • js数组与字符串的相互转换方法

    js数组与字符串的相互转换方法

    这篇文章主要介绍了js数组与字符串的相互转换方法,是js中常用的技巧,需要的朋友可以参考下
    2014-07-07
  • 前端获取设备视频流踩坑实战记录

    前端获取设备视频流踩坑实战记录

    在前端开发中,使用JavaScript读取视频流并将其保存为视频文件是一个常见的需求,尤其是在涉及用户上传、本地处理和下载的场景中,这篇文章主要介绍了前端获取设备视频流踩坑实战的相关资料,需要的朋友可以参考下
    2026-02-02
  • Packer 3.0 JS压缩及混淆工具 下载

    Packer 3.0 JS压缩及混淆工具 下载

    Packer 3.0 JS压缩及混淆工具 下载...
    2007-05-05
  • JS利用时间戳倒计时的实现示例

    JS利用时间戳倒计时的实现示例

    这篇文章主要介绍了JS利用时间戳倒计时的实现示例,本文将提供代码示例和详细的步骤,帮助你实现一个简单而实用的时间戳倒计时,感兴趣的可以了解一下
    2023-12-12
  • Bootstrap CSS布局之表格

    Bootstrap CSS布局之表格

    这篇文章主要为大家详细介绍了Bootstrap CSS布局之表格的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • js/jquery解析json和数组格式的方法详解

    js/jquery解析json和数组格式的方法详解

    本篇文章主要是对js/jquery解析json和数组格式的方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • JS实现搜索关键词的智能提示功能

    JS实现搜索关键词的智能提示功能

    最近在百度搜索的时候,当你输入一个字或者词的时候,他会给你们弹出一个下拉框出来,里面是和你相关的搜索提示,效果非常人性化,基于js怎么实现搜索关键词智能提示功能,下面小编通过实例代码给大家介绍下,需要的的朋友参考下吧
    2017-07-07

最新评论