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 05 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
Jul 06 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 Javascript
创建简单的node服务器实例(分享)
Jun 23 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
Sep 28 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
函数式编程入门实践(一)
Apr 20 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
Nov 04 Javascript
VUE动态生成word的实现
Jul 26 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
Jul 28 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类声明和php类使用方法示例分享
2014/03/29 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
2019/04/03 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
ExtJs的Date格式字符代码
2010/12/30 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
关于JavaScript中string 的replace
2013/04/12 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
EasyUI实现第二层弹出框的方法
2015/03/01 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
python装饰器使用方法实例
2013/11/21 Python
Python3基础之函数用法
2014/08/13 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python队列原理及实现方法示例
2019/11/27 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
实现中国梦思想汇报2014
2014/09/13 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
单方投资意向书
2015/05/11 职场文书
新生儿未入户证明
2015/06/23 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS