将 background.js 中的数据存储到 vuex 存储中

Posted

技术标签:

【中文标题】将 background.js 中的数据存储到 vuex 存储中【英文标题】:Store data from background.js into the vuex store 【发布时间】:2019-06-29 04:08:06 【问题描述】:

所以我试图在我的 chrome 扩展中使用 vuex 商店。我的整个项目都是基于 VueJs。

我点击扩展按钮后会打开一个弹出窗口。我还在使用 background.js 来使用 chrome API 收听当前选项卡的 url。

现在,我要做的就是将这个 url 从 background.js 存储到 store,然后我可以使用它来将数据获取到我的 popup.html 并在其中呈现 url。

现在我不知道如何在我的插件中使用 vuex 商店。

附:我对 chrome 扩展开发相当陌生,一些代码参考或指导可能会有所帮助:)

【问题讨论】:

如果你需要获取当前标签页的url,你可以使用window.location.hostname。以这种方式将其保存在商店状态会更容易。 【参考方案1】:

您可以将此插件用于 Vuex:vuex-webextensions

如何使用它来做你想做的一个例子是:

在您的扩展导入的后台脚本中:

    Vue Vuex vuex-webextensions webextension-polyfill

我建议使用 webextension-polyfill,因为您可以使用 chrome 的回调样式 API 作为 Promise API(让您可以选择使用 .then() 或 async/await。

还可以导入您在应用的 Vuex 商店中使用的任何操作、突变、getter 等。

// background.js

import Vue from 'vue';
import Vuex from 'vuex';
import VuexWebExtensions from 'vuex-webextensions';

import * as actions from './store/actions';
import * as getters from './store/getters';
import mutations from './store/mutations';

global.browser = require('webextension-polyfill');

Vue.use(Vuex);

const store = new Vuex.Store(
  plugins: [VuexWebExtensions(
    persistentStates: ['currentTabUrl'],
  )],
  state: 
    currentTabUrl: '',
  ,
  getters,
  mutations,
  actions,
);

/* if you want to get the active tab URL anytime someone clicks your extension icon,
 * you'll need to listen for the onClicked event on browserAction.
 * The onClicked event handler receives an optional parameter which is the current tab.
 * You'll also need to ensure you've set "tabs" permission in your manifest.json

https://developer.chrome.com/extensions/browserAction#event-onClicked
*/

// Assuming you've used the webextension-polyfill as I have:

browser.browserAction.onClicked.addListener((tab) => 
  store.dispatch('nameOfYourActionToUpdateStore', tab.url)
);

// or without using the webextension-polyfill

chrome.browserAction.onClicked.addListener((tab) => 
  store.dispatch('nameOfYourActionToUpdateStore', tab.url)
);

export default store;

现在,对于您的弹出窗口,您可能有一个 Vue 应用程序 + Vuex 商店的实例。例如:

// popup.js

import Vue from 'vue';
import Vuex from 'vuex';
import VuexWebExtensions from 'vuex-webextensions';
import App from './App';

// import any actions, mutations, getters you might have
import * as actions from './actions';
import * as getters from './getters';
import mutations from './mutations';


// Assuming you've used the webextension-polyfill as I have:
global.browser = require('webextension-polyfill');

// Assuming you've used the webextension-polyfill as I have:
Vue.prototype.$browser = global.browser;

Vue.use(Vuex);

const store = new Vuex.Store(
  plugins: [VuexWebExtensions(
    persistentStates: ['currentTabUrl'],
  )],
  state: 
    currentTabUrl: '',
  ,
  getters,
  mutations,
  actions,
);

new Vue(
  el: '#app',
  store,
  render: h => h(App),
);

export default store;

在我们的示例中,App.vue 可能类似于:

// App.vue

<template>
 <p>  currentTabUrl  </p>
</template>

<script>
import  mapState  from 'vuex'

export default 
  updated() 
    console.log(this.$store.state.currentTabUrl);
  ,
  data() 
    return ;
  ,
  computed: 
    ...mapState([
      'currentTabUrl'
    ])
  ,
;
</script>

<style lang="scss" scoped>
p 
  font-size: 20px;

</style>

基本上,现在您的扩展程序有两个 Vuex 存储实例:background.js 中的 1 个和 popup.js 中的 1 个。 Vuex-webextensions 插件使用chrome.storage API 来保持两个存储同步。它将background.js 存储视为主实例,并将所有其他实例视为该主实例的副本。

需要注意的一点是,您无法在常规 chrome devtools 中检查此存储空间。要查看此存储空间的内容,您需要安装以下扩展:

Storage Area Explorer

我希望这会有所帮助。如果有什么需要进一步解释的,请告诉我。

【讨论】:

它对我不起作用。存储不持久。并且存储区域资源管理器不显示任何内容。

以上是关于将 background.js 中的数据存储到 vuex 存储中的主要内容,如果未能解决你的问题,请参考以下文章

如何将检索到的数据从 v-for 绑定到 Vuejs 中的数据对象?

将消息从 background.js 传递到 popup.js

docker volume持久化存储与数据分享

使用 v-for 遍历 id 都不同的 json 并将它们绑定到 PrimeVue 中的 Input

V-3-1 Vmware EXSi中添加虚拟机之上传镜像文件

V-3-1 Vmware EXSi中添加虚拟机之上传镜像文件