Vuex使用教程:详细资料包解析与实践
41 浏览量
更新于2024-10-23
收藏 42.89MB RAR 举报
资源摘要信息:"Vuex使用详细资料包"
知识点一:Vuex简介
Vuex是专为Vue.js应用程序开发的状态管理模式和库。它作为一个集中式存储来管理所有组件的状态,并以相应的规则保证状态以可预测的方式发生变化。Vuex可以解决多个视图依赖于同一状态以及来自不同视图的行为需要变更同一状态的问题。在Vue应用中,当多个组件依赖于同一个状态或者来自不同组件的行为需要变更同一状态时,就需要用到Vuex。
知识点二:核心概念
1. State:Vuex使用单一状态树,用一个对象包含全部应用层级的状态。每个Vuex应用都仅仅包含一个store实例。它作为唯一数据源存在,使得组件之间的状态共享变得非常方便。
2. Getters:类似于计算属性,根据依赖进行缓存,只有依赖项发生改变才会重新求值。可以认为是store中的计算属性。
3. Mutations:更改Vuex的store中的状态的唯一方法是提交mutation。Vuex中的mutation非常类似于事件:每个mutation都有一个字符串的事件类型(type)和一个回调函数(handler)。
4. Actions:Action 类似于 mutation,不同在于:
a. Action 提交的是 mutation,而不是直接变更状态。
b. Action 可以包含任意异步操作。
5. Modules:由于使用单一状态树,应用的所有状态会集中到一个很大的对象。当应用变得非常复杂时,store 对象就有可能变得臃肿不堪。为了解决这个问题,Vuex 允许我们将store分割成模块(module)。每个模块拥有自己的state、mutation、action、getter甚至是嵌套子模块。
知识点三:安装与配置
安装Vuex,可以通过npm或yarn进行安装。
```
npm install vuex --save
// 或者
yarn add vuex
```
在Vue应用中引入并使用Vuex,通常是在src目录下创建一个store文件夹,并在其中创建index.js文件,用于存放store实例的配置代码。
```javascript
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
}
})
export default store
```
在main.js中引入并使用store。
```javascript
import Vue from 'vue'
import App from './App.vue'
import store from './store'
new Vue({
store,
render: h => h(App)
}).$mount('#app')
```
知识点四:State的使用
在组件中使用state,可以在计算属性中返回需要的状态。或者使用mapState辅助函数简化代码。
```javascript
import { mapState } from 'vuex'
export default {
computed: {
// 映射this.count为store.state.count
...mapState([
'count'
]),
// 为了使用局部state的count
count() {
return this.$store.state.count
}
}
}
```
知识点五:Getter的使用
Getter可以对store中的数据进行处理,返回需要的值。在组件中可以使用计算属性或者mapGetters辅助函数来使用。
```javascript
import { mapGetters } from 'vuex'
export default {
computed: {
// 映射this.doneTodosCount为this.$store.getters.doneTodosCount
...mapGetters([
'doneTodosCount',
'anotherGetter',
// ...
]),
// 通过对象展开运算符将 getter 混入 computed 对象中
...mapGetters({
doneCount: 'doneTodosCount'
})
}
}
```
知识点六:Mutation的使用
更改Vuex的store中的状态的唯一方法是提交mutation。可以使用mapMutations辅助函数将组件中的methods映射为***mit调用。
```javascript
import { mapMutations } from 'vuex'
export default {
methods: {
...mapMutations([
'increment', // 映射this.increment()为this.$***mit('increment')
// ...
]),
...mapMutations({
add: 'increment' // 映射this.add()为this.$***mit('increment')
})
}
}
```
知识点七:Action的使用
Action处理异步操作。可以使用mapActions辅助函数将组件的方法映射为store.dispatch调用。
```javascript
import { mapActions } from 'vuex'
export default {
methods: {
...mapActions([
'incrementAsync', // 映射this.incrementAsync()为this.$store.dispatch('incrementAsync')
// ...
]),
...mapActions({
add: 'incrementAsync' // 映射this.add()为this.$store.dispatch('incrementAsync')
})
}
}
```
知识点八:Module的使用
为了更好地组织代码,可以将store分割成不同的模块。每个模块拥有自己的state、mutation、action、getter以及嵌套子模块。
```javascript
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态
```
知识点九:异步操作
Vuex通过action处理异步操作,但不直接支持异步修改state,这是必须通过提交mutation来完成的。在action中可以进行异步操作,完成后提交相应的mutation。
```javascript
actions: {
checkout ({ commit, state }, products) {
// 把当前购物车的项目备份起来
const savedCartItems = [...state.cart.added]
// 发出结账请求,然后乐观地清空购物车
commit(types.CHECKOUT_REQUEST)
// 购物API接受一个成功回调和一个失败回调
shop.buyProducts(
products,
// 成功操作
() => commit(types.CHECKOUT_SUCCESS),
// 失败操作
() => commit(types.CHECKOUT_FAILURE, savedCartItems)
)
}
}
```
知识点十:严格模式
在开发环境中开启严格模式可以实时跟踪mutation的非法操作。在生产环境中应关闭严格模式,以避免性能损失。
```javascript
const store = new Vuex.Store({
// ...
strict: process.env.NODE_ENV !== 'production'
})
```
知识点十一:测试
测试Vuex代码时,可以模拟整个store,也可以只模拟store的某一部分。对于异步操作,可以使用mock store来模拟。
```javascript
import { createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
const localVue = createLocalVue()
localVue.use(Vuex)
describe('store', () => {
let store
beforeEach(() => {
store = new Vuex.Store({
state: { count: 10 },
mutations,
actions,
getters
})
})
// 测试state
it('increments the count', () => {
***mit('increment')
expect(store.state.count).toBe(11)
})
// 测试actions
it('increments the count by two', () => {
store.dispatch('incrementBy', 2)
expect(store.state.count).toBe(12)
})
// 测试getters
it('double the count', () => {
expect(getters.doubleCount(store.state)).toBe(20)
})
})
```
以上知识点概述了Vuex的核心概念、安装配置、各个部分的使用方法以及测试策略,这些都是使用Vuex进行状态管理时应该掌握的重要知识点。
103 浏览量
168 浏览量
184 浏览量
276 浏览量
118 浏览量
2022-09-17 上传
212 浏览量
2021-04-30 上传
140 浏览量
懂你技术
- 粉丝: 673
- 资源: 32
最新资源
- expenseTracker:个人的Ionic-AngularFire费用追踪器移动应用
- Cyb3rVector:Cyb3rVector的CodeLab项目-AnkiDDL Vector机器人的块状环境
- 毕业设计&课设-Matlab中的仿真.zip
- STM32F103通过ESP8266WIFI模块使用TCP协议连接至移动ONENET平台
- 城市交通信息中心网页模板
- Surf-crx插件
- zycode667.github.io:我的博客
- myDaily
- 毕业设计&课设-…已评估域。利用MATLAB对通信链路进行了仿真,并分析了估计值与实际值之间的误差….zip
- web-grunt-s3:在网络应用部署期间将文件上传到S3
- 绿色数码摄影网页模板
- crypto-lib:用于 node.js 和浏览器的高级加密模块
- 很棒的制造商-br:Makers Brasil
- cv
- DonationPopup:OPC上的捐赠请求弹出窗口
- Ethos Project | DwarfPool-crx插件