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. DOM – Dimension & Coordinate (offset, client, computed, rect)

    前言 很多年前有记入过一篇 box-sizing 和 dom width. 想想也挺可悲的, 那年我是负责后端的, 却要帮着前端去学习这些知识来解决问题... 也好, 现在 full stack, 也 ...

  2. Angular 学习笔记 work with zip (压缩文件格式)

    最近在做批量创建. 上回说到了 读写 excel, 那么就可以通过 excel 的资料来创建资料了.但是资料经常会有图片,而 excel 里面放图片有点不太好. 于是就想 upload excel 的 ...

  3. POJ-3176 Cow Bowling(基础dp)

    The cows don't use actual bowling balls when they go bowling. They each take a number (in the range ...

  4. Servlet——Tomcat8以前解决中文乱码问题

    Request 请求参数中文乱码问题         // 1.解决乱码问题:POST,getReader() request.setCharacterEncoding("UTF-8&quo ...

  5. debian 12 编译 vlc/libvlc 支持 rtsp

    debian 官方从11开始,不再提供支持 rtsp 的 VLC deb 包,通过 libvlc 播放 rtsp 也无法实现,因此需要自己编译. # 安装编译环境,编译依赖库以及 contrib 第三 ...

  6. MMU和SMMU IOMMU使用场景和区别,SMMU技术与cache

    1.各种MMU MMU是memory manage unit 内存管理单元: SMMU是system memory manage unit 系统内存管理单元: IOMMU和SMMU的功能基本相同,只是 ...

  7. 高通Perflock

    高通的Perflock是Qualcomm公司开发的一项技术,用于优化设备性能和功耗管理.Perflock是一种锁定机制,允许操作系统或应用程序在需要时对处理器的性能状态进行控制,从而确保在关键任务或高 ...

  8. AWR分享案例

    [深度长文]循序渐进解读Oracle AWR性能分析报告 - ORACLE - dbaplus社群:围绕Data.Blockchain.AiOps的企业级专业社群.技术大咖.原创干货,每天精品原创文章 ...

  9. ​Meteor:全栈JavaScript开发框架的先驱

    Meteor 是一个功能强大且易用的全栈 JavaScript 框架,它简化了现代 Web 应用的开发流程,从数据库到用户界面都可以通过一套统一的技术栈来实现.无论你是构建实时应用还是想要一个快速的原 ...

  10. 痞子衡嵌入式:瑞萨RA系列FSP固件库分析之外设驱动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是瑞萨RA系列FSP固件库里的外设驱动. 上一篇文章 <瑞萨RA8系列高性能MCU开发初体验>,痞子衡带大家快速体验了一下瑞萨 ...