1.前言

  • Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它解决了vue中不同组件之间状态共享的问题。
  • 通俗的说,它就是一个带响应式的全局变量管理,它数据的改变会触发相关页面/组件的更新,这是普通全局变量做不到的

2.vuex的安装及配置

  • npm安装vuex
npm install vuex --save
  • 编写vuex模块
//src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex' // Vue.js 插件
Vue.use(Vuex) const state = {
count: 0
} const getters = { }
//Vuex中store数据改变的唯一方法就是mutation
const mutations = { } // mutations的再封装,mutations本身只负责state的数据修改,其余逻辑放在actions中,在通过它进行一系列逻辑处理之后再调用mutations
const actions = { } export default new Vuex.Store({
state,// 状态对象,相当于data
getters,// 包含多个getter计算属性函数的对象
mutations, // mutations 里面装着改变数据的方法集合,处理数据逻辑的方法全部放在 mutations 里,使数据和视图分离。
actions // action 可以包含任意异步操作,例如发送ajax请求
})
  • 入口文件中引入vuex模块
// main.js
import Vue from 'vue'
import App from './App'
import router from './router' import store from './store' Vue.config.productionTip = false new Vue({
el: '#app',
router,
components: { App },
template: '<App/>',
store
})

3.state和getters的定义

  • state的值为一个对象,里面的键值对就是一个个状态(数据)
const state = {
count: 0,
msg:''
}
  • getters类似于vue中的计算属性,他是一个对象,里面可以定义多个方法
  • 每个方法需要返回一个值,这个值就是这个属性的值
  • 每个方法存在2个参数,分别为:state和getters
const getters = {
OddorEven (state,getters) {
// vuex已经为其传递了state和getters这个参数 //返回的值就是这个属性的值
return state.count%2===0 ? '偶数':'奇数'
}
}

4.组件中读取state和getters

  • 可以直接在组件的HTML模版中直接绑定数据(不推荐,uni-app中这种写法不支持)
<p>{{$store.state.count}} </p>
<p>{{$store.getters.OddorEven}}</p>
  • 在组件的js中,通过this.$store来读取state和getters
created(){
console.log(this.$store.state.count)
console.log(this.$store.getters.OddorEven)
}
  • 推荐通过计算属性来同步state和getters到组件中,再绑定到HTML模版
<p>{{count}} </p>
<p>{{OddorEven}}</p>
computed:{
count(){
return this.$store.state.count
},
OddorEven(){
return this.$store.getters.OddorEven
}
}
  • 不可对state和getters进行赋值
this.$store.state.count = 100 //不支持

5.mutations的定义和调用

  • vuex中的state数据涉及多个组件,为了方便管理这些公共数据,它希望通过方法调用的形式来修改这些数据,而不是直接赋值修改(毕竟方法名比直接赋值更加直观,更能表现代码意图),所以就有了mutations
  • mutations就是这些方法的集合,里面可定义多个方法,专门修改state的数值,参数一固定为state,参数二是方法调用时的传参,如果要传递多个参数,可将其封装成一个对象
//定义mutations
const mutations = {
INCREMENT (state) {
state.count++
},
CHANGEMSG(state,val){
// 函数的第一个参数永远是state,便于读取state
// 自定义传递的参数是第二个,可以省略
state.msg = val
}
}
  • vue组件中通过$store.commit()方法来调用mutations中定义的方法
methods: {
test() {
// 触发vuex里面mutations的相关方法 'INCREMENT'
this.$store.commit('INCREMENT')
// 传递参数
this.$store.commit('CHANGEMSG','msg改变了')
}
}

6.actions的定义和调用

  • 前面的mutations中,它只负责单纯的修改state数据,而我们修改数据的时候直接往往还要进行其他逻辑处理,所以就有了actions
  • actions是众多方法的集合,通过它进行逻辑处理后,再调用mutations中的方法修改state的数据
  • actions中的方法有参数一是固定的{commit,state},自定义参数为参数二
const actions = {
incrementFn ({commit,state}) {
if(state.count < 100){
commit('INCREMENT')
}
},
changeMsgFn ({commit,state},newMsg){
// 参数一是固定的
// 第二个参数为传递的参数
setTimeout(() => {
commit('CHANGEMSG',newMsg)
},1000)
}
}
  • vue中通过$store.dispatch()方法来调用actions中的方法
//vue组件
methods: {
test() {
// 触发vuex里面actions的相关方法
this.$store.dispatch('incrementFn')
//传递参数
this.$store.dispatch('changeMsgFn','msg改变了')
}
}

7.代码优化 mapState/mapGetters/mapMutations/mapActions

  • 一般情况下,可以使用组件的计算属性同步state数据和getters数据,使用methods中的方法来调用mutationsactions中的方法
methods: {
//定义一个调用mutations的方法
incrementFn() {
this.$store.commit('INCREMENT')
},
//定义一个调用actions的方法
changeMsgFn() {
this.$store.dispatch('changeMsgFn')
}
},
computed:{
count(){
return this.$store.state.count
},
OddorEven(){
return this.$store.getters.OddorEven
}
}
  • vuex提供一种简写的方式来调用vuex中的state/getters/mutations/actions

    (1)引入mapState,mapGetters,mapMutations,mapActions
import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'

// mapState(['count'])返回一个对象 count:function(){}
// 相当于获取store.state.count的值

(2)使用ES6扩展运算符将这个对象的键值对插入到vue计算属性和methods中

//使用数组传参,需要vue和actions的名称一致
computed: {
...mapState(['count']),
...mapGetters(['OddorEven'])
},
methods: {
...mapActions(['increment']),
...mapActions(['incrementIfOdd']),
...mapActions(['incrementAsync'])
}

(3)也可以使用对象形式传参,这种形式可以自定义组件中的方法名称

语法: ...mapGetters({vue名称:'action名称'})

8.配合v-model使用

涉及双向数据绑定要使用vue的计算属性设置get方法和set方法

(1)在get方法中使用$store.state读取状态数据

(2)在set方法中使用$store.commit()修改状态数据

// 组件模版
<input type="text" v-model="msg"></input>
// vue的计算属性
computed: {
msg: {
get(){
return this.$store.state.msg
},
set(val){
this.$store.commit('changeMsg',val)
}
}
}
// store模块
const state = {
msg:''
}
const mutations = {
CHANGEMSG(state,val){
state.msg = val
}
}

Vue.js vuex的更多相关文章

  1. 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app

    一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...

  2. [Nuxt] Build a Vue.js Form then use Vuex Actions to Post to an API in Nuxt

    The default behavior of submitting an HTML form is to reload the page. You can use the Vue.js @submi ...

  3. Vue.js组件间通信方式总结

    平时在使用Vue框架的业务开发中,组件不仅仅要把模板的内容进行复用,更重要的是组件之间要进行通信.组件之间通信分为三种:父-子:子-父:跨级组件通信.下面,就组件间如何通信做一些总结. 1.父组件到子 ...

  4. Vue.js 系列教程 4:Vuex

    这是关于 JavaScript 框架 Vue.js 五个教程的第四部分.在这一部分,我们会学习使用 Vuex 进行状态管理. 这不是一个完整的指南,而是基础知识的概述,所以你可以了解 Vue.js 以 ...

  5. vue.js移动端app实战3:从一个购物车入门vuex

    什么是vuex? 官方的解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 简单来说就 ...

  6. Vue.js 2.x笔记:状态管理Vuex(7)

    1. Vuex简介与安装 1.1 Vuex简介 Vuex是为vue.js应用程序开发的状态管理模式,解决的问题: ◊ 组件之间的传参,多层嵌套组件之间的传参以及各组件之间耦合度过高问题 ◊ 不同状态中 ...

  7. Vue.js——快速入门Vuex

    一. 什么是Vuex? Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化. 上图中绿色虚线包裹起 ...

  8. 基于Vue.js 2.0 + Vuex打造微信项目

    一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...

  9. [译]Managing Vue.js State with Vuex

    原文 准备 安装 Vuex, 是Vue官方出的package, 它不是Vue内置的.需要另外安装. npm install vuex --save 然后,需要在应用启动文件启用Vuex. main.j ...

  10. vue.js和vue-router和vuex快速上手知识

    vue.js和vue-router和vuex快速上手知识 一直以来,认为vue相比react而言,学习成本会更低,会更简单,但最近真正接触后,发现vue的各方面都有做一些客户化的优化,有一些亮点,但也 ...

随机推荐

  1. Hash表实践 —— 两数之和

    目录 题目背景 解题思路 题目背景 这个题目用常规的双循环就可以完成. 但不是最优解.为什么? 看看他的步骤数: N =[3,2,4] 求结果为6的两个元素坐标如下, 1). 3+2 = 5 不等于 ...

  2. JavaScript – ES6-ES2023 大杂烩

    前言 一年半没有写 JS 了, 今天开始来个大复习, 顺便把这么多年零零散散的知识点做成笔记. 练练字. ES 3, 5, 6, 2017, 2018... ES 6 等于 ES2015 ES 7 等 ...

  3. MyBatis——案例——查询-单条件查询-动态条件查询

    单条件查询-动态条件查询(choose(when,otherwise))      从多个条件中选择一个   choose(when,otherwise) 选择,类似于java中的Switch语句(w ...

  4. C# 裁剪PDF页面

    在处理PDF文档时,有时需要精确地裁剪页面以适应特定需求,比如去除广告.背景信息或者仅仅是为了简化文档内容.本文将介绍如何使用免费.NET控件通过C#实现裁剪PDF页面. 免费库 Free Spire ...

  5. 【赵渝强老师】管理Docker镜像

    一.什么是Docker的镜像 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙 ...

  6. 【赵渝强老师】Kubernetes平台中日志收集方案

    一.K8s整体日志收集方案 整体的日志收集方案,如下图所示: Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或 ...

  7. 【VMware VCF】使用 SFTP 服务器备份 VCF 核心组件的配置文件。

    可以定期对 VMware Cloud Foundation 环境中的相关核心组件(如 SDDC Manager.NSX Manager 以及 vCenter Server 等)创建配置备份,以防止当意 ...

  8. js 时间日期

    Date.parse()  把字符串时间转化为时间戳. new Date(时间戳) 转化 时间格式 时间比较大小

  9. (系列六).net8 全局异常捕获机制

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  10. 时隔半年 DotNetGuide 已突破了 6.6K + Star,持续更新,欢迎更多小伙伴PR投稿!

    前言 记得今年5月份的时候 DotNetGuide GitHub才突破5k Star,经过持续不断地输出时隔半年 DotNetGuide 已突破了 6.6K + Star!并且由我创建的DotNetG ...