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如何判断移动端访问设备并解析对应CSS
Nov 27 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
Apr 07 Javascript
JS闭包与延迟求值用法示例
Dec 22 Javascript
Angular组件化管理实现方法分析
Mar 17 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
Vue.js devtool插件安装后无法使用的解决办法
Nov 27 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
详解如何用webpack4从零开始构建react开发环境
Jan 27 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
Jun 17 Javascript
JS实现随机点名器
Apr 12 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中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
JavaScript 5 新增 Array 方法实现介绍
2012/02/06 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
微信小程序实现聊天室
2020/08/21 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python用字典构建多级菜单功能
2019/07/11 Python
Python运行异常管理解决方案
2020/03/09 Python
python Pexpect模块的使用
2020/12/25 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
工业设计专业个人求职信范文
2013/12/28 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
小学六年级毕业感言
2015/07/30 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB