【问题标题】:Getting router params into Vuex actions将路由器参数添加到 Vuex 操作中
【发布时间】:2017-06-29 22:49:08
【问题描述】:

我想将路由器参数传递到 Vuex 动作中,而不必为每个动作都以这样的大格式获取它们:

edit_sport_type({ rootState, state, commit }, event) {
  const sportName = rootState.route.params.sportName <-------
  const payload = {sportName, event}                 <-------
  commit(types.EDIT_SPORT_TYPE, payload)
},

或者像这样,

edit_sport_type({ state, commit, getters }, event) {
  const payload = {sportName, getters.getSportName}  <-------
  commit(types.EDIT_SPORT_TYPE, payload)
},

或者更糟糕的是:从组件 props 中获取参数并将它们传递给 dispatch,对于每个 dispatch。

有没有办法为大量动作抽象出来?

或者也许是突变本身的替代方法?

【问题讨论】:

    标签: javascript flux vue.js vuex


    【解决方案1】:

    要从vuex 存储操作中获取参数,请导入您的vue-router 实例,然后通过router.currentRoute 对象从您的vuex 存储访问路由器实例的参数。

    下面的示例实现:

    路由器src/router/index.js:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    import routes from './routes'
    
    Vue.use(VueRouter)
    
    const router = new VueRouter({
      mode: 'history',
      routes
    })
    
    export default router
    

    在 vuex 商店导入路由器:

    import router from '@/router'

    然后在 vuex 操作函数中访问参数,在本例中为“id”,如下所示:

    router.currentRoute.params.id
    

    【讨论】:

    • 对我来说并不完全有效。我必须在actions.jsimport router from '../router/index.js'
    • @Heichou,确实,在上面的答案中,有一个导入路由器的语句,在这句话下'import the router at vuex store:'
    • 是的,你是对的,但我是说我将它导入到 actions.js 而不是 store.js
    • @Heichou,哦,我明白了。你说得对。我们在使用它的地方导入一个包。只要我记得,我在上面的答案中的意思是 vuex store 是一个在 VueJs 应用程序中管理状态的整个系统。顺便说一句,我已经有 2 年没有使用 vuejs 了,所以这次可能是我的无效信息。谢谢
    • 我完全按照这里的描述做了,但是当我调试我的操作时,router 是未定义的。如果我需要解决一些范围界定问题,以便我可以在 actions 函数中使用 router
    【解决方案2】:

    不确定是否能很好地理解您的问题,但是:
    此插件可让您的路由器状态和您的商店保持同步:
    https://github.com/vuejs/vuex-router-sync

    这听起来像您正在寻找的东西。

    【讨论】:

    • 我认为@nicolast 就在这里。请参阅 vuex-router-sync README 的 How does it work? 部分。添加vuex-router-syncroute 模块添加到商店,以便您现在可以访问pathparamsquery 等内容。
    • 从我使用rootState.route.params可以看出,我已经在使用vue-router-sync
    【解决方案3】:

    据我所知(我已经为我正在从事的项目研究了这个)不,没有。 最简单的方法是抽象路由获取或您想要对服务执行的任何操作,并在您的 vuex 文件中使用它,或者如果您使用模块化方法将其导入您的 actions.js 文件中。

    所以 paramFetching.js 文件看起来像这样:

    export default {
      fetchRouteParams: function() {
        // do fetching
        // you should return a promise 
      }
    }
    

    然后将其导入您的 vuex

    import service from 'paramFetching.js'
    

    然后做出这样的动作

    ...
    fetchParamsAction: function({commit}) {
      service.fetchRouteParams()
        .then( (response) => { // stuff gottten from service. you should o your commit here } )
        .catch( (error) => { // error handling } )
    }
    

    然后只需派发这个动作,一切都会在一个动作中处理。所以它有点将它与其他代码隔离开来。 这只是一个一般的想法。如果不够清楚,我很抱歉。如果我可以进一步提供帮助,请询问。

    【讨论】:

    • 感谢您的回答。这听起来比仅仅使用 getter (如上所示)要多得多的工作
    • 我没有在和你一样的情况下使用这个。您可以选择最适合您的方案,但此解决方案更灵活,并且可以分离关注点。最终的选择是你的。总帐
    • 一般来说 js 可能更灵活,但因为你可以在 vue 的任何地方使用 getter,所以不确定。
    • 是的 :) 我喜欢只使用 getter 来访问状态......而且我几乎从未在 vuex 操作中使用它们......所以可能是我的方法是错误的
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 2021-10-07
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多