木子童话 发表于 2024-7-5 21:14:58

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

在不同窗口/选项卡中监听 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('_');
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变化的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/javascript/323513cxa.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: JavaScript实时监听localStorage变化的实现方法小结