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 { |