当前位置 博文首页 > 文章内容

    vuex的mutations与actions的使用测试

    作者: 栏目:未分类 时间:2020-08-22 14:01:53

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    vuex的mutations与actions的使用测试

    这里不谈vuex如何使用等问题,只讨论 mutaions 中定义的方法需要在 actions 中进行转发一下吗?

    mutations: {
    	muFn (state, data) {
    		state.data = data
    	}
    }
    actions: {
    	muFn ({commit}, data) {
    		commit.muFn(data)
    	}
    }
    

    现在纠结点在于,mutations 中定义了方法,还要在 actions 中再调用一遍吗

    起因

    在看一些github的项目时,一些人直接在 vue单文件中,直接调用 mutation 里的方法,而还有一部分人在 vue单文件中,直接调用 action 里的方法(action再去调用 mutation)。而这两者之间的项目获取的 start 都比较好,很难明说具体哪个更有优势。

    • 采用 mutation

      • vue2-elm

        • mutation

          import {
          	RECORD_ADDRESS,
          	ADD_CART,
          	REDUCE_CART,
          	INIT_BUYCART,
          	CLEAR_CART,
          	RECORD_SHOPDETAIL,
          	RECORD_USERINFO,
          	GET_USERINFO,
          	CONFIRM_REMARK,
          	CONFIRM_INVOICE,
          	CHOOSE_SEARCH_ADDRESS,
          	SAVE_GEOHASH,
          	CONFIRM_ADDRESS,
          	CHOOSE_ADDRESS,
          	NEED_VALIDATION,
          	SAVE_CART_ID_SIG,
          	SAVE_ORDER_PARAM,
          	CHANGE_ORDER_PARAM,
          	ORDER_SUCCESS,
          	SAVE_SHOPID,
          	SAVE_ORDER,
          	OUT_LOGIN,
          	RETSET_NAME,
          	SAVE_AVANDER,
          	SAVE_ADDRESS,
          	SAVE_ADDDETAIL,
          	SAVE_QUESTION,
          	ADD_ADDRESS,
          	BUY_CART,
          } from './mutation-types.js'
          ...
          
          
        • action

          const state = {
            logs: []
          }
          
          const mutations = {
            ADD_ERROR_LOG: (state, log) => {
              state.logs.push(log)
            },
            CLEAR_ERROR_LOG: (state) => {
              state.logs.splice(0)
            }
          }
          
          const actions = {
            addErrorLog({ commit }, log) {
              commit('ADD_ERROR_LOG', log)
            },
            clearErrorLog({ commit }) {
              commit('CLEAR_ERROR_LOG')
            }
          }
          
          export default {
            namespaced: true,
            state,
            mutations,
            actions
          }
          

        可以看出, mutationaction 根本不对等

    • 采用 action

      • vue-element-admin

        • action/mutation

          import {
          	getUser,
          	getAddressList
          } from '../service/getData'
          import {
          	GET_USERINFO,
          	SAVE_ADDRESS
          } from './mutation-types.js'
          
          export default {
          
          	async getUserInfo({
          		commit,
          		state
          	}) {
          		let res = await getUser();
          		commit(GET_USERINFO, res)
          	},
          	async saveAddress({
          		commit,
          		state
          	}) {
          
          		if(state.removeAddress.length > 0) return;
          
          		let addres = await getAddressList(state.userInfo.user_id);
          		commit(SAVE_ADDRESS, addres);	
          	},
          }
          

        可以看出, mutation 里的方法都会在 action 中再定义一遍。

    然后在 github 上找了一些相关的项目,两种方式都有,在使用 action 这种方式的,在vue单文件中,几乎看不到 commit 的存在,这样是不是有些太偏激了。然后找到了一个 尤大 写的项目,终于看到了 commit

    尝试

    基于此,我在本地起了一个项目,分别采用上面的方式进行处理,并没有发现因为使用 action 而有特别的待遇,只要在 mutaion 中卡住,代码依旧不会再执行。说是利用 action 的异步特性也没看出所以然来,可能个人偏好代码简化。若是大型项目,里面N多个 mutation 方法,那 action 真的不敢想。

    总结

    由于鄙人尝试了各种方式,没有找出两种写法的差别所在。因而还是看团队规范吧,但还是希望没必要特意去重复定义了,累赘不说,还增加了维护成本。

    参考链接

    https://github.com/vuejs/awesome-vue

    https://github.com/yujiahaol68/reddit-app/blob/master/src/store/modules/home.js

    https://github.com/YuheiNakasaka/vue-twitter-client/blob/master/app/src/renderer/vuex/modules/notifications.js

    https://github.com/jeneser/douban/blob/master/src/store/modules/activities.js

    https://github.com/vuejs/vue-hackernews-2.0/blob/master/src/views/ItemList.vue

    https://segmentfault.com/q/1010000023505344