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 相关文章推荐
Draggable Elements 元素拖拽功能实现代码
Mar 30 Javascript
javaScript面向对象继承方法经典实现
Aug 20 Javascript
jquery如何通过name名称获取当前name的value值
Dec 20 Javascript
jQuery插件开发的两种方法及$.fn.extend的详解
Jan 16 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
javascript中toFixed()四舍五入使用方法详解
Sep 28 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
Sep 06 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 Javascript
实现一个简单得数据响应系统
Nov 11 Javascript
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执行速度全攻略(上)
2006/10/09 PHP
php中strtotime函数用法详解
2014/11/15 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
PHP文件操作实例总结
2016/09/27 PHP
用Javscript实现表单复选框的全选功能
2007/05/25 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
python使用xslt提取网页数据的方法
2018/02/23 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
ET Mall东森购物网:东森严选
2017/03/06 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
宝宝周岁宴答谢词
2014/01/26 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
报关报检委托书
2014/04/08 职场文书
医德医魂心得体会
2014/09/11 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL