首页 > 其他分享 >vuex中commit

vuex中commit

时间:2022-10-08 16:46:14浏览次数:44  
标签:mutations state user 模块 commit vuex store

一、不使用模块的基础模式

vuex相关的文件夹,放在src下的store文件夹,里面有一个index.js文件,为vuex的入口,如果不使用模块,可以将所有相关代码写在index.js文件里面,下面是最基础的index.js文件演示:

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { mainname: 'main' }, getters: { getMainname: (state) => { return state.mainname } }, mutations: { setMainname: (state, data) => { state.mainname = data } }, actions: { asyncSetMainname: ({ commit }, data) => { commit('setMainname', data) } } })

可以看到除了modules,其他属性都使用到了。其中mutations的方法就是直接修改state里面的变量,而actions是通过提交mutations去修改state,而不能直接修改stateactions中的方法的第一个参数是一个context上下文对象,可以通过context.commit提交mutations,上面的代码我将它解构。

下面是在组件中的操作:

获取state

this.$store.state.mainname // main

提交mutations

this.$store.commit('setMainname', 'main111') // 参数为mutations方法名,数据

提交actions

this.$store.dispatch('asyncSetMainname', 'main') // 参数为actions方法名,数据

获取getters

this.$store.getters.getMainname // main 一般写在计算属性中: computed:{ mainname() { return this.$store.getters.getMainname } }

这就是最基础的vuex用法。

二、使用模块

如果要将vuex拆分成几个模块,一般在index.js同级下新建一个modules文件夹,假如我现在拆分出一个叫user的模块,目录结构就变成:

 

vuex的子模块同样包含statemutationsactionsgetters这些属性,下面是user.js的代码:

 

const state = { username: 'user' } const getters = { getUsername: (state) => { return state.username } } const mutations = { setUsername: (state, data) => { state.username = data } } const actions = { asyncSetUsername: ({ state, commit }, data) => { commit('setUsername', data) } } export default { namespaced: true, state, getters, mutations, actions }

主体内容与入口文件index.js基本一致,最后将所有属性导出,同时要导出一个namespacedtrue,为开启命名空间,以免混乱,然后在index.js中将这个模块引入,下面是改动后的index.js:

import Vue from 'vue' import Vuex from 'vuex' import user from './modules/user' Vue.use(Vuex) export default new Vuex.Store({ state: { mainname: 'main' }, getters: { getMainname: (state) => { return state.mainname } }, mutations: { setMainname: (state, data) => { state.mainname = data } }, actions: { asyncSetMainname: ({ state, commit }, data) => { commit('setMainname', data) } }, modules: { user } })

现在实际上我的vuex是有两个模块,一个index主模块,一个user模块,那在组件中如何操作呢:

获取state
如果和上面的写法一样的话,获取的是index主模块中的state变量
如果想要获取user模块中的state,需要在后面加上模块名称

// 默认 this.$store.state.mainname // main // 获取子模块 this.$store.state.user.username // user

提交mutations
和获取state的逻辑一样,不加模块名称提交的是index中的mutations,要提交子模块中的mutations就得加上模块名

 

 

this.$store.commit('user/setUsername', 'user111') // 有点像url写法,在方法名称前加上模块名 如果不加模块名,会去index.js中找这个mutations方法,找不到就会报错 this.$store.commit('setUsername', 'user111') // 报错

提交actions,逻辑一样

this.$store.dispatch('user/asyncSetUsername', 'user111')

获取getters:

computed:{ mainname() { return this.$store.getters['user/getUsername'] } }

到这里vuex的基本操作就都说完了,包括不带模块的,带模块的,下面是使用vuex自带的map语法糖对操作进行简化。

使用vuex的map语法糖对操作进行简化

我们在组件中操作vuex,都得通过this.$store点点点,看起来比较繁琐,vuex提供了vuex和组件方法进行映射的语法糖,下面我演示一下这些map语法糖的写法:
在组件中,先从vuex中引入几个方法:

import { mapMutations, mapActions, mapGetters } from 'vuex'

从名字就可以看出就是和mutationsactionsgetters在组件中做映射,下面先看不使用模块的情况,先从
mapMutations开始演示:
mapMutations是一个方法,返回一个对象,对象里面就是vuex里面的mutations方法,所以在和组件做映射时,要写在methods中,然后把这个对象解构:

methods: { // mapMutations可以接收一个数组为参数,数组项就是vuex里面mutations方法的名称 ...mapMutations([ 'setMainname' ]), 然后在别的方法中执行: fn() { this.setMainname('mainname1111') } }

上面的写法就相当于:

methods: { fn() { this.$store.commit('setMainname', 'main1111') } }

不仅可以映射到组件中的方法,还可以在组件中修改mutations方法的名称:

methods: { // 将mapMutations的参数从数组改成对象,key值为自定义的方法名,value中为原来mutations方法的名称 ...mapMutations({ setMainnamePro: 'setMainname' }), fn() { this.setMainnamePro('main1111') } }

mapActionsmapMutations用法一模一样,不改变actions方法名称时参数传数组,改变actions方法名称时参数传对象:

methods: { ...mapActions({ asyncSetMainnamePro: 'asyncSetMainname' }), fn() { this.asyncSetMainnamePro('main111') } } 相当于: methods: { fn() { this.$store.dispatch('asyncSetMainname', 'main111') } }

mapGetters道理也是一样,只不过是写在computed中:

computed: { ...mapGetters([ 'getMainname' ]) } 在别的地方用的话跟使用普通计算属性一样,注意后面没有括号: this.getMainname 同样可以修改名称,同样是参数把数组改成对象: computed: { ...mapGetters({ mainname: 'getMainname' }) } 在别的地方: this.mainname

几个map的基本用法就说完了,上面说的是不用模块的,也就是拿的都是index.js里面的属性,那如果要拿user模块里面的属性呢,其实也非常简单,只需要在几个map方法的第一个参数写上模块名称就可以,其他用法一模一样:

...mapMutations('user', [ 'setUsername' ]) ...mapActions('user', [ 'asyncSetUsername' ]) ...mapGetters('user', [ 'getUsername' ])

同样把第二个参数写成对象就可以自定义vuex里面方法的名称,用法与上面一样。

 

 

 

标签:mutations,state,user,模块,commit,vuex,store
From: https://www.cnblogs.com/Nancy9669/p/16769405.html

相关文章

  • 当上传git 提交出现--Please enter a commit message to explain why this merge is n
    git在pull或者合并分支的时候有时会遇到这个界面。可以不管(直接下面3,4步),如果要输入解释的话就需要:1.按键盘字母i进入insert模式2.修改最上面那行黄色合并信息......
  • Vuex与前端表格施展“组合拳”,实现大屏展示应用的交互增强
    Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。下图是一个产品开发......
  • h5:vue3 + ts + vite + vuex + axios + vant4 + scss + postcss+mockjs+element-plus
    模板地址:https://gitee.com/zhang_meng_lei/mobile-template-h5-vue3/tree/master安装element-plus:yarnaddelement-plus(目前已导入但未实现代码)按需导入:https://el......
  • docker实战教程(八):commit命令
    dockercommitdockercommit提交容器副本使之成为一个新的镜像dockercommit-m="提交的描述信息"-a="作者"容器ID要创建的目标镜像名:[标签名]演示ubuntu安装vim从hub......
  • 共同创作 Commits (2/2):部署 commit-msg 钩子
    共同创作Commits(2/2):部署commit-msg钩子在博客的第一部分,我已经解释了如何使用commit-msg挂钩将多个作者信息添加到git提交中。下一个问题是,将这个钩子放在系统......
  • git commit之后,回退方法
     原文 写完代码后,我们一般这样gitadd.//添加所有文件gitcommit-m"本功能全部完成" 执行完commit后,想撤回commit,怎么办? 这样凉拌:gitreset--softHE......
  • git 修改commit 备注
    1.没有push1.修改最后一次的提交备注gitcommit--amend输入i进行编辑模式,修改好以后esc退出编辑模式:wq保存并退出。 2.修改之前的备注gitrebase-i......
  • Vuex
    Vuex概念Vuex是一个专为Vue.js应用程序开发的状态管理模式+库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。(响应......
  • IDEA commit总是附带jira网址
    IDEA中提交commit时,comment带上jirastory号,IDEA会自动为其添加jira网址解决方法:取消勾选BeforeCommit中的GitHook选项但是下次提交commit时这个选项还是勾上的,没有办......
  • 需改commit信息
    一、git如何修改最近一次的commit信息1.gitcommit--amend2.进入vim操作界面之后,点击字母键i然后进入INSERT模式,然后对commit信息进行修改,然后ES......