Vuex modules模式下mapState/mapMutations的操作实例


Posted in Javascript onOctober 17, 2019

当我们使用 Vuex 实现全局状态维护时,可能需要将状态值划分多个模块,比如一些 root 级的用户登录状态,token,用户级的用户信息,购物车级的购物车信息。

下面我们实例演示下如何在多模块下使用 mapState/mapMutations。

  • modules 只作用于属性,属性会归属在相应的模块名的命名空间下。
  • mutations, actions, getter 没有命名空间的限定,所以要保证全局的唯一性,否则后者会覆盖前者

store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

import user from './user'
import order from './order'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    user,
    order
  },
  state: {
    hasLogin: false,
    token: ""
  },
  mutations: {
    setHasLogin(state, hasLogin) {
      state.hasLogin = hasLogin
    },
    setToken(state, token) {
      state.token = token
    }
  }
})

export default store

store/user.js

const state = {
  name: "sqrtcat",
  age: 25
}
const mutations = {
  setUserName(state, name) {
    state.name = name
  },
  setUserAge(state, age) {
    state.age = age
  }
}
const actions = {

}
const getters = {

}

export default {
  state,
  mutations,
  actions,
  getters
}

store/order.js

const state = {
  name: "cart",
  count: 0
}
const mutations = {
  setOrderName(state, name) {
    state.name = name
  },
  setOrderCount(state, count) {
    state.count = count
  }
}
const actions = {

}
const getters = {

}

export default {
  state,
  mutations,
  actions,
  getters
}

Vue 引入

import Vue from 'vue'
import App from './App'

import store from './store'

Vue.config.productionTip = false

Vue.prototype.$store = store // 注入仓库

const app = new Vue({
  store// 注入仓库
})

app.$mount()

index.vue

<template>
  <view>
    <button class="primary" @click="setUserName('big_cat')">setUserName</button>
    <button class="primary" @click="setUserAge(27)">setUserAge</button>
    <button class="primary" @click="setOrderName('yes')">setOrderName</button>
    <button class="primary" @click="setHasLogin(true)">setHasLogin</button>
    <button class="primary" @click="setToken('tokentokentokentoken')">setToken</button>
    <view class="">
      {{userName}}
    </view>
    <view>{{userAge}}</view>
    <view>{{orderName}}</view>
    <view>{{hasLogin}}</view>
    <view>{{token}}</view>
  </view>
</template>

<script>
  import {
    mapState,
    mapMutations
  } from "vuex"

  export default {
    data() {
      return {}
    },
    computed: {
      // 原生
      hasLogin() {
        return this.$store.state.hasLogin
      },
      token() {
        return this.$store.state.token
      }
      // 仓库root属性 可以直接 magic 赋值
      // ...mapState(["hasLogin", "token"]),
      // 因为 modules 下的属性使用了命名空间 所以不能使用数组方式的 magic
      ...mapState({
        userName: state => state.user.name,
        userAge: state => state.user.age,
        orderName: state => state.order.name
      }),
      // 更多示例
      ...mapState({
        hasLogin(state) {
          return state.hasLogin
        },
        token(state) {
          return state.token
        }
      }),
      ...mapState({
        hasLogin: (state) => {
          return state.hasLogin
        },
        token: (state) => {
          return state.token
        }
      }),
    },
    methods: {
      // vuex 在使用了 modules 模式时
      // mutation依然没有命名空间的概念 所以在定义 mutations 时要注意全局的唯一性
      // 否则后者会覆盖前者
      ...mapMutations(["setHasLogin", "setToken"]),
      // magic style1
      ...mapMutations(["setUserName", "setUserAge", "setOrderName"]),
      // magic style2
      ...mapMutations({
        setUserName(commit, userName) {
          commit("setUserName", userName)
        },
        setUserAge(commit, userAge) {
          commit("setUserAge", userAge)
        },
        setOrderName(commit, orderName) {
          commit("setOrderName", orderName)
        }
      }),
      // 原生写法
      setUserName(userName) {
        this.$store.commit("setUserName", userName)
      },
      setUserAge(userAge) {
        this.$store.commit("setUserAge", userAge)
      },
      setOrderName(orderName) {
        this.$store.commit("setOrderName", orderName)
      }
    }
  }
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 遍历对象的属性的代码
Dec 29 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
JS对象与json字符串格式转换实例
Oct 28 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
JQuery实现动态适时改变字体颜色的方法
Mar 10 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
Dec 31 Javascript
ES6入门教程之let、const的使用方法
Apr 13 Javascript
JavaScrip数组去重操作实例小结
Jun 20 Javascript
layui--js控制switch的切换方法
Sep 03 Javascript
Js视频播放器插件Video.js使用方法详解
Feb 04 Javascript
关于Vue中的options选项
Mar 22 Vue.js
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 #Javascript
Weex开发之地图篇的具体使用
Oct 16 #Javascript
WEEX环境搭建与入门详解
Oct 16 #Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 #Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
Oct 16 #Javascript
微信公众号开发之微信支付代码记录的实现
Oct 16 #Javascript
关于JS模块化的知识点分享
Oct 16 #Javascript
You might like
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
php 中序列化和json使用介绍
2013/07/08 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
用原生js做单页应用
2017/01/17 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
Python socket模块方法实现详解
2019/11/05 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
财产公证书
2014/04/10 职场文书
大学生毕业求职信
2014/06/12 职场文书
2014年材料员工作总结
2014/11/19 职场文书
创卫工作总结2015
2015/04/22 职场文书
小学英语课教学反思
2016/02/15 职场文书
诉讼和解协议书
2016/03/23 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫