Vue-Vuex 基本用法
Vuex 简介
Vuex 是一个 Vue 的状态管理工具,状态就是数据。
大白话:Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数据 个人信息数
使用场景:
- 某个状态 在 很多个组件 来使用 (个人信息)
 - 多个组件 共同维护 一份数据 (购物车)
 
优势:
- 共同维护一份数据,数据集中化管理
 - 响应式变化
 - 操作简洁( Vuex 提供了一些辅助函数)
 

创建 Vuex 空仓库
- 在终端使用指令 
yarn add vuex@3或者npm i vuex@3 
1  | yarn add vuex@3  | 
- 新建 
store/index.js文件放置 vuex 

- 创建仓库 
store/index.js 
1  | // 导入 vue  | 
- 在 main.js 中导入挂载到Vue实例上
 
1  | import Vue from 'vue'  | 
- 测试打印 store
 
1  | <script>  | 

State 状态
- 提供数据:
 
- State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。
 - 打开项目中的store.js文件,在state对象中可以添加我们要共享的数据。
 
1  | const store = new Vuex.Store({  | 
- 使用数据
 
- 使用 store 访问数据
 
1  | 获取 store:  | 
辅助函数 mapState
1  | <template>  | 
Vuex 的单向数据流
Vuex 同样遵循单向数据流,组件中不能直接修改仓库的数据
1  | methods:{  | 
因为浏览器默认不会检测到这个错误,所以很难察觉到错误
开启严格模式,strick: true可以将此类错误报告出来
1  | const store = new Vuex.Store({  | 
mutations 对象
mutations 是 vuex 的一个对象,用来修改 state 数据的,必须时同步操作
传递参数:this.$store.commit('xxx', 参数)
- 定义 mutations 对象,对象中存放修改 state 的方法
 
1  | const store = new Vuex.Store({  | 
- 组件中调用 mutations
 
1  | methods: {  | 
- 当有多个参数传递时
 
1  | this.$store.commit('addCount', {  | 
用 Vuex 实现 input 双向绑定
- 输入框渲染内容 
:value="" - 监听输入的数值 
@input="handleInput" - 编写函数调用 mutations
 
1  | <input :value="count" @input="handleInput" type="number">  | 
- 封装 mutations 处理函数
 
1  | changeCount (state, newCount) {  | 
辅助函数 mapMutations
用法和 mapState 很像
1  | import { mapState, mapMutations, mapActions } from 'vuex'  | 
调用方法:
1  | this.changeCount(n)  | 
actions 对象
mutations 只能处理同步操作
actions 用于处理异步操作
- 提供actions 方法
 
1  | actions: {  | 
- 在组件中调用
 
1  | setAsyncCount () {  | 
辅助函数 mapActions
mapActions 是位于 actions中的方法提取出来,映射到组件methods中
1  | import { mapState, mapMutations, mapActions } from 'vuex'  | 
getters
除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters
例如,state中定义了list,为1-10的数组,显示出大于5的数据
1  | state: {  | 
- 定义getters
 
1  | getters: {  | 
- 使用getters
 
1  | <div>{{ $store.getters.filterList }}</div>  | 
辅助函数 mapGetters
mapGetters 是位于getters中的方法提取出来,映射到组件computed中
1  | computed: {  | 
调用:
1  | <div>{{ filterList }}</div>  | 
modules 模块
- 模块定义,在 
store/modules/文件夹下,创建模块文件 
1  | const state = {  | 
- 注册模块,在 
store/index.js文件内导入注册这个模块 
1  | import user from './modules/user'  | 
获取数据
获取 state 数据:
可以直接使用模块名访问:$store.state.模块名.xxx
使用默认根级别的映射:mapState(['xxx'])
也可以使用子模块映射: mapState('模块名', ['xxx']) - 需要开启命名空间 namespaced:true
获取 getters 数据:
可以直接使用模块名访问:$store.getters['模块名/xxx']
使用默认根级别的映射:mapGetters(['xxx'])
也可以使用子模块映射: mapGetters('模块名', ['xxx']) - 需要开启命名空间 namespaced:true
获取 mutations 数据:
注意:默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块。
可以直接使用模块名访问:$store.commit('模块名/xxx', 额外参数)
使用默认根级别的映射:mapMutations(['xxx'])
也可以使用子模块映射: mapMutations('模块名', ['xxx']) - 需要开启命名空间 namespaced:true
获取 actions 数据:
注意:默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块。
可以直接使用模块名访问:$store.dispatch('模块名/xxx', 额外参数)
使用默认根级别的映射:mapActions(['xxx'])
也可以使用子模块映射: mapActions('模块名', ['xxx']) - 需要开启命名空间 namespaced:true
1  | export default {  | 
