Vue.js vuex
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中的方法来调用mutations和actions中的方法
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的更多相关文章
- 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app
一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...
- [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 ...
- Vue.js组件间通信方式总结
平时在使用Vue框架的业务开发中,组件不仅仅要把模板的内容进行复用,更重要的是组件之间要进行通信.组件之间通信分为三种:父-子:子-父:跨级组件通信.下面,就组件间如何通信做一些总结. 1.父组件到子 ...
- Vue.js 系列教程 4:Vuex
这是关于 JavaScript 框架 Vue.js 五个教程的第四部分.在这一部分,我们会学习使用 Vuex 进行状态管理. 这不是一个完整的指南,而是基础知识的概述,所以你可以了解 Vue.js 以 ...
- vue.js移动端app实战3:从一个购物车入门vuex
什么是vuex? 官方的解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 简单来说就 ...
- Vue.js 2.x笔记:状态管理Vuex(7)
1. Vuex简介与安装 1.1 Vuex简介 Vuex是为vue.js应用程序开发的状态管理模式,解决的问题: ◊ 组件之间的传参,多层嵌套组件之间的传参以及各组件之间耦合度过高问题 ◊ 不同状态中 ...
- Vue.js——快速入门Vuex
一. 什么是Vuex? Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化. 上图中绿色虚线包裹起 ...
- 基于Vue.js 2.0 + Vuex打造微信项目
一.项目简介 基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面,实现了微信聊天.搜索.点赞.通讯录(快速导航).个人中心.模拟对话.朋友圈.设置等功能. 二. ...
- [译]Managing Vue.js State with Vuex
原文 准备 安装 Vuex, 是Vue官方出的package, 它不是Vue内置的.需要另外安装. npm install vuex --save 然后,需要在应用启动文件启用Vuex. main.j ...
- vue.js和vue-router和vuex快速上手知识
vue.js和vue-router和vuex快速上手知识 一直以来,认为vue相比react而言,学习成本会更低,会更简单,但最近真正接触后,发现vue的各方面都有做一些客户化的优化,有一些亮点,但也 ...
随机推荐
- STL标准模板库
STL(Standard Template Library)标准模板库 是C++标准库中的一个重要组成部分,它提供了一组通用的模板类和函数,用于数据结构和算法的实现.STL的核心部分包括容器.算法和迭 ...
- USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)
1.概述 如下图所示,Linux内核中USB主机体系结构由五部分组成,分别为Application Software.USB Class Driver.USB Core((USB Driver).US ...
- GPT分区和MRB分区
GPT分区和MBR分区都是硬盘分区的方式,但它们有不同的实现方法和优缺点. MBR(Master Boot Record)分区是传统的分区方式,它将硬盘分为四个主分区或者三个主分区和一个扩展分区.在每 ...
- 最受DBA欢迎的数据库技术文档-巡检篇
有人说,"数据库巡检是数据库运维领域最重要的工作".的确,为了保证数据库的稳定.安全运行,除了可以对数据库进行监控以及时知晓故障苗头,定期的"健康体检"则尤为重 ...
- 通过脚手架 npx 创建 react 项目
npx create-react-app create-react --template typescript 使用 ts 模板
- C#的 ArrayList集合 和 List 集合
// 集合 & 字典的初识 // 集合的使用 // 集合与数组比较类似,都用于存放一组值 // 数组的优劣势分析 // 1. 优势:数组在内存中是连续存储的,所以他的索引速度非常的快,而且赋值 ...
- 【Treatment-Rec 论文阅读】Data-driven Automatic Treatment Regimen Development and Recommendation
Data-driven Automatic Treatment Regimen Development and Recommendation Authors: Leilei Sun, Chuanren ...
- Android复习(一)基础知识
1. 现在可以使用 Kotlin.Java 和 C++ 语言编写 Android 应用 2.Android四大组件依然坚挺,这是基础并且没有改变的迹象 Activity 服务 广播接收器 内容提供程序 ...
- 基于乐鑫 ESP32-C3 的 Matter Light 实践
背景介绍 最近公司在研究 Matter 协议在智能家居领域的市场机会,考虑到易用性和文档支撑等方面,相比较 Telink,产品部门对乐鑫的 Matter-SDK 更感兴趣,因而开展了一些测试工作,毕竟 ...
- KubeKey 升级 KubeSphere 和 Kubernetes 补丁版本实战指南
作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 KubeSphere 补丁版本 KubeKey 如何升级 Kubernetes 补丁版本 KubeSphere 和 Kuberne ...