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. Yarn 3.0 Plug'n'Play (PnP) 安装和迁移

    前言 以前用 npm, 后来 yarn 火了就用 yarn. 后来 yarn 2.0 大改版, Angular 不支持就一直没用. 一直到去年的 Angular 13 才开始支持. 最近又开始写 An ...

  2. js 翻译 c# 注意事项

    1. split('') 在 c# 是不可以 .Split("") 的 要写 ToCharArray() 更新: 2021-09-25, split('') 是不好的写法, es6 ...

  3. C++ 模板(函数模板与类模板)

    模板 模板介绍 C++提供了函数模板(function template).所谓函数模板.实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就称为函数模板. ...

  4. Maven高级——继承与聚合

    继承与聚合 聚合 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合 聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个pom文件) 作用:使用聚合工程可以将 ...

  5. C# 的运算符和作用域

    // C# 运算符 // 表达式 表达式有操作数(operand)和运算符(operator)构成: // 常见的运算符 + - * / 和 new // x ?? y 如果x为null, 则计算机过 ...

  6. 7-11 leetcode 2612

    请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠这么多毫秒.要求此函数可以解析任何值. ps: promise 期约函数 (异步函数)的使用 ,promise 是一个对象  new ...

  7. ADO.NET 事务 transaction

    事务回滚:

  8. 【异常处理】Assistive Technology not found: com.sun.java.accessibility.AccessBridge

    十一回来之后,工作电脑上的抓包工具Charles突然启动不起来了,双击图标后,一闪而过,就没动静了. 不知道是不是因为之前安装了什么工具.软件引起的. 打开CMD命令行,跳转到目录下启动,提示:Ass ...

  9. JOI Open 2018

    T1 Bubble Sort 2 题意:给定一个长度为 \(n\) 的序列 \(a\),进行 \(q\) 次修改,第 \(i\) 次将第 \(x_i\) 个元素的值修改为 \(y_i\). 对于每次操 ...

  10. IHostedService(BackgroundService)的启动和停止顺序

    一句话总结: 按照Add顺序启动, 先启动, 后停止. Host 源代码 public async Task StartAsync(CancellationToken cancellationToke ...