vuex介绍

一. vuex介绍

1.通信方案

组件关系数据通信
父子关系父传子:props ; 子传父:$emit
非父子关系vuex (一种组件通信方案)

2.vuex是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式

它采用集中式存储管理数据,以相应的规则保证状态以一种可预测的方式发生变化

3.为什么学vuex?

程序页面多, 数据变量多

1)不同组件数据保持同步
2)数据的修改都是可追踪

4.vuex中存什么?

多个组件共享状态,才存储在vuex中

某个组件中的私有数据,依旧存储在data中

二、vuex学习内容

配置项(固定)

配置项含义注意
state单一状态树类似data
mutations数据管家(同步)唯一修改state地方
actions异步请求要改state需要提交给mutations
gettersvuex计算属性类似computed
modules模块拆分分模块管理数据

三、vuex-store准备

1.工程中 - 下载vuex

-D: 开发依赖(开发阶段需要使用,上线不需要使用的模块)- package.json -> devDependencies
-S: 生产依赖(开发阶段需要使用,上线还需要使用的模块)-> package.json -> dependencies
-g: 全局安装,比如:@vue/cli
yarn add vuex -S

2.store/index.js - 创建定义导出store对象

// 目标: 创建store仓库对象
// 1. 下载vuex: 终端命令(yarn add vuex)
// 2. 引入vuex
import Vue from 'vue'
import Vuex from 'vuex'
// 3. 注册
Vue.use(Vuex)
// 4. 实例化store对象
const store = new Vuex.Store({})
// 5. 导出store对象
export default store

3.main.js - 导入注入到Vue中

import Vue from 'vue'
import App from './App.vue'
import store from '@/store' // 导入store对象

Vue.config.productionTip = false

new Vue({
  // 6. 注入到Vue实例中(确保组件this.$store使用)
  store,
  render: h => h(App),
}).$mount('#app')

四、vuex-state数据源

1.定义state

在store/index.js定义state

const store = new Vuex.Store({
    state: {
        变量名: 初始值
    }
})	

2.使用state2种方式

  • 方式1: 组件内 - 直接使用
this.$store.state.变量名
  • 方式2: 组件内 - 映射使用 (推荐)
// 1. 拿到mapState辅助函数
import { mapState } from 'vuex'
export default {
  computed: {
    // 2. 把state里变量映射到计算属性中
    ...mapState(['state里的变量名'])
  }
}

五、vuex-开启严格模式

1.为何开启严格模式?

让数据的变化可追踪、可预测(规范程序员的代码行为),修改state必须通过mutations进行

2.如何开启严格模式?

const store = new Vuex.Store({
  // 开始严格模式
  strict: true,
  state: {
    num: 100
  }
})

六、vuex-mutations定义-同步修改

1.定义mutations

const store  = new Vuex.Store({
	mutations: {
		函数名 (state, 可选值) {
			// 同步修改state值代码
		}
	}
})

2.注意

1)mutations是唯一能修改state的地方, 确保调试工具可以追踪变化
2)mutations函数内, 只能写同步代码, 调试工具可追踪变化过程

  • 因为调试工具要立刻产生一次记录, 所以必须是同步的

七、vuex-mutations使用

1.使用mutations的2种方式

  • 方式1: 组件内 - 直接使用
this.$store.commit("mutations里的函数名", 具体值)
  • 方式2: 组件内 - 映射使用
// 1. 拿到mapMutations辅助函数
import { mapMutations } from 'vuex'
export default {
  methods: {
    // 2. 把mutations里方法映射到原地
    ...mapMutations(['mutations里的函数名'])
  }
}

2.注意

mutations函数上, 只能接收一个参数值, 如果传对个, 请传一个对象

八、vuex-actions定义-异步修改

1.定义actions

const store = new Vuex.Store({
	actions: {
		函数名 (store, 可选值) {
			// 异步代码, 把结果commit给mutations给state赋值
		}
	}
})

2.小结:

1)actions和mutations区别?

  • mutations里同步修改state
  • actions里异步操作

2)actions和mutations里函数, 第一个形参分别是什么?

  • mutations的是state
  • actions的是store

九、vuex-actions使用

使用actions的2种方式

  • 方式1: 组件内 - 直接使用
this.$store.dispatch('actions函数名', 具体值)
  • 方式2: 组件内 - 映射使用
// 1. 拿到mapActions辅助函数
import { mapActions } from 'vuex'
export default {
  methods: {
    // 2. 把actions里方法映射到原地
    ...mapActions(['actions里的函数名'])
  }
}

十、vuex-getters定义-计算属性

1.getters概念

vuex身上的全局状态-计算属性, 类似于computed

getters 依赖于 state中原始数据的变化,并返回计算后的新数据

getters就是vuex的计算属性,根据state中数据变量计算得到

2.定义getters

const store = new Vuex.Store({
	getters: {
		计算属性名 (state) {
			return 值给计算属性
		}
	}
})

十一、vuex-getters使用

getters的2种方式

  • 方式1: 组件内 - 直接使用
this.$store.getters.计算属性名
  • 方式2: 组件内 - 映射使用
// 1. 拿到mapGetters辅助函数
import { mapGetters } from 'vuex'
export default {
  computed: {
    // 2. 把getters里属性映射到原地
    ...mapGetters(['getters里的计算属性名'])
  }   
}

十二、vuex-modules定义-分模块

1.为什么分模块?

​ 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿

​ 为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)每个模块拥有自己的 state、mutation、action、getter、

甚至是嵌套子模块 —— 从上至下进行同样方式的分割

2.定义modules

modules: {
  模块名: 模块对象
}

十三、分模块-命名空间

1.开启命名空间

在子模块对象内设置namespaced: true

const userModule = {
  namespaced: true,
  state () {},
  mutations: {},
  actions: {},
  getters: {},
  modules: {}
}

2.state使用方式修改

  • 直接使用有变化: this.$store.state.模块名.变量名
  • 辅助函数需要遵守格式
...mapState("模块名", ['state变量名'])

3.mutations使用方式修改

  • 方式1: 组件内 - 直接使用
  • 原语法:
this.$store.commit("mutations里的函数名", 具体值)
  • 开命名空间后语法:
this.$store.commit("模块名/mutations里的函数名", 具体值)
  • 方式2: 组件内 - 映射使用
  • 原语法:
...mapMutations(['mutations里方法名'])
  • 开命名空间后语法:
...mapMutations("模块名", ['mutations里方法名'])

4.actions使用方式修改

  • 方式1: 组件内 - 直接使用
  • 原语法:
this.$store.dispatch("actions里的函数名", 具体值)
 - 开命名空间后语法:
```javascript
this.$store.dispatch("模块名/actions里的函数名", 具体值)
  • 方式2: 组件内 - 映射使用
  • 原语法:
...mapActions(['actions里方法名'])
  • 开命名空间后语法:
...mapActions("模块名", ['actions里方法名'])

5.getters使用方式修改

  • 方式1: 组件内 - 直接使用
  • 原语法:
this.$store.getters.计算属性名
 - 开命名空间后语法:
```javascript
this.$store.getters['模块名/计算属性名']
  • 方式2: 组件内 - 映射使用
  • 原语法:
...mapGetters(['getters里计算属性名'])
  • 开命名空间后语法:
...mapGetters("模块名", ['getters里计算属性名'])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vuex辅助函数是一组为了简化在Vue组件中访问和使用store中的state、getter、mutation和action的工具函数。使用辅助函数可以减少代码量并提高代码的可读性。其中常用的辅助函数包括mapState、mapGetters、mapMutations和mapActions。 mapState函数可以帮助我们将store中的state映射到组件的计算属性中,使得我们可以直接在组件中访问state的值而不需要通过this.$store.state.xx来获取。这样可以简化代码,并且使得组件与store的关系更加清晰。 mapGetters函数可以帮助我们将store中的getter映射到组件的计算属性中。getter可以理解为store中的派生状态,通过对state的计算而得到的值。使用mapGetters可以让我们在组件中直接访问这些派生状态的值,而不需要通过this.$store.getters.xx来获取。 mapMutations函数可以帮助我们将store中的mutation映射到组件的方法中。mutation是修改store中state的唯一途径,通过提交mutation可以保证所有对state的修改都是同步的。使用mapMutations可以让我们在组件中直接调用mutation的方法,而不需要通过this.$store.commit('mutation名')来提交mutation。 mapActions函数可以帮助我们将store中的action映射到组件的方法中。action可以包含任意异步操作,并通过提交mutation来修改state。使用mapActions可以让我们在组件中直接调用action的方法,而不需要通过this.$store.dispatch('action名')来派发action。 总的来说,vuex辅助函数的作用是简化在Vue组件中访问和使用store中的状态、派生状态、修改状态和派发异步操作的代码,提高代码的可读性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue全家桶学习—Vuex的4个辅助函数](https://blog.csdn.net/ZHANGYANG_1109/article/details/122050052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题](https://download.csdn.net/download/weixin_38680671/13607816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vuex及其辅助函数](https://blog.csdn.net/qq_45718618/article/details/130002839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值