Vue使用Vuex一步步封装并使用store全过程

目录
  • 一、安装Vuex依赖
  • 二、一步步封装store
    • 1. main.js中全局引入store仓库(下一步创建)
    • 2. this.$store
    • 3. this.$store.state
    • 4. this.$store.getters(this. $store.state的升级)
    • 5. this.$store.commit(‘mutations’)
    • 6. this.$store.dispatch(‘actions’)(this. $store.commit(‘mutations’)的升级)
    • 7. strict严格模式
  • 三、modules 模块化
  • 四、使用仓库
    • 1. 无map系列
    • 2. map映射系列
    • 3. 扩展
    • 3. 总结
  • 最后

一、安装Vuex依赖

cnpm install vuex --save

二、一步步封装store

1. main.js中全局引入store仓库(下一步创建)

import store from './store' //引入store

new Vue({
  el: '#app',
  router,
  store, //挂载store,this将自动生成$store属性
  template: '<App/>',
  components: { App }
})

挂载store,this将自动生成$store属性

2. this.$store

创建store仓库:习惯在src下创建store文件夹,再创建index.js,内容:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store();

export default store;

此时你已经有了一个空的store全局仓库,没有任何功能,但可以在任何vue实例下使用 this.$store 去访问它。

  • store使用范围均是可以全局使用;
  • let a=1; {a:a}.a 的缩写是 {a}.a,即当字典的键和值命名一样时,可以省略只写a
  • state、getters、mutations、mutations均是Vuex封装好的特殊变量,以下声明的功能变量均是这些名字,一个好处是store挂载该功能时可以简写(如3-1,本例均如此)。当然你也可直接在store中写功能(如3-2)。

3. this.$store.state

给store仓库读取数据功能:state

/*********  3-1 **********/
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要设置的全局访问的state对象,赋予初始属性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   };
 const store = new Vuex.Store({
       state
    });

export default store;

此时你的store仓库已经有了存取数据的功能,可以用 this.$store.state.themeColor 等数据了。

下面是第二种写法

/*********  3-2 **********/
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

const store = new Vuex.Store({
      state:{
       	 //要设置的全局访问的state对象,赋予初始属性值
	     themeColor: {val:'blue',opacity:false},
	     changeThemeCount:0,
	     cache:''
       }
    });

export default store;

4. this.$store.getters(this. $store.state的升级)

给state功能升级,让他拥有计算能力(类似vue中的computed方法):getters:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要设置的全局访问的state对象,赋予初始属性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   };
const getters = {   //实时监听state值的变化(最新状态)
    getThemeColor(state) {  //定义函数,返回处理过的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天则主题色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const store = new Vuex.Store({
       state, // 挂载存取数据功能
       getters //挂载数据计算功能
});
export default store;

此时使用 this.$store.getters.getThemeColor 获取颜色,将自动根据时间的不同自动设置主题是否有透明的效果

5. this.$store.commit(‘mutations’)

给store仓库使用函数功能(只为操作state数据):mutations - 同步

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要设置的全局访问的state对象,赋予初始属性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   };
const getters = {   //实时监听state值的变化(最新状态)
    getThemeColor(state) {  //定义函数,返回处理过的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天则主题色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const mutations = {
    //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
    clearCatch(state) {
        state.cache = "";
        state.changeThemeCount= 0;
    },
    setThemeColor(state,color,opacity){
       state.themeColor.val = color;
       state.themeColor.opacity = opacity;
       state.changeThemeCount++;
    }
};
const store = new Vuex.Store({
        state, // 挂载存取数据功能
       getters, //挂载数据计算功能
       mutations // 挂载函数功能
});
export default store;

此时可以使用 this.$store.commit(‘setThemeColor’,‘grey’,‘1’) 了(注意第一个参数是函数名,不是传参给state的,state自己会传,后两个才是对应传参)。

可以主动设置主题色和透明度,操作是同步的,即如果你在同一个组件连续调用多次setThemeColor函数,获取仓库中state.changeThemeCount的值是一样的,下面介绍异步函数。

6. this.$store.dispatch(‘actions’)(this. $store.commit(‘mutations’)的升级)

给store仓库的函数commit功能升级(只为异步操作mutations中的函数):actions - 异步

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
 const state={ //要设置的全局访问的state对象,赋予初始属性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   };
const getters = {   //实时监听state值的变化(最新状态)
    getThemeColor(state) {  //定义函数,返回处理过的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天则主题色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const mutations = {
    //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
    clearCatch(state) {
        state.cache = "";
        state.changeThemeCount= 0;
    },
    setThemeColor(state,color,opacity){
       state.themeColor.val = color;
       state.themeColor.opacity = opacity;
       state.changeThemeCount++;
    }
};
const actions = {
    //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性
    setThemeColorAction(context,color,opacity){
     	context.commit('setThemeColor',color,opacity);
    }
};
const store = new Vuex.Store({
       state, // 挂载存取数据功能
       getters, //挂载数据计算功能
       mutations, // 挂载函数功能
       actions, // 挂载异步函数
});
export default store;

此时可以使用 this.$store.dispatch(‘setThemeColorAction’,‘grey’,‘1’) 了(注意第一个参数是函数名,不是传参给context的,context自己会传,后两个才是对应传参)。

可以主动设置主题色和透明度,操作是异步的,即如果你在同一个组件连续调用多次setThemeColorAction函数,获取仓库中state.changeThemeCount的值就不是一样的。

7. strict严格模式

export default new Vuex.Store({
  strict: true,
  state: {
    ...
  },
  ...
}

此模式下所有的状态变更(即更新state)必须使用mutation(commit),如果在组件中直接修改state则会报错。这样的好处是所有的state的更新都体现在仓库中,整改方便;使用devTools调试工具时可以跟踪到状态的修改。

三、modules 模块化

第二个模块介绍了store仓库的四个功能:state、getters、mutations和actions,下面介绍第五个功能:modules。

  • 当项目比较大时,一个store中数据会非常多而复杂,不易管理。此时便可建多个“子仓库”,分别对应不同模块做数据的读取和操作。
  • 注意主仓库还是那一个,只要把他的“子仓库”放在主仓库的modules下即可。
  • 子仓库看着很像仓库,其实它并不是store的实例,不是仓库(new Vuex.Store()实例化后的对象才是仓库),只是一个普通js对象(字典)。

1、在store下新建modules文件夹,在modules下新建home.js“子仓库”。

即home.js只管主页下的数据(一般不要分的太细,最多一个页面一个仓库管简洁),下面是home.js代码

//home.js

const state={
    users:[] //存访问该页面的所有用户
};
const getters={
  getUsers(state){ //获取访问该页面的所有用户
    // 对数据清理-除去脏数据
  	if (state.users.includes('*')) delete state.users['*']
    	return state.users;
  }
};
const mutations={
     addUser(state,name){ //增加访问用户
        state.collects.push(name)
     }
 };
const actions={
    invokeAddUser(context,name){ //触发mutations里面的addUser,传入数据形参name对应到users
        context.commit('addUser',name);
    }
};
// 注意和仓库的区别
const store = {
     // namespaced用于在全局引用此文件里的方法时标识这一个的文件名,使得让人明白这些数据来自哪个仓库
     // 即当你需要在别的文件里面使用子仓库(mapStates、mapGetters、mapActions)时,里面的方法需要注明来自哪一个模块的方法
     namespaced:true,
     state,
     getters,
     mutations,
     actions
}
export default store;

2.“子仓库”创建完成,要让主仓库引用它:

import Vue from 'vue';
import Vuex from 'vuex';
import home from './modules/home.js'

Vue.use(Vuex);
 const state={ //要设置的全局访问的state对象,赋予初始属性值
     themeColor: {val:'blue',opacity:false},
     changeThemeCount:0,
     cache:''
   };
const getters = {   //实时监听state值的变化(最新状态)
    getThemeColor(state) {  //定义函数,返回处理过的val,命名最好有代表性
       let hour = new Date().getHours();
       // 如果白天则主题色不透明,反之
       state.themeColor.opacity = 8 <= hour && hour <= 20;
       return state.themeColor
    }
};
const mutations = {
    //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
    clearCatch(state) {
        state.cache = "";
        state.changeThemeCount= 0;
    },
    setThemeColor(state,color,opacity){
       state.themeColor.val = color;
       state.themeColor.opacity = opacity;
       state.changeThemeCount++;
    }
};
const actions = {
    //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性
    setThemeColorAction(context,color,opacity){
     	context.commit('setThemeColor',color,opacity);
    }
};
const store = new Vuex.Store({
       state, // 挂载存取数据功能
       getters, //挂载数据计算功能
       mutations, // 挂载函数功能
       actions, // 挂载异步函数
       modules:{ // 挂载子仓库
         home
    	}
});
export default store;

此时便有了第一个“子仓库”了!

四、使用仓库

1. 无map系列

适合使用场景较少:

建好仓库,组件中直接使用state、getters、mutations、actions:

  • this.$store.state.*
  • this.$store.getters.*
  • this.$store.commit.*
  • this.$store.dispatch.*

2. map映射系列

适合使用场景频繁:

使用mapGetters、mapActions 和 mapStates之前需要import导入:

import {mapState,mapGetters,mapActions} from 'vuex';

使用ES6新语法-超引用,将某个功能下的数据或方法全部映射出来以供使用,下面是mapState、mapGetters、mapActions的例子:

	//这里的...是超引用,映射内容,可以写在computed下、methods下等(一般放在开头)
	// 直接从库中取值 - 将库里的users值返回给字典中的users并映射给this组件
 	...mapState({
         users:state=>state.home.users
      }),
     // 使用计算属性 - 将库里的users计算后的值返回给字典中的users并映射给this组件
    ...mapGetters('home',{
         users:'getUsers' //获取清理后的数据
         //由于home仓库 namespaced:true,所以第一个参数作为标识
         // 不使用标识访问的是主仓库
      })
      // 使用异步函数 - 以数组中的函数名,从库中对应的函数映射给this组件以供使用
    ...mapActions('home',['invokeAddUser'])
    // 有某个组件 <span @click='invokeAddUser(name)'></span>
    // 或者直接使用 this.invokeAddUser(name)

3. 扩展

mapState映射的三种写法

  computed: mapState({
   // 箭头函数可使代码更简练
    count: state => state.count,

    // 传字符串参数 'count' 等同于 `state => state.count`
    countAlias: 'count',

    // 为了能够使用 `this` 获取局部状态,必须使用常规函数
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })

2、当映射的计算属性的名称与state的子节点名称相同时,
   我们也可以给 mapState传一个字符串数组。
  computed: mapState([ // 数组
   "count"
  ])

3、仓库中action的第二种接收参数
const actions = {
    //自定义触发mutations里函数的方法,{commit}与store 实例具有相同方法和属性
    setThemeColorAction({commit},color,opacity){
     	commit('setThemeColor',color,opacity);
    }
};

3. 总结

1、Vuex 是一个专门为 Vue.js 应用所设计的集中式状态管理架构。它借鉴了 Flux 和 Redux 的设计思想,但简化了概念,并且采用了一种为能更好发挥 Vue.js 数据响应机制而专门设计的实现。

2、Vuex 的四个核心概念分别是:

  • The state tree:Vuex 使用单一状态树,用一个对象就包含了全部的应用层级状态。至此它便作为一个『唯一数据源(SSOT)』而存在。这也意味着,每个应用将仅仅包含一个 store 实例。单状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。
  • Getters: 用来从 store 获取 Vue 组件数据。
  • Mutators: 事件处理器用来驱动状态的变化。
  • Actions: 可以给组件使用的函数,以此用来驱动事件处理器 mutations

3、Vuex 应用中数据的流向(Vuex 官方图)

数据流都是单向的组件能够调用 actionaction 用来派发 Mutation只有 mutation 可以改变状态store 是响应式的,无论 state 什么时候更新,组件都将同步更新

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Vuex之理解Store的用法

    1.什么是Store? 上一篇文章说了,Vuex就是提供一个仓库,Store仓库里面放了很多对象.其中state就是数据源存放地,对应于与一般Vue对象里面的data(后面讲到的actions和mutations对应于methods). 在使用Vuex的时候通常会创建Store实例new Vuex.store({state,getters,mutations,actions})有很多子模块的时候还会使用到modules. 总结,Store类就是存储数据和管理数据方法的仓库,实现方式是将数据和方法

  • vue.js的状态管理vuex中store的使用详解

    一.状态管理(vuex)简介 vuex是专为vue.js应用程序开发的状态管理模式.它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.vuex也集成刀vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试.状态快照导入导出等高级调试功能. 二.状态管理核心 状态管理有5个核心,分别是state.getter.mutation.action以及module.分别简单的介绍一下它们: 1.state state为

  • vue3中router路由以及vuex的store使用解析

    目录 vue3 router路由及vuex store使用 1.路由 2.vuex vue3中router路由和vuex的store使用,获取对象基本使用 vue3中router和store使用方法 1.企业开发Router全局配置 2.企业开发Store全局配置 功能快捷键 vue3 router路由及vuex store使用 1.路由 <script> import { useRouter, useRoute } from 'vue-router' export default {   s

  • Vue使用Vuex一步步封装并使用store全过程

    目录 一.安装Vuex依赖 二.一步步封装store 1. main.js中全局引入store仓库(下一步创建) 2. this.$store 3. this.$store.state 4. this.$store.getters(this. $store.state的升级) 5. this.$store.commit(‘mutations’) 6. this.$store.dispatch(‘actions’)(this. $store.commit(‘mutations’)的升级) 7. s

  • Vue 搭建Vuex环境详解

    目录 搭建Vuex环境 总结 搭建Vuex环境 在src目录下创建一个文件夹store,在store文件夹内创建一个index.js文件 index.js用于创建Vuex中最核心的store // scr/vuex/index.js // 引入Vuex import Vuex from 'vuex' // 用于响应组件中的动作 const actions = {} // 用于操作数据 const mutations = {} // 用于存储数据 const state = {} // 创建sto

  • 巧用Vue.js+Vuex制作专门收藏微信公众号的app

    本文一步一步教大家如何利用Vue.js + Vuex制作专门收藏微信公众号的app 项目地址: https://github.com/jrainlau/wechat-subscriptor 下载&运行 git clone git@github.com:jrainlau/wechat-subscriptor.git cd wechat-subscriptor && npm install npm run dev   // run in dev mode cd backend-serv

  • VUE 3D轮播图封装实现方法

    本文为大家分享了VUE 3D轮播图封装的具体代码,供大家参考,具体内容如下 一.体验地址 VUE 3D轮播图 二.实现功能点 (1).无缝轮播 (2).进入变大.离开缩小(类3d切换效果) 三.js代码 <!--轮播图插件模板--> <template> </template> <script type="text/ecmascript-6"> import {swiper, swiperSlide} from 'vue-awesome-

  • 使用VueCli3+TypeScript+Vuex一步步构建todoList的方法

    前言 Vue3.x 即将来袭,使用 TypeScirpt 重构,TypeScript 将成为 vue 社区的标配,出于一名程序员的焦虑,决定现在 Vue2.6.x 踩一波坑. vue 官方文档已经简略地对 typescript 的支持进行了介绍,我们使用 Vue Cli3 直接生成项目 创建项目 ❓为什么使用 Vue Cli3 构建项目 官方维护,后续升级减少兼容性问题 使用以下配置进行项目的生成: Babel 对 Ts 进行转译 TSLint 对 TS 代码进行规范,后续会使用 prettie

  • VUE使用vuex解决模块间传值问题的方法

    在看电影.打Dota.撸代码间来回,犹豫不决,终于还是下决心继续学习VUE. 仿照 conde.js 官网写的一个demo,目前已经基本可用,但始终缺少登录页,没有用户权限管理,于是开撸...... <template> <div id="login"> <c-header></c-header> <c-form></c-form> <p class="content-block">

  • VUE利用vuex模拟实现新闻点赞功能实例

    回顾新闻详细页 很早我们的新闻详情页是在news-detail.vue 组件里,获取服务器数据,然后把数据保持到组件的data 里,既然我们已经用到了vuex,学习了它的state,我们就应该想到把返回的数据交给state 来存储. 1.首先在Vuex.Store 实例化的时候: state:{ user_name:"", newslist:[], newsdetail:{} }, 增加一个newsdetail 对象,newslist 数组是我们前面用来保存新闻列表数据的. 2.下面就

  • web前端vue之vuex单独一文件使用方式实例详解

    Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试.状态快照导入导出等高级调试功能. 上次我用了一个加减的例子为大家讲解vuex的基本的使用方式,和在什么样的情况下使用.上次还是在一个组件内把这个例子简单的展示了下,这次我把vuex抽离出来一个

  • 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果

    效果图如下所示: 在线地址: github.czero.cn/fancy 点击下载安卓apk安装包 源码地址: github.com/czero1995/f- 项目主架构 使用的库 vue-cli (vue+webpack脚手架) vue-router(路由跳转) vuex(状态管理) axios(数据请求) mock.js(模拟后台数据) vue-touch(手势判断) fastclick(解决移动端浏览器 300 毫秒点击延迟问题) vue-lazyload(图片懒加载) swiper(轮播

  • vue 2.x 中axios 封装的get 和post方法

    vue 2.x axios 封装的get 和post方法 import axios from 'axios' import qs from 'qs' export class HttpService { Get(url, data) { return new Promise((resolve, reject) => { axios.get(url, { params: data }).then((res) => { if (res) { //成功回调 resolve(res); } }).ca

随机推荐