当前位置: 首页 > news >正文

详解vue中vuex的用法

前言

说到 vuex 相信大家都不陌生,vuex 是一个专为 vue.js 应用程序开发的状态管理模式。vuex 背后的基本思想,就是单向数据流。今天我们就来好好聊聊 vuex

在这里插入图片描述


vuex?

用官方的话来说,vuex 是一个专为 vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。


状态管理?

状态就是数据。状态管理可以简单理解为把需要多个组件共享的变量全部存储在一个对象里面。然后将这个对象放在顶层的 vue 实例中,让其他组件可以使用。通过使用 vuex 可集中管理组件之间的数据(状态),使组件之间的数据共享变得简单。


如何安装 vuex?

1. 通过 npm 方式安装。

npm i vuex --save
npm i vuex@3.6.2 --save //安装特定版本
yarn add vuex //yarn安装方式

2. 在 main.js 中引入,然后挂载到 Vue 实例里。

import Vue from 'vue'
import store from './store'
new Vue({
  render: h => h(App),
  store
}).$mount('#app')

3. 在 scr 目录下创建一个 store/index.js 文件,写入以下内容。

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {}
const getters = {}
const mutations = {}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

vuex 的核心

一、state

state 简单来说就是一个状态,用户界面会随着 state 变化而变化。


栗子:

store/index.js 文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  name: "金闯",
  age: 18,
  count: 0
}
const getters = {}
const mutations = {}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>
    <h5>姓名:{{$store.state.name}}</h5>
    <h5>年龄:{{$store.state.age}}</h5>
    <h5>工龄:{{$store.state.count}}</h5>
  </div>
</template>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapState)⤵


二、getter

getter 就是一个计算属性。对 state 数据进行计算(会被缓存),类似于 vue 组件中的 computed,对 state 里的数据进行一些过滤、改造等等,例如我们要在 state.count 的基础上派生出一个新的状态 newCount 出来,就适合使用 getter 属性。


栗子:

store/index.js 文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  count: 5
}
const getters = {
  newCount: state => state.count * 6
}
const mutation = {}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutation,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>{{newCount}}</div>
</template>
<script>
export default {
  computed: {
    newCount() {
      return this.$store.getters.newCount;
    },
  },
};
</script>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapGetters)⤵


三、mutation

mutation 就是改变状态,唯一可修改 state 数据的场所。


栗子:

store/index.js 文件

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  count: 0
}
const getters = {}
const mutations = {
  addWay(state, num) {
    state.count = state.count + num;
    console.log(state.count);
  },
  minusWay(state) {
    state.count--;
    console.log(state.count);
  },
}
const actions = {}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>
    <el-button @click="addOn"></el-button>
    <el-button @click="minusOn"></el-button>
  </div>
</template>

<script>
export default {
  methods: {
    addOn() {
      this.$store.commit("addWay", 1); //每次+1
    },
    minusOn() {
      this.$store.commit("minusWay");
    },
  },
};
</script>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapMutations)⤵


四、action

action 就是一个异步操作,提交 mutation 执行异步操作(不是直接变更状态)。主要是用来解决异步流程来改变 state 数据。因为 mutation 是同步操作,如果你在 mutation 里进行异步操作,你会发现并不会起任何效果,故只能通过 action=>mutation=>state 流程修改。


栗子:

store/index.js 文件


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
  count: 0
}
const getters = {}
const mutations = {
  minusWay(state) {
    state.count--;
    console.log(state.count);
  },
}
const actions = {
  asyncAdd(context) {
    setTimeout(() => {
      context.commit("minusWay")
    }, 500)
  }
}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions,
})

任意 .vue 文件中使用

<template>
  <div>
    <el-button @click="minusOn"></el-button>
  </div>
</template>

<script>
export default {
  methods: {
    minusOn() {
      this.$store.dispatch("asyncAdd"); //dispatch触发action函数
    },
  },
};
</script>

页面效果

在这里插入图片描述

使用语法糖辅助函数(mapActions)⤵


五、modules

vuex 允许我们将 store 分割到模块。目的是为了让代码更好维护,让多种数据分类更加明确,每个模块都拥有独立的 state、mutation、action、getter ,甚至是嵌套子模块从上至下进行类似下面的拆分:

const moduleA = {
  state: {},
  mutations: {},
  actions: {},
  getters: {},
}

const moduleB = {
  state: {},
  mutations: {},
  actions: {},
  getters: {},
}

const store = new Vue.store({
  modules: {
    moduleA,
    moduleB
  }
})

vuex 辅助函数(语法糖)

辅助函数可以把 vuex 中的数据和方法映射到 vue 组件中。达到简化操作的目的。


一、mapState(state)

栗子:

<template>
  <div>
    <!-- 直接使用 -->
    <h5>姓名:{{name}}</h5>
    <h5>年龄:{{age}}</h5>
    <h5>工龄:{{count}}</h5>
  </div>
</template>
<script>
import { mapState } from "vuex"; //从vuex中按需导入mapstate函数
export default {
  // 辅助函数使用
  computed: {
    ...mapState(["name", "age", "count"]),
  },
};
</script>

二、mapGetters(getter)

栗子:

<template>
  <div>{{newCount}}</div>
</template>
<script>
import { mapGetters } from "vuex"; //从vuex中按需导入mapGetters函数
export default {
  computed: {
    ...mapGetters(["newCount"]),
  },
};
</script>

三、mapMutations(mutation)

栗子:

<template>
  <div>
    <el-button @click="addOn"></el-button>
    <el-button @click="minusOn"></el-button>
  </div>
</template>
<script>
import { mapMutations } from "vuex"; //从vuex中按需导入mapMutations函数
export default {
  methods: {
    ...mapMutations(["addWay", "minusWay"]),
    addOn() {
      this.addWay(1); //直接调用
    },
    minusOn() {
      this.minusWay();// 直接调用
    },
  },
};
</script>

四、mapActions(action)

栗子:

<template>
  <div>
    <el-button @click="minusOn"></el-button>
  </div>
</template>
<script>
import { mapActions } from "vuex"; //从vuex中按需导入mapActions函数
export default {
  methods: {
    ...mapActions(["asyncAdd"]),
    minusOn() {
      this.asyncAdd(); // 直接调用
    },
  },
};
</script>

相关文章:

  • 利用Bat打开exe程序并传入值
  • 【iMessage苹果推群发】苹果相册推它由pushchatkey.pem和pushchatcert.pem作为单独的文件使用
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • 基于Xlinx的时序分析与约束(5)----衍生时钟约束
  • Python常见问题整理
  • Docker安装Zookeeper教程(超详细)
  • 【学习笔记12.25】动态规划入门
  • C语言用好写好头文件
  • 程序员过圣诞 | 用HTML写出绽放的烟花
  • 源码系列 之 HashMap
  • docker logs实时查看日志tail
  • Win10从零安装、训练、部署yolov5 6.x一条龙实战案例
  • 东北大学c++实验最后一次
  • 十六、Docker Compose容器编排第一篇
  • 时序预测 | MATLAB实现IWOA-LSTM和LSTM时间序列预测(改进的鲸鱼算法优化长短期记忆神经网络)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • docker容器内的网络抓包
  • in typeof instanceof ===这些运算符有什么作用
  • laravel 用artisan创建自己的模板
  • Linux下的乱码问题
  • React as a UI Runtime(五、列表)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于List、List?、ListObject的区别
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 如何设计一个微型分布式架构?
  • 小程序开发之路(一)
  • Java总结 - String - 这篇请使劲喷我
  • 阿里云服务器如何修改远程端口?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)STL算法之遍历容器
  • (C++17) std算法之执行策略 execution
  • (javascript)再说document.body.scrollTop的使用问题
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (正则)提取页面里的img标签
  • *1 计算机基础和操作系统基础及几大协议
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net 7 上传文件踩坑
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 中 GetProcess 相关方法的性能
  • .NET企业级应用架构设计系列之应用服务器
  • @RequestBody与@ResponseBody的使用
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷