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 相关文章推荐
javascript小数计算出现近似值的解决办法
Feb 06 Javascript
js从Cookies里面取值的简单实现
Jun 30 Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 Javascript
javascript中的previousSibling和nextSibling的正确用法
Sep 16 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
Oct 08 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 Javascript
js实现简单点赞操作
Mar 17 Javascript
JS实现密码框效果
Sep 10 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
Nov 09 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
浅谈JS的原型和原型链
Jun 04 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
PHP4在Windows2000下的安装
2006/10/09 PHP
实用函数9
2007/11/08 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP number_format函数原理及实例解析
2020/07/14 PHP
一段实时更新的时间代码
2006/07/07 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
2014/01/10 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
2019/05/03 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
python正则表达式去掉数字中的逗号(python正则匹配逗号)
2013/12/25 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
python 实现list或string按指定分段
2019/12/25 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
上班上网检讨书
2014/01/29 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书