Vuex 基本介绍

2022-12-24 0 590

简述组件亲密关系和通讯计划

Vuex 基本介绍
序列号组件亲密关系统计数据通讯1父女亲密关系子传父:props ; 父陈谟:$emit2非父女亲密关系eventBus: $on + $emit3非父女亲密关系vuex

和兄妹二人通讯和兄妹通讯类似于,vuex也是一类组件通讯化解计划

Vuex是甚么

Vuex 是两个专为 Vue.js 应用领域软件开发的状况区域化, 选用封闭式repeats应用领域的大部份组件的状况,化解多组件统计数据通讯。

vue非官方配搭,专用选用 (近似于:vue-router),有专门针对的增容辅助工具封闭式管理工作统计数据状况计划 (操作方式更简约)data() { return { 统计数据, 状况 }}统计数据变动是可预估的 (积极响应式)vue非官方提供更多的分立于组件管理体系以外的,管理工作公共统计数据的辅助工具大型工程项目中选用
Vuex 基本介绍

Vuex的自学文本

state: 标准化表述公共统计数据(近似于data(){return {a:1, b:2,xxxxxx}})mutations : 选用它来修正统计数据(类似于于methods)更动state中的统计数据要选用mutations来展开更动getters: 近似于computed(排序特性,对原有的状况展开排序获得捷伊统计数据——-衍生 )actions: 发动触发器允诺modules: 组件分拆

当中最关键的文本是 state 和 mutations

Vuex 基本介绍

Vuex-在Vue工程项目选用Vuex

情形1:在老工程项目中选用。 先附加加装vuex包,接着在实用性。情形2:在新工程项目中选用。 在实用性vue-cli中建立工程项目时,就能间接选上vuex项,这种就不必做任何人实用性了(钢架会手动帮他们顺利完成的)。具体内容如下表所示库尔:
Vuex 基本介绍

在旧工程项目中

加装。它是两个分立的包,须要先加装。实用性 store/index.js建立Vuex.Store示例向Vue示例转化成store选用。在组件中选用store

示例化store

与router一样,当他们在工程项目中选用vuex之后,为了方便代码维护,他们一般须要做特殊的目录调整,约定的结构如下表所示:

|–src |—– main.js |—– store |———– index.js

在store/index.js 中放置具体内容的代码,具体内容如下表所示:

import Vue from vue import Vuex from vuex Vue.use(Vuex) const store = new Vuex.Store({ state: { count: 0 } }) export default store

向Vue示例转化成store

在src/main.js中:

// 省略其他 // 1. 导入store import store from ./store new Vue({ // 省略其他… store // 2. 转化成Vue示例 })

在组件中选用store

Vuex-state表述公共统计数据并在组件中选用

state的作用

vuex用它来保存公共统计数据

表述公共统计数据

格式

new Vuex.store({ state: { 特性名: 特性值 } })

示例

new Vuex.store({ state: { userInfo: { name: tom, skills: [A站, B站, p站], address: 武汉热干面, logo: https://vuejs.org/images/logo.svg // https://www.runoob.com/wp-content/uploads/2016/02/react.png } } })

选用公共统计数据

格式:

在组件中,通过this.$store.state.特性名来访问。

在模板中,则能省略this而间接写成: {{$store.state.特性名}}

Vuex 基本介绍

Vuex-辅助函数mapState来选用公共统计数据

mapState的选用步骤

// 1. 导入辅助函数mapState,它是在vuex中表述的两个辅助工具函数。 // es6 按需导入 import { mapState } from vuex import { mapState } from vuex computed: { // 说明1: …对象 是把对象展开,合并到computed // 说明2: mapState是两个函数 // [统计数据项1, 统计数据项2] …mapState([xxx]), …mapState({新名字: xxx}) } js中选用:this.xxx 模板上选用:{{xxx}}

示例

// 步骤 // 1. 导入辅助函数mapState,它是在vuex中表述的两个辅助工具函数。 // es6 按需导入 import { mapState } from vuex import { mapState } from vuex // 2. 在computed中选用 …mapState([books]) // const res = mapState([books]) // res的结果是两个对象: { books: function() {}} // console.log(mapState, res) export default { computed: { c1 () { return c1 }, // books: function() {} // ..res: 把res这个对象合并到computed对象中 // …res …mapState([books]), …mapState({newBooks: books}) } } </script>

mapState是辅助函数,将vuex中的统计数据投射到组件内部;computed:{ …mapState() } 这里的…是对象的展开运算符,整体来看是对象的合并。mapState中的格式能是两个数组也能是两个对象,对象能更动名字

…mapState([xxx]), …mapState({新名字: xxx}) }

Vuex-用mutations修正公共统计数据

通过调用mutations来修正表述在state中的公共统计数据。

Vuex 基本介绍

分两个格式: 表述的格式,调用的格式 类似于methods

表述格式: 如下表所示

new Vue.store({ state:{}, // 省略其他… mutations:{ // 每一项都是两个函数,能声明两个形参 mutation名1:function(state [, 载荷]) { }, mutation名2:function(state [, 载荷]) { }, } })

每一项都是两个函数,能声明两个形参:

第两个参数是要的,表示当前的state。在选用时不须要传入第二个参数是可选的,表示载荷,是可选的。在选用时要传入的统计数据
this.$store.commit(mutation名, 实参,给第二个参数)
统计数据项url更新统计数据项url的mutations
export default new Vuex.Store({ // state: 用来保存大部份的公共统计数据 state: { userInfo: { name: tom, skills: [A站, B站, p站], address: 武汉热干面, logo: https://vuejs.org/images/logo.svg // https://www.runoob.com/wp-content/uploads/2016/02/react.png } }, // mutations: 用它提供更多修正统计数据的方法 // 中文是:变动,异动。 // 统计数据不应该在组件内部间接修正,要在组件内调用mutations来修正 mutations: { setLogo(state, newUrl) { state.userInfo.logo = newUrl } } }

在组件中,调用

this.$store.commit(changeUrl, https://www.runoob.com/wp-content/uploads/2016/02/react.png)

Vuex-选用辅助函数mapMutations修正state中的统计数据

组件中选用:

间接选用:this.$store.commit(mutation名, 参数)map辅助函数:
import {mapMutations} from vuex methods: { …mapMutations([mutation名]), …mapMutations({新名字: mutation名}) } 选用:this.mutation名 PS: methods: { …mapMutations([setLogo]), changeImg(){ this.setLogo(https://www.runoob.com/wp-content/uploads/2016/02/react.png) } }

Vuex-mutaions拓展理解

Vuex 中的 mutation 非常近似于事件:每个 mutation 都有两个字符串的 事件类型 (type) 和 两个 回调函数 (handler)。这个回调函数就是他们实际展开状况更动的地方,并且它会接受 state 作为第两个参数。

统计数据能在组件内部间接修正吗?

不能。虽然语法上不报错,也有积极响应式的特点。但是不推荐。特别是在严格模式下会报错。

Vuex-用getters的衍生状况

在state中的统计数据的基础上,进一步对统计数据展开加工获得新统计数据。(与组件中computed一样)

例如:排序总价

new Vuex.store({ state: { books: [ { “name”: “javasript技术内幕”, “price”: 100, “img”: “https://img3m7.ddimg.cn/64/26/29120617-1_u_8.jpg” }, { “name”: “数学之美”, “price”: 44, “img”: “https://img3m2.ddimg.cn/18/30/28538352-1_b_5.jpg” }, { “name”: “认知天性”, “price”: 40, “img”: “https://img3m3.ddimg.cn/74/33/1732997153-3_u_3.jpg” } ] } })

表述格式

new Vuex.store({ // 省略其他… getters: { // state 就是上边表述的公共统计数据state getter的名字1: function(state) { return 要返回的值 } } })

state 就是上边表述的公共统计数据state

选用格式

在组件中通过:$store.getters.getter的名字 来访问

vuex选用辅助函数mapGetters

间接选用:this.$store.getters.xxxmap辅助函数:
computed: { …mapGetters([xxx]), …mapGetters({新名字: xxx}) } PS: store/index.js { state:{}, getters:{ total(){ return 120 } } } import {mapGetters} from vuex computed: { …mapGetters([total]) } <div>{{total}}</div>
Vuex 基本介绍

Vuex用actions发触发器允诺

他们能选用Action来修正state,这一点是近似于 mutation的,不同在于:

action中能通过调用 mutation来修正state,而不是间接变更状况。action 能包含任意触发器(例如ajax允诺)操作方式。

表述格式

new Vuex.store({ // 省略其他… actions: { // context对象会手动传入,它与store示例具有相同的方法和特性 action的名字: function(context, 载荷) { // 1. 发触发器允诺, 允诺统计数据 // 2. commit调用mutation来修正/保存统计数据 // context.commit(mutation名, 载荷) } } })
Vuex 基本介绍

将ajax允诺放在actions中有两个好处:

代码获得了进一步封装。将发ajax和

vuex 选用辅助函数mapActions

如何选用全局actions

间接选用:this.$store.dispatch(action名, 参数)map辅助函数:
methods: { …mapActions([actions名]), …mapActions({新名字: actions名}) } PS: import {mapActions} from vuex methods: { …mapActions([getBooks]), }, created(){ this.getBooks() }

Vuex-用modules来分拆复杂业务

格式

export default new Vuex.Store({ // state: 用来保存大部份的公共统计数据 state: {}, getters: {}, mutations: {}, actions: {}, modules: { 组件名1: { // namespaced为true,则在选用mutations时,就要要加上组件名 namespaced: true, state: {}, getters: {}, mutations: {}, actions: {}, modules: {} }, 组件名2: { // namespaced不写,默认为false,则在选用mutations时,不须要加组件名 state: {}, getters: {}, mutations: {}, actions: {}, modules: {} } } })

也能更进一步对文件展开分拆。

|–store / |——- index.js # 引入组件 |——- modules |————– / mod1.js # 组件1 |————– / mod2.js # 组件2

访问统计数据和修正统计数据的调整

{{$store.state.组件名.统计数据项名}} computed: { …mapState(组件名, [xxx]) }====…mapGetters([xxx]) }====={{xxx}}

访问组件中的mutations/actions:

如果namespaced为true,则须要附加去补充组件名如果namespaced为false,则不须要附加补充组件名
$store.commit(mutations名) // namespaced为false $store.commit(组件名/mutations名) // namespaced为true methods: { …mapMutations(组件名, [xxx])===={{xxx}} } $store.dispatch(mutations名) // namespaced为false $store.dispatch(组件名/mutations名) // namespaced为true methods: { …mapActions(组件名, [xxx])===={{xxx}} }

在选用modules时,建议都给加上namespaced!

总结:

选用辅助函数来操作方式全局和组件

mapState

全局state

间接选用: this.$store.state.xxx;
computed: { …mapState([xxx]), …mapState({新名字: xxx}) }

选用modules中的state

间接选用: this.$store.state.组件名.xxx;

map辅助函数:

computed: { …mapState(组件名, [xxx]), …mapState(组件名, {新名字: xxx}) }

mapMutations

全局mutations

间接选用:this.$store.commit(mutation名, 参数)
methods: { …mapMutations([mutation名]), …mapMutations({新名字: mutation名}) }

modules中的mutations(namespaced:true)

间接选用: this.$store.commit(组件名/mutation名, 参数)

map辅助函数:

methods: { …mapMutations(组件名, [xxx]), …mapMutations(组件名,{新名字: xxx}) }

mapGetters

全局getters

间接选用:this.$store.getters.xxx

computed: { …mapGetters([xxx]), …mapGetters({新名字: xxx}) }

modules中的getters

间接选用: this.$store.getters[组件名/xxx]map辅助函数:
computed: { …mapGetters(组件名, [xxx]), …mapGetters(组件名,{新名字: xxx}) }

mapActions

全局actions

间接选用:this.$store.dispatch(action名, 参数)
methods: { …mapActions([actions名]), …mapActions({新名字: actions名}) }

modules中的actions(namespaced:true)

间接选用: this.$store.dispatch(组件名/action名, 参数)map辅助函数:
methods: { …mapActions(组件名, [xxx]), …mapActions(组件名,{新名字: xxx}) }

Vuex-map函数用法汇总

Vuex 基本介绍

actions和mutations和state的亲密关系图

Vuex 基本介绍

核心API小结

Vuex 基本介绍

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务