Skip to content

vuex-shared-mutations ​

在多个浏览器标签或窗口之间共享某些 vuex mutations

它是如何运行的 ​

最初,这个插件是一个小插件,用于使用 在选项卡之间共享数据localStorage。但是 Internet Explorer 中的几个不一致之处导致整个插件被重写,现在它不再与 localStorage 绑定如果您不提供策略,系统将使用BroadcastChannel(如果可用),如果失败则降级为 localStorage。

BroadcastChannel ​

BroadcastChannel Web API 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的 BroadcastChannel 对象。

Nuxt 使用流程 ​

1. 安装依赖 ​

确保已安装 vuex-shared-mutations 插件:

sh
npm install vuex-shared-mutations
# 或
yarn add vuex-shared-mutations

2. 创建一个插件文件 ​

在 plugins 文件夹中创建一个插件文件,例如 vuex-shared-mutations.js,并添加以下内容:

js
import createSharedMutations from 'vuex-shared-mutations';

export default ({ store }) => {
  if (process.client) {
    // window.onNuxtReady 是 Nuxt.js 提供的一个客户端钩子,
    // 用于在客户端应用程序完全初始化并准备好后执行指定的回调函数。
    // 这个钩子确保代码只在浏览器中运行,而不会在服务器端渲染过程中执行。
    window.onNuxtReady(() => {
      createSharedMutations({
        // 想要共享的 mutation 名称数组,模块用 "/"
        predicate: ['increment', 'moduleName/mutatioinName',]
      })(store);
    });
  }
};

3. 配置 Nuxt.js 加载插件 ​

在 nuxt.config.js 中添加插件配置:

js
export default {
  // 其他配置项
  plugins: [
    { src: '~/plugins/vuex-shared-mutations.js', mode: 'client' }
  ],
  // ...
}

4. 配置 Vuex Store ​

确保你的 Vuex Store 配置正确。例如:

修改 store/index.js

js
export const state = () => ({
  counter: 0
});

export const mutations = {
  increment(state) {
    state.counter++;
  }
};

5. 使用 Vuex Store ​

在组件中使用 Vuex Store:

js
<template>
  <div>
    <p>Counter: {{ counter }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { mapState, mapMutations } from 'vuex';

export default {
  computed: {
    ...mapState(['counter'])
  },
  methods: {
    ...mapMutations(['increment'])
  }
};
</script>

通过上述步骤,可以实现在多个浏览器窗口或标签页之间共享 Vuex 的状态变更。