VUEX基本介绍和使用

2023-01-04 0 644

Vuex是甚么

Vuex 是两个专为 Vue.js 应用领域软件开发的状况管理工作模式, 选用封闭式repeats工作应用领域的大部份组件的状况,化解多组件统计网络设备。

关键点:

vue非官方配搭,专用选用 (近似于:vue-router),有专门针对的增容辅助工具封闭式管理工作统计数据状况计划 (操作形式更简约)data() { return { 统计数据, 状况 }}统计数据变动是可预估的 (积极响应式)

vue非官方提供更多的分立于组件管理体系以外的,管理工作内存保护的辅助工具

使用情景

大型工程项目

展毛

vuex是vue非官方提供更多的分立于组件管理体系以外的,管理工作内存保护的辅助工具

Vuex-自学文本

最终目标

介绍vuex的自学文本

Vuex的自学文本

Vuex5个文本须要自学:

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

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

展毛

四个基本上概念:state, mutations, getters, actions, modules

Vuex-在Vue工程项目选用Vuex

最终目标

掌控在vue工程项目中选用vuex的形式

三种情形

情形1:在老工程项目中选用。 先附加安装vuex包,接着在实用性。情况2:在新工程项目中选用。 在实用性vue-cli中创建工程项目时,就可以直接选中vuex项,这样就不用做任何实用性了(脚手架会自动帮我们完成的)。具体如下图示:

这里只说明第1种情形。

在旧工程项目中选用vuex

假设之前已经有两个vue工程项目了,当中并没有选用vuex,现在我们来用一下。

注意,这里省略用vue脚手架创建工程项目的过程。

整体步骤:

安装。它是两个分立的包,须要先安装。实用性

创建Vuex.store实例向Vue实例注入store选用。在组件中选用store

发行版

进入工程项目目录,发行版

yarn add vuex

开发依赖:

yarn add vuex –save-devyarn add xxxx -D

生产依赖:

yarn add xxxx –saveyarn add xxxx -Syarn add xxxx

实例化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中:

导入store并注入Vue实例
// 省略其他 // 1. 导入store import store from ./store new Vue({ // 省略其他… store // 2. 注入Vue实例 })

在组件中选用store

据。

展毛

在老工程项目中选用vuex的步骤

安装。它是两个分立的包,须要先安装。实用性

创建Vuex.store实例(有固定代码,近似于vue-router;须要记忆)向Vue实例注入store选用。在组件中选用store。this.$store.state

附 :vue-router的选用形式

目录结构

|– router # 路由 |—— index.js |– main.js # 工程项目入口文件

关键代码

// router/index.js import Vue from vue import Router from vue-router Vue.use(Router) // 默认导出 export defalut export default new Router({ routes: [] })

Vuex-state表述内存保护并在组件中选用

最终目标

掌控state的选用形式

state的作用

vuex用它来保存内存保护

表述内存保护

格式

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

示例

new Vuex.store({ state: { userInfo: { name: tom, skills: [抖音, B站, 美团], 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.特性名}}

vue-devtool增容辅助工具

在增容辅助工具中查看。

state的作用是:保存内存保护(多组件中共用的统计数据)

state是积极响应式的: 如果修正了统计数据,相应的在视图上的值也会变动。

Vuex-用mutations修正内存保护

最终目标

掌控mutations的作用及格式; 能用它来修正state

作用

通过调用mutations来修正表述在state中的内存保护。

格式

分两个格式: 注册的格式,调用的格式

表述格式: 如下

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

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

第两个参数是必须的,表示当前的state。在选用时不须要传入第二个参数是可选的,表示载荷,是可选的。在选用时要传入的统计数据

选用格式

this.$store.commit(mutation名, 实参给第二个参数)

这里的commit是固定的方法

示例

在store/index.js中,补充:

统计数据项url更新统计数据项url的mutations
export default new Vuex.Store({ // state: 用来保存大部份的内存保护 state: { userInfo: { name: tom, skills: [抖音, B站, 美团], 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 } } }

在组件中,调用

const url = http://s02.mifile.cn/assets/static/image/logo-mi2.png this.$store.commit(changeUrl, url)

在devtool中观察

打开增容辅助工具,查看效果

展毛

mutations的中文含义是:变异。 它是Vuex中用来修正内存保护的唯一入口。

在表述时:

它的第两个参数是state,第二个参数是载荷

在调用时:

用 this.$store.commit(mutation名, 载荷) 来调用

Vuex-mutaions拓展理解

问:为啥是$store.commit(mutations的名字)而不是$store.mutations的名字()?

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

问:统计数据不可以该在组件内部直接修正吗?

答:不能。虽然语法上不报错,也有积极响应式的特点。但是不推荐。特别是在严格模式下会报错。若将vue创建 store 的时候传入 strict: true, 开启严格模式,那么任何修正state的操作,只要不经过 mutation的函数,vue就会报错

问:可以传递多个统计数据吗?

答:参数只能有两个:下面的写法是不对的:

this.$store.commit(setUrl, url, host)// host这个参数将无法被接收到

如果希望传递复杂的统计数据,第二个参数可以是对象,例如下面的写法

this.$store.commit(setUrl, { url, host} )

问:等价写法 this.$store.comit({type: mutations的名字})

小案例-发允诺取统计数据做保存

最终目标

综合选用axios, mutation, state

任务描述

我们希望在某组件创建成功之后:

允诺后端接口(https://www.fastmock.site/mock/37d3b9f13a48d528a9339fbed1b81bd5/book/api/books

思路

组件created钩子函数中:

代码

在app.vue(或者其他的组件)中,created钩子函数中的代码如下:

created() { axios({ url: https://www.fastmock.site/mock/37d3b9f13a48d528a9339fbed1b81bd5/book/api/books, method: GET }).then(res => { console.log(res) this.$store.commit(setBooks, res.data.data) }) }

在src/store/index.js中,补充对应的统计数据项 books和操作形式的方法。

state: { // 省略其他… books: [] // 用来保存书 }, mutations: { // 省略其他… // 用来设置统计数据 setBooks(state, books) { state.books = books } }

app.vue模板中 渲染统计数据

<div style=”flex: 1 1 auto; border:1px solid #ccc;”> 书目 <p v-for=”(book, idx) in $store.state.books” :key=”idx”> {{book.name}}, {{book.price}} </p> 总价为:XX元 </div>

Vuex-用getters的衍生状况

最终目标

介绍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的名字 来访问

在增容辅助工具中查看

展毛

它的作用是从已有内存保护项中衍生出捷伊统计数据项,近似于computed

Vuex-state-mutation-getters 展毛

vuex维护内存保护,主要有两个动作:

Vuex-actions-发触发器允诺

导入

组件内部发ajaxajax回来之后,去调用mutations来保存到vuex中

这种形式有两个问题:代码不好重用

actions如是说

action 内部可以发触发器允诺操作形式action是间接修正state的:是通过调用 mutation来修正state

格式

表述格式

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

调用格式

在组件中通过this.$store.dispatch(actions的名字, 参数)来调用action

示例

修正上面例子中的发允诺图书的代码,将axios的部分写到action中

actions: { getBooks (context) { // 1. 发触发器允诺 axios({ url: https://www.fastmock.site/mock/37d3b9f13a48d528a9339fbed1b81bd5/book/api/books, method: GET }).then(res => { console.log(res) // 2. 调用mutation context.commit(setBooks, res.data.data) }) } },

展毛

action一般用来发触发器允诺,统计数据回来之后,在去调用mutations来保存统计数据

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

代码获得了进一步封装。将发ajax和保存统计数据到vuex绑定在一起。逻辑更通顺。如果统计数据须要保

Vuex-用modules来分拆复杂业务

问题导入

随着工程项目越来越大,须要放在vuex中的统计数据越来越多,整个store/index.js中代码会越来越长,怎么办呢?

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

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

访问组件中的统计数据,要加上组件名

组件名.统计数据项名}}

如果namespaced为true,则须要附加去补充组件名如果namespaced为false,则不须要附加补充组件名

$store.commit(mutations名) // namespaced为false

$store.commit(组件名/mutations名) // namespaced为true

展毛

选用了modules之后,在访问统计数据时就要附加添加modules的名字了。

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

vuex-用modules之后代码结构优化

Vuex-辅助函数mapState来选用内存保护

最终目标

掌控mapState的用法,将state中的变量映射到当前的组件中选用;

问题

当访问某个统计数据项嵌套太深了,能不能优化一下访问的形式?

用mapState把内存保护(vuex.store) 映射 到本组件内部的排序特性中

mapState的选用步骤

映射

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

选用

this.xxx {{xxx}}

示例

// 步骤 // 1. 导入辅助函数mapState,它是在vuex中表述的两个辅助工具函数。 // es6 按需导入 import { mapState } from vueximport { 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]) } } </script>

展毛

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

Vuex-辅助函数mapState对统计数据重命名

最终目标

掌控mapState对统计数据重命名的用法。

情景

vuex中的统计数据与本组件内的统计数据名相同

格式

…mapState({新名字: xxx})

Vuex-map函数用法汇总

如何选用全局state

直接选用: this.$store.state.xxx; map辅助函数:

computed: {

…mapState([xxx]),

…mapState({新名字: xxx})

}

如何选用modules中的state

直接选用: this.$store.state.组件名.xxx; map辅助函数:

computed: {

…mapState(组件名, [xxx]),

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

}

如何选用全局getters

直接选用:this.$store.getters.xxxmap辅助函数:

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

如何选用modules中的getters

直接选用: this.$store.getters.组件名.xxxmap辅助函数:

computed: {

…mapGetters(组件名, [xxx]),

…mapGetters(组件名,{新名字: xxx})

}

如何选用全局mutations

直接选用:this.$store.commit(mutation名, 参数)map辅助函数:

methods: {

…mapMutations([mutation名]),

…mapMutations({新名字: mutation名})

}

如何选用modules中的mutations(namespaced:true)

直接选用: this.$store.commit(组件名/mutation名, 参数)map辅助函数:

methods: {

…mapMutations(组件名, [xxx]),

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

}

如何选用全局actions

直接选用:this.$store.dispatch(action名, 参数)map辅助函数:

methods: {

…mapActions([actions名]),

…mapActions({新名字: actions名})

}

如何选用modules中的actions(namespaced:true)

直接选用: this.$store.dispatch(组件名/action名, 参数)map辅助函数:

methods: {

…mapActions(组件名, [xxx]),

…mapActions(组件名,{新名字: xxx})

}

相关文章

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

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