【问题标题】:How to use use custom Vue plugin如何使用自定义 Vue 插件
【发布时间】:2019-12-25 19:40:34
【问题描述】:

如果用户在 localStorage 中设置属性,我创建了一个 Vue 插件来激活 console.logs。该插件是console.log() 的包装器。如果用户输入'localStorage.isLoggingData = true',则插件将测试该属性是否存在于本地存储中,并使用run来测试logData函数

index.js

import logData from '../plugins/logData

  // I want to console.log this inital data coming into the app
  async init ({ state, commit, dispatch }) {
    try {
      const { data } = await messaging.send(ACTION.READY)
      logData(data)

main.js

import logData from '../plugins/logData

// Use logData to optionally view console.log statements
Vue.use(logData)

logData.js

export default {
  install: function (Vue) {
    Vue.prototype.$logData = function (dataToLog) {
      const isLoggingData = localStorage.getItem('isLoggingData')
      if (isLoggingData) {
        console.log(dataToLog)
      }
    }
  }
}

目前,当我们遇到应用程序错误时,我们会路由到错误页面,当我注释掉“logData(data)”时,我会被路由到应用程序中的正确页面。我没有创建插件或没有正确导入它吗?

更新

index.spec.js

import logData from '../plugins/logger'
import { createLocalVue, shallowMount } from '@vue/test-utils'
import App from '@src/App'

const localVue = createLocalVue()
localVue.use(Vuex)
localVue.use(logData)

const mocks = {
  _vm: {}
}
mocks._vm.$logData = logData

const wrapper = shallowMount(App, {
  mocks,
  localVue
})

我现在被告知要模拟 _vm。这是模拟它的正确方法吗?

【问题讨论】:

    标签: javascript vue.js plugins


    【解决方案1】:

    您的init({ state, commit, dispatch }) 函数看起来像是来自vuex
    您不能直接从 vuex 操作访问 vue 方法。

    您可以直接在index.js 中导出您的logData 函数并将其导入vuex:

    index.js

    import { logData } from '../plugins/logData';
    
    // I want to console.log this inital data coming into the app
    async init ({ state, commit, dispatch }) {
      try {
        const { data } = await messaging.send(ACTION.READY);
        logData(data);
        // ...
      } catch(e) { /* ... */ }
    }
    

    main.js

    import logDataPlugin from '../plugins/logData';
    
    // Use logData to optionally view console.log statements
    Vue.use(logDataPlugin);
    

    logData.js

    export function logData(dataToLog) {
      const isLoggingData = localStorage.getItem('isLoggingData');
      if (isLoggingData)
        console.log(dataToLog);
    }
    
    export default {
      install: function (Vue) {
        Vue.prototype.$logData = logData;
      }
    }
    

    如果您只想将该方法作为 vue 插件而不直接公开,您可以将 vue 实例传递给您的 vuex 操作以访问 $logData

    // in your vuex actions:
    const actions = {
      async init ({ state, commit, dispatch }, {vm}) {
        vm.$logData("Hello");
      }
    };
    
    // call action from vue component:
    export default {
       mounted() {
         // pass reference to vue instance to vuex store
         this.init({vm: this});
       },
       methods: {
         ...mapActions(['init'])
       }
    }
    

    【讨论】:

    • 我现在的主要问题是,如果写在原型上,在 Vuex 操作中,为什么我们不能访问 Vue 方法?
    • @KevinT。 vuevuex 是两个不同的库,你只能访问 vue 组件内部 Vue.prototype 上定义的方法。但是,您可以将当前的 vue 组件传递给 vuex 操作(我的最后一个示例),然后使用您在该实例的原型上定义的 $logData 方法
    • 我的 PR 审阅者希望我在 init 操作中致电 this._vm.$logData(data)。我有那个工作。现在,我不明白如何在我的测试中访问/调用this._vm.$logData()。我现在还有其他测试失败,因为“无法读取未定义的属性 '_vm'。似乎无法访问 this
    • @KevinT。我强烈反对使用this._vm - 属性名称前的下划线是表示这是私有成员的约定。 this._vm 没有记录在官方的 vuex 文档中,所以你不应该依赖它作为对调用 vue 组件的引用——这可能会在未来的 vuex 版本中改变。我建议直接导出函数,如上面的示例所示。这也将使测试更容易。
    • @KevinT。如果您仍想通过您的 vue 插件执行此操作,您可以将 vue 实例作为额外参数传递给您的 vuex 操作或使用this github issue 中显示的解决方法之一。您还可以查看vuex-persist,它将所有(或部分)vuex 存储存储在localStorage 中,因此您不必直接处理它。
    猜你喜欢
    • 2019-09-04
    • 1970-01-01
    • 2023-03-21
    • 2020-08-26
    • 2019-12-04
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多