专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信

应用场景:

  • 多个组件依赖于同一状态、共享数据
  • 来自不同组件的行为需要变更同一状态
  • vuex

vuex原理

每一个 Vuex 应用的核心就是 store,里面又包括:

  1. State(状态):用于数据的存储(对象类型数据),是store中唯一数据源
  2. Actions(行为):类似于mutation,用于提交mutation来改变状态,而不直接变更状态,可以包含任意异步事件
  3. Mutations(转变):类似函数,改变state数据的唯一途径,且不能用于处理异步事件,Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方
  4. Getter(数据加工):如vue中的计算属性一样,基于state数据的二次包装,常用于数据的筛选和多个数据的相关计算
  5. Module:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

vuex环境

  1. 安装vuex

    vue2:使用vuex3版本

    vue3:使用vuex4版本

    # 安装3版本
    npm i vuex@3
  2. 创建Store

    创建store文件夹,下面创建index.js (官方推荐) or 创建vuex文件夹,创建store.js文件,自定义写法

    import Vue from "vue"
    import Vuex from "vuex" // 使用vuex插件,使用之后,创建vm的时候,可以传入store配置项
    // new Vuex.Store 必须使用了Vuex之后,否则报错
    // 如果在main.js 使用 然后引包,脚手架会先执行所以import代码再执行其他代码 也会报错
    Vue.use(Vuex) // 定义actions-用于响应组件中的动作(mutations)
    const actions = {} // 定义mutations-用于操作数据(state)
    const mutations = {} // 定义state,用于存储数据
    const state = {} // 创建Store
    const store = new Vuex.Store({
    actions,
    mutations,
    state
    }) // 暴露store
    export default store

  3. 配置store

    // main.js
    
    import  store from "./store"
    
    new Vue({
    render: h => h(App),
    store // 配置导入的store,在vm和vc身上可以通过.$store访问 }).$mount('#app')

基本使用

1.初始化数据
// 定义state,用于存储数据
// 数据被mutations修改
const state = {
// 定义一个count
count: 0
}
2. 配置actions
// 定义actions-用于响应组件中的动作(mutations)
// 该对象中的方法用于commit响应mutations中的方法操作数据
// 该对象被dispatch触发
const actions = {
// 定义add方法
// context:上下文对象,包含commit、dispatch、getter、state、roomGetter、rootState
// value是调用方传递的值
add: function (context, value) {
// 将数据提交到ADD方法(mutations中定义的),此时不会直接修改数据
// 可以通过context.dispatch触发其他actions
context.commit("ADD", value) }
}
3. 配置mutations
// 定义mutations-用于操作数据(state)
// 该对象被actions中的commit and 其他地方的commit触发
const mutations = {
ADD(state, value) {
// state是数据对象,包含getter、setter等
// value是调用方传递的值
// 通过数据对象操作数据,此时会直接修改值
state.count += value } }
4.操作store.js
methods: {
increment(){
// 触发回调的时候 调用$store.dispatch,调用actions里的add方法,参数是n
// actions相当于一个中转,如果参数需要做其他逻辑处理调用dispatch this.$store.dispatch("add",this.n) // 也可以直接操作this.$store.commit("ADD",this.n),调用mutations里的ADD方法
// 如果不需要其他逻辑处理,直接修改数据调用commit
this.$store.commit("ADD",this.n) }
5.模版中访问
<!-- 模版中直接通过$store访问 -->
{{$store.state.count}}

getters配置项

getters的功能类似于 Vue 组件中的计算属性。它们都是用于对已有的数据(在 Vuex 中是state)进行计算或者过滤后返回一个新的值

  1. 定义getters

    // 用于将state中的数据进行加工
    const getters = {
    // 定义一个doubleCount属性
    doubleCount(state){
    // state 是数据对象
    return state.count * 2 }
    } const store = new Vuex.Store({
    actions,
    mutations,
    state,
    getters
    })
  2. 使用getters

    this.getters.doubleCount
    <!-- 模版中使用 -->
    {{$store.getters.doubleCount}}

store中的map方法

mapState

用于帮助我们映射state中的数据为计算属性

   ```js

import {mapState} from "vuex";

computed: {

// 对象写法 等同于 count(){{return this.$store.state.count}}

// 如果要修改state中的值 可以写箭头函数返回

...mapState({count: "count", count2: (state)=> state.count * 2}),

// 数组写法

// 等同于 count(){return this.$store.state.count}

// 相当于把stage中的数据以同名的方式映射到计算属性中

...mapState(["count"])

}

```

mapGetters

用于帮助我们映射getters中的数据为计算属性

      ```js

import {mapGetters} from "vuex"

computed: {

// 数组写法 doubleCount(){ return this.$store.getters.doubleCount}

...mapGetters(["doubleCount"]),

// 对象写法 doubleCount(){ return this.$store.getters.doubleCount}

...mapGetters({doubleCount: "doubleCount"})

}

```

mapActions

用于帮助我们生成与actions对话的方法,即:包含$store.dispatch()的函数

import {mapActions} from 'vuex'

	methods: {

      //  等同于 addCount(){this.$store.dispatch("add",value)}
// 这里的value 需要在使用此回调函数的地方绑定 @click="addCount(要传递的参数)"
// 如果不在使用的地方绑定,则ADD方法内部收到的value 是点击事件
...mapActions({addCount: "add"}), // 数组写法,原理与mapState一致
...mapActions(["add"]),
},
mapMutations

用于帮助我们生成与mutations对话的方法,即:包含$store.commit()的函数

import {mapMutations} from 'vuex'

	methods: {

      //  等同于 increment(){this.$store.commit("ADD",value)}
// 这里的value 需要在使用此回调函数的地方绑定 @click="increment(要传递的参数)"
// 如果不在使用的地方绑定,则increment方法内部收到的value 是点击事件
...mapMutations({increment: "ADD"}), // 数组写法,原理与mapState一致
...mapMutations(["ADD"]), },

vuex模块化&命名空间

当 Vue 应用规模变大时,store中的状态(state)、变更操作(mutations)、异步操作(actions)和获取器(getters)也会变得复杂繁多。Vuex 模块化允许将store分割成多个模块,每个模块都有自己独立的statemutationsactionsgetters,就像有多个小的 Vuex store一样。

模块化使得代码结构更加清晰,便于团队开发和维护。不同的功能模块可以有各自独立的状态管理逻辑,例如一个电商应用中,可以有用户模块、商品模块、订单模块等,每个模块管理自己相关的状态和操作

模块化
  • 包含多个 module ,一个 module 是一个 store 的配置对象 与一个组件(包含有共享数据)对应
  1. 定义模块

    // 自定义一个对象,里面包含vuex的对方方法
    const sumOptions = {
    actions: {},
    mutations:{},
    state:{},
    getters:{sum:10} } // 自定义一个对象,里面包含vuex的对方方法
    const countOptions = {
    actions: {},
    mutations:{},
    state:{count:20} } //创建并暴露store
    export default new Vuex.Store({
    // 模块配置
    modules: {
    // store里面有一个sum模块,对应的是sumOptions对象里面的方法
    sumModules: sumOptions, // store里面有一个count模块,对应的是countOptions对象里面的方法
    countModules: countOptions
    } })
  2. 使用模块store数据

    {{$store.state.sumModules.sum}}
    this.$store.state.sumModules.sum
  3. 通过map方法映射模块对象访问

        // 映射的是模块对象
    ...mapState(["sumModules","countModules"])
    <!--在模版中可以使用 {{模块名.属性访问}}-->
    {{sumModules.sum}}
命名空间

可以开启模块的命名空间,使用map方法的时候通过指定模块名字和属性、方法名字进行映射

  1. 通过namespaced开启命名空间

    const sumOptions = {
    namespaced:true, // 开启命名空间
    actions: {},
    mutations:{},
    state:{sum:10}, }
  2. 读取指定模块的数据

    // 使用map读取
    // new store的时候指定的模块名、要映射的属性,其他map方法方法映射同理
    ...mapState("sumModules",["sum"])
    // {{sum}}
    // 自己直接读取  state.模块名.属性名
    this.$store.state.sumModules.sum
  3. 读取getters数据

    // 使用map读取
    // 模块名,[要映射的数据]
    ...mapGetters('countAbout',['bigSum'])
    // 直接读取  模块名/属性名
    this.$store.getters['sumModules/doubleSum']
  4. commit和dispatch

    // 直接读取
    // 模块名/方法名,参数
    this.$store.commit("sumModules/ADD",100)
    this.$store.dispatch("sumModules/add",100)
    // 使用map映射   模块名  [要映射的方法]
    ...mapMutations('sumModules',{setSum:'ADD'}), ...mapActions('sumModules',{commitSum:'add'}) // 传参原理与未开启命名空间原理一致
模块化推荐设计
  • store 文件夹:在项目的根目录下创建一个专门的store文件夹,用于存放所有与 Vuex 相关的代码。这个文件夹是整个 Vuex 模块管理的核心区域。
  • 模块文件夹:在store文件夹内,为每个主要的功能模块创建一个单独的文件夹。例如,如果是一个电商应用,可以有user模块文件夹、product模块文件夹、order模块文件夹等。每个模块文件夹用于存放该模块相关的statemutationsactionsgetters的定义文件,export暴露给外部
  • index中用于注册vuex插件、new vuex对象、导入所有模块,统一管理

vue2-vuex的更多相关文章

  1. 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用

    源码地址: https://github.com/bailicangdu/vue2-elm 技术栈 vue2 + vuex + vue-router + webpack + ES6/7 + fetch ...

  2. 基于vue2+vuex+vue-router+sass+webpack的网易云音乐

    [本博客为原创:http://www.cnblogs.com/HeavenBin/]  前言: 这段时间写的一个项目,供给大家互相学习,有什么疑问可以issues我. 源码地址:https://git ...

  3. 搭建Vue2+Vuex+Webpack+Pug(jade)+Stylus环境

     一.开发环境配置 开始之前,假设你已经安装了最新版本的 node 和 npm. 全局安装 vue-cli 和 webpack : npm install vue-cli webpack -g 创建工 ...

  4. vue2 vuex 简单入门基础

    1.vuex中文文档 https://vuex.vuejs.org/zh-cn/api.html 2.我理解vuex 应用观察者模式 设置了全局的状态 state 状态变化即通知更新全局state 3 ...

  5. vue2 — vuex状态管理

    一.为什么使用vuex : https://www.cnblogs.com/goloving/p/9080005.html vuex的功能 和 localstorage 的作用是一样,把数据在一个所有 ...

  6. 基于vue2.0 +vuex+ element-ui后台管理系统:包括本地开发调试详细步骤

    效果演示地址, github地址: demo演示:         1.About 此项目是 vue2.0 + element-ui + node+mongodb 构建的后台管理系统,所有的数据都是从 ...

  7. 用vue2.0+vuex+vue-router+element-ui+mockjs实现后台管理系统的实践探索

    A magical vue element touzi admin. 效果演示地址 更多demo展示 分支说明 master分支:前后端统一开发的版本:可以用于学习nodejs+mongodb+exp ...

  8. Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天

    前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...

  9. vue2.0 练习项目-外卖APP(1)

    前言 vue这个框架现在挺流行的,作为一个专注前端100年的代码爱好者,学习下路径流行的框架是必须的!在网上搜索vue的项目是比较少的,在官网进行了入门学后,没有一个项目练习巩固下,学了就等于没学,所 ...

  10. [Vue] vuex进行组件间通讯

    vue 组件之间数据传输(vuex) 初始化 store src/main.js import Vuex from "vuex"; Vue.use(Vuex); new Vue({ ...

随机推荐

  1. tar 解压文件时提示 Ignoring unknown extended header keyword

    在 Linux 上使用 tar 解压文件时出现下列提示: tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.app ...

  2. WKCTF RE

    WKCTF so_easy 安卓逆向,关键的check逻辑都在native层里面 主要是很多层的异或操作 除了Z3和爆破想不到其他方法了 from z3 import * src = [ 0xAE, ...

  3. 八,SpringBoot Web 开发访问静态资源(附+详细源码剖析)

    八,SpringBoot Web 开发访问静态资源(附+详细源码剖析) @ 目录 八,SpringBoot Web 开发访问静态资源(附+详细源码剖析) 1. 基本介绍 2. 快速入门 2.1 准备工 ...

  4. AGC007F 题解

    题意 给定两个长为 \(n\) 的字符串 \(S, T\),求最少进行多少次操作才能使 \(S = T\). 一次操作定义为:对于 \(i = 1, 2, .. n\),令第 \(i\) 位为操作后的 ...

  5. Pytorch数据加载与使用

    前言 在训练的时候通常使用Dataset来处理数据集. Dataset的作用 提供一个方式获取数据内容和标签(label). 实战 from torch.utils.data import Datas ...

  6. SpringCloud入门(二)服务间调用和案例

    一.微服务拆分注意事项微服务拆分注意事项:1.单一职责:不同微服务,不要重复开发相同业务2.数据独立:不要访问其它微服务的数据库3.面向服务:将自己的业务暴露为接口,供其它微服务调用 1.微服务需要根 ...

  7. Identity – user login, forgot & reset password, 2fa, external login, logout 实战篇

    前言 之前写过一篇 Identity – User Login, Forgot Password, Reset Password, Logout, 当时写的比较简陋, 今天有机会就写多一篇实战版. 建 ...

  8. ASP.NET Core – Try Preview

    前言 .NET 7 已经来到 RC 阶段了. 通常 RC 就是我们 (写库的人) 要入场的时候了. 有发现 Bug 要尽可能在这段期间提交. 不然后患无穷. 这篇主要就是来讲讲如果测试 RC 版本的 ...

  9. 靠着这篇笔记,我拿下了16k车载测试offer!

      如何写简历 个人技能 个人技能一般不要超过10条,一般在8条内. 一.测试流程和技术 1.熟悉车载系统研发和测试流程,能独立编写各种测试文档. 2.熟悉车载系统测试用例设计思路,能独立编写仪表和车 ...

  10. 音视频入门-5-音频编码原理、编码器、ADTS格式

    1.  概念 音频压缩技术指的是对原始数字音频信号流(PCM编码)运用的数字信号处理技术. 2. 背景 和 压缩的必要性 研究发现,直接采用PCM码流进行存储和传输存在非常大的冗余度. 以CD为例,其 ...