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 相关文章推荐
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
js获取上传文件大小示例代码
Apr 10 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
Feb 27 Javascript
使用AngularJS创建单页应用的编程指引
Jun 19 Javascript
浅析js中substring和substr的方法
Nov 09 Javascript
jQuery实现带玻璃流光质感的手风琴特效
Nov 20 Javascript
jquery validate表单验证的基本用法入门
Jan 18 Javascript
javascript事件委托的用法及其好处简析
Apr 04 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
Jun 06 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
Aug 28 Javascript
一百行JS代码实现一个校验工具
Apr 30 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
php抓取页面的几种方法详解
2013/06/17 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
javascript 的Document属性和方法集合
2010/01/25 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
vue 循环加载数据并获取第一条记录的方法
2018/09/26 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
Python random模块常用方法
2014/11/03 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
python安装scipy的步骤解析
2019/09/28 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
python em算法的实现
2020/10/03 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
美术专业学生个人自我评价
2013/09/19 职场文书
优秀教师事迹简介
2014/02/02 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
活动简报范文
2015/07/22 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL