【问题标题】:declare mapState and mapMutations globally in SPA VueJS在 SPA VueJS 中全局声明 mapState 和 mapMutations
【发布时间】:2018-09-19 08:02:51
【问题描述】:

我正在创建一个基本的 SPA,但碰巧我使用 Vuex 管理的状态和那里的突变都很好,但是在我想使用 mapState 和 mapMutations 的每个组件中,我必须在本地导入它们。

<script>
    import {mapState,mapMutations  } from 'vuex';
    export default{
        computed : mapState(['isLoggedIn']),
        methods: {
            ...mapMutations(['logout'])
        }
    }
</script>

这是正确的做法吗?或者我怎样才能全局声明它们并避免在每个组件中导入,使其如下?

<script>   

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

【问题讨论】:

  • 我认为这是正确的做法。你可以这样做 window.mapState = mapState 但这不是一个好习惯。
  • 如果您仍然看到mapState is not defined,请尝试在App.vue 中执行分配,而不是main.js

标签: javascript vue.js vuex


【解决方案1】:

快速解决方案

mapMutations 等 Vuex 助手返回一个填充有函数的对象,该函数假定 this.$store 是一个 Vuex 存储。

门店服务

如果你需要在 vanilla JS 中使用 store,又不想到处暴露 store 模块,你可以定义一个 service 模块。

import { mapActions } from 'vuex';
import $store from '@/store';

/**
 * Simple mapping of the Vuex store UI module.
 * @module services/ui
 * @property {Function} pushMessage
 */
export default Object.assign({
    $store,
}, mapActions('ui', ['pushMessage']));

现在,使用它就像导入服务模块一样简单。

import ui from './services/ui';

// triggers the `pushAction` on the ui namespaced store module
ui.pushMessage({ content: 'whatever' });

Vue mixin

要在 Vue 组件上使用默认计算和方法,您可以创建一个简单的 mixin 以导入特定组件。

import { mapState, mapMutations } from 'vuex';

export default {
    computed : mapState(['isLoggedIn']),
    methods: mapMutations(['logout'])
}

然后,在组件中使用 mixin。

<script>
import mixin from './mixin';

export default {
  mixins: [mixin],
  data() {/* ... */},
  // etc.
}
</script>

Global mixin

如果您真的希望每个组件都拥有此默认 mixin 而无需显式定义它,请使用全局 mixin。

import Vue from 'vue';
import { mapState, mapMutations } from 'vuex';

export const mixin = {
    computed : mapState(['isLoggedIn']),
    methods: mapMutations(['logout'])
};

Vue.mixin(mixin);

就个人而言,作为标准,我从不映射状态或突变。

我只映射 getter 和动作,因此我的组件不需要知道状态结构以及动作是否异步。我将 getter 和 action 视为 Vuex 商店(或任何类似商店,如 Redux)的公共 API。

我也只映射相关数据。组件的职责是与应用程序的用户交互,显示和处理事件,仅此而已。如果您的所有组件都需要 user 对象,那么它们可能做得太多,并且该逻辑可能应该移到其他地方,例如在操作中。

在Vue communication上查看更多信息

【讨论】:

  • 非常感谢您提供的替代方案,这只是最后一个问题。最适合您的选择是什么?
  • @dark 我更喜欢明确,所以我适度使用服务并明确声明我的组件上的操作和吸气剂。
  • 非常感谢,我会努力的。问候
  • 就我而言,我将登录用户保留在 Vuex 中,因此我有一个全局 mapState 来访问每个组件中的 User 对象。但正如@EmileBergeron 所建议的那样,通常最好对每个组件上可用的东西进行细粒度控制
  • @Blauhirn OP 询问他所做的是否是标准的,是否有办法避免在任何地方导入助手。问题是,如果没有必要,将任何东西设为全局是一种非常糟糕的做法,但如果你真的想要,只需window.mapActions = mapActions。通过展示 3 种好方法,我相信我的答案比这更好。
猜你喜欢
  • 2020-08-05
  • 2020-10-05
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多