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 相关文章推荐
ASP.NET中AJAX 调用实例代码
May 03 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
js 动态修改css文件的方法
Aug 05 Javascript
JavaScript 作用域链解析
Nov 13 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
Sep 01 Javascript
js遮罩效果制作弹出注册界面效果
Jan 25 Javascript
vue.js开发环境安装教程
Mar 17 Javascript
python爬取安居客二手房网站数据(实例讲解)
Oct 19 Javascript
在vue-cli项目中使用bootstrap的方法示例
Apr 21 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
Jun 24 Javascript
vue 源码解析之虚拟Dom-render
Aug 26 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 静态化实现代码
2009/03/20 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
php求正负数数组中连续元素最大值示例
2014/04/11 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
原生js二级联动效果
2017/06/20 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
vue.js2.0 实现better-scroll的滚动效果实例详解
2018/08/13 Javascript
vue实现图片上传功能
2020/05/28 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python绘制直线的方法
2018/06/30 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
校友会欢迎辞
2014/01/13 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
投资合作意向书范本
2015/05/08 职场文书
技能培训通讯稿
2015/07/18 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis