最详细Vuex教程(超详细)-基本使用

365体育网在线手机版 admin 2025-07-12 03:34:13

Vuex

组件之间传值

目标:熟悉组件之间传值的各种情况(关注非父子之间传值)

父组件向子组件传值 props子组件向父组件传值 $emit非父子组件之间传值 : 爷孙;兄弟

发布订阅模式(微博:大V----粉丝)

基于Vue实现发布订阅模式

// 相当于中介

const eventBus = new Vue()

// 订阅事件

eventBus.$on('event-b', (param) => {

console.log(param) // 123

})

// 发布事件

eventBus.$emit('event-b', 123)

通过兄弟组件之间的传值进行验证

总结:

少量的组件之间数据传递可以用这种模式但是不建议大量的组件通信采用这种机制(代码比较乱,后期维护比较麻烦)

状态管理必要性分析

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

如果使用了Vuex,就可以非常方便的进行复杂的组件之间数据传递(非父子关系)

总结:

所有组件的数据进行统一管理(存储和变更),每个组件内部就不再需要维护这些数据了数据变更时,统一修改Store中数据即可,组件中用到这个数据的组件会自动更新(数据是响应式的)

Vuex介绍

目标:熟悉Vuex是如何实现上述集中管理组件数据这种思想(模式)的

state 管理组件数据,管理的数据是响应式的,当数据改变时驱动视图更新。mutations 更新数据,state中的数据只能使用mutations去改变数据(只能处理同步的场景)actions 处理异步场景,处理成功后把数据提交给mutations,进而更新stateDevtools指的是浏览器的Vue插件调试工具,它可以监控到数据的所有变更操作。

getters相当于在State和组件之间添加一个环节(对state中的数据进行加工处理后再提供给组件)getters不要修改state中的数据

初始化项目

目标:基于脚手架初始化项目

第一步:npm i vuex --save/-S第二步: 创建store.js import vuex from 'vuex' import vue from 'vue'第三步:Vue.use(vuex)第四步:const store = new Vuex.Store({...配置项})第五步:导出 export default store第六步:导入main.js 在根实例配置 store 选项指向 store 实例对象

// 初始化一个vuex的实例(数据仓库) 导出即可

import Vuex from 'vuex'

import Vue from 'vue'

// 使用安装

Vue.use(Vuex)

// 初始化

const store = new Vuex.Store({

// 配置(state|mutations|actions)

})

export default store

import store from '@/store'

new Vue({

// 把store对象挂载到vue实例对象中,这样就可以在所有的组件中获取store中的数据了

store,

render: h => h(App),

}).$mount('#app')

总结:

初始化store对象把store对象挂载到Vue实例中

状态state

初始化状态

状态state用于存储所有组件的数据。

管理数据

// 初始化vuex对象

const store = new vuex.Store({

state: {

// 管理数据

count: 0

}

})

在组件获取state的数据:原始用法插值表达式

A组件 state的数据:{{$store.state.count}}

A组件 state的数据:{{count}}

使用计算属性:

// 把state中数据,定义在组件内的计算属性中

computed: {

// 1. 最完整的写法

// count: function () {

// return this.$store.state.count

// },

// 2. 缩写

count () {

return this.$store.state.count

}

}

// 不能使用剪头函数 this指向的不是vue实例

总结:

state中的数据是自定义的,但是state属性名是固定的获取数据可以通过 $store.state可以使用计算属性优化模板中获取数据的方式计算属性不可以使用箭头函数(箭头函数本身是没有this的,实际上用的是父级函数中的this)

mapState

目标:简化获取store数据的代码

把vuex中的state数据映射到组件的计算属性中。

import { mapState } from 'vuex'

使用:mapState(对象)

// 使用mapState来生成计算属性 mapState函数返回值是对象

// 使用mapState使用对象传参

// computed: mapState({

// // 1. 基础写法 (state) 代表就是vuex申明的state

// // count: function(state) {

// // return state.count

// // }

// // 2. 使用箭头函数

// // count: state => state.count

// // 3. vuex提供写法 (count是state中的字段名称)

// count: 'count',

// // 4. 当你的计算属性 需要依赖vuex中的数据 同时 依赖组件中data的数据

// count (state) {

// return state.count + this.num

// }

// })

使用:mapState(数组)

// 2、mapState参数是一个数组

// computed: mapState(['count', 'total'])

如果组件自己有计算属性,state的字段映射成计算属性

// 3、即在内部保留原有的计算属性,又要把store中的数据映射为计算属性

computed: {

// 组件自己的计算属性

calcNum () {

return this.num + 1

},

// 把mapState返回值那个对象进行展开操作(把对象的属性添加到该位置)

...mapState(['count'])

}

总结:

1、是否组件的所有数据都应该放到Store中?不一定(数据仅仅需要在本组件使用,那么没有必要放到Store),放到Store中的数据一般需要多个组件共享。

2、mapState

基本使用简化用法自定义和映射计算属性结合。

状态修改mutations

状态修改基本操作

目标:Vuex规定必须通过mutation修改数据,不可以直接通过store修改状态数据。

为什么要用mutation方式修改数据?Vuex的规定

为什么要有这样的规定?统一管理数据,便于监控数据变化

定义状态修改函数

// mutations是固定的,用于定义修改数据的动作(函数)

mutations: {

// 定义一个mutation,用于累加count值

// increment这个名字是自定义的

increment (state, payload) {

// state表示Store中所有数据

// payload表示组件中传递过来的数据

state.count = state.count + payload

},

decrement (state, payload) {

state.count = state.count - payload

}

}

组件中调用

methods: {

handleClick1 () {

// 通过触发mutation修改state中的count的值

this.$store.commit('increment', 2)

},

handleClick2 () {

this.$store.commit('decrement', 1)

}

},

总结:

先定义(mutations),再出发 this.$store.commit(‘mutation的名称,参数’)mutation的本质就是方法,方法名称自定义,mutation函数内部负责处理的变更操作。一种操作就是一个mutation,不同的mutation处理不同的场景。

mapMutations

把vuex中的mutations的函数映射到组件的methods中通俗:通过mapMutations函数可以生成methods中函数

methods: {

// 1、对象参数的写法

// ...mapMutations({

// // 冒号右侧的increment是mutation的名称

// // 冒号左侧的increment是事件函数的名称,可以自定义

// increment: 'increment'

// })

// 2、数组参数的写法(事件函数名称和mutation名称一致)

...mapMutations(['increment'])

// 3、这种写法和第2种等效

// increment (param) {

// // 点击触发该函数后要再次触发mutation的

// this.$store.commit('increment', param)

// }

}

总结:

mapMutations函数的作用:简化methods的定义原始方式:通过$store.commit方法触发mutation简写方式一:对象写法简写方式二:数组写法

异步操作action

异步获取数据

目标:主要用于处理异步的任务

安装axios的包

npm i axios

//导入包

import axios from 'axios'

定义获取数据方法

// actions是固定的,用于定义异步操作的动作(函数)

actions: {

// 定义了一个action,用于查询接口数据

async queryData (context, payload) {

console.log(payload)

// 调用接口获取数据

const ret = await axios.get('http://test.zjie.wang/tab')

// 必须触发mutation修改list的值

// context类似于this.$store

context.commit('updateList', ret.data.list)

}

},

mutations: {

updateList (state, payload) {

state.list = payload

}

}

组件使用:

methods: {

handleQuery () {

// 触发action(必须调用dispatch方法)

this.$store.dispatch('queryData', 111)

}

}

总结:

action的作用:处理异步任务,获取异步结果后,把数据交给mutation更新数据触发action需要使用 this.$store.dispatch

mapActions

mapActions辅助函数,把actions中的函数映射组件methods中通俗:通过mapActions函数可以生成methods中函数

// 相当于 methods申明了一个函数fn(num){ this.$store.dispatch('queryData', num)}

// ...mapActions({

// fn: 'queryData'

// })

// 相当于 methods申明了一个函数getData(num){ this.$store.dispatch('getData', num)}

...mapActions(['queryData'])

总结:

原始方式:this.$store.dispatch(‘queryData’, num)简化方式一:对象简化方式二:数组

getters用法

目标:熟悉getters的应用场景和具体使用步骤

先定义getters

// 相当于state的计算属性(基于State处理成另外一份数据)

// getters的主要应用场景:模板中需要的数据和State中的数据不完全一样

// 需要基于state中的数据进行加工处理,形成一份新的的数据,给模板使用

getters: {

getPartList (state) {

return state.list.filter(item => {

return item.id > 1

})

}

}

再使用getters

基本使用

caleList () {

// 注意:获取getters的值,不需要加括号(当属性使用)

return this.$store.getters.getPartList

},

简化用法

import { mapGetters } from 'vuex'

// mapGetters的作用:把getters映射为计算属性

computed: {

...mapGetters(['getPartList']),

// ...mapGetters({

// calcList: 'getPartList'

// }),

// calcList () {

// // 注意:获取getters的值,不需要加括号(当属性使用)

// return this.$store.getters.getPartList

// },

}

总结:

getters相当于在State和组件之间添加一个环节(对state中的数据进行加工处理后再提供给组件)getters不要修改state中的数据getters类似之前的计算属性(基于state中的数据进行计算)

总结

基于发布订阅模式处理非父子组件之间的数据传递

const eventBus = new Vue()订阅 eventBus.$on(‘事件名称’,事件处理函数)发布 eventBus.$emit(‘事件名称’, 传递的数据) vuex

vuex的核心思想:组件数据统一管理(统一存储,统一修改)vuex具体实现的核心概念

state 用来保存组件的数据

基本使用简化用法 mapState mutations 用来修改state中的数据(数据是响应式的)

基本使用简化用法 mapMutations actions 用来处理异步任务,获取异步的结果,但是不可以修改数据

基本使用简化用法 mapActions getters 用来处理state中的数据,方便给组件提供符合需求的数据格式

基本使用简化用法 mapGetters