vuex概述
- vuex 是一个插件,可以帮助我们管理 vue 项目中的通用的数据(多组件共享的数据)
- 应用场景
- 某个状态在很多个组件中来使用(个人信息)
- 多个组件共同维护一份数据(购物车)
- 优势:
- 共同维护一份数据,数据集中化管理
- 响应式变化
- 操作简洁(vuex提供了一些辅助函数)
构建 vuex 多组件数据共享环境
- 基于脚手架创建项目,构建 vuex 多组件数据共享环境
vuex - 创建一个空仓库
- 安装 vuex 插件,初始化一个空仓库
- 步骤
- 安装 vuex
- 注意‘233、344’:
- 在 vue2 中,vuerouter 及 vuex 的适配版本均为 3.x
- 在 vue3 中,vuerouter 及 vuex 的适配版本均为 4.x
yarn add vuex@3
- 新建 vuex 模块文件
- 新建 store/index.js 专门存放 vuex
- 创建仓库
Vue.use(Vuex) // 新建仓库 new Vuex.Store()- main.js 导入挂载
- 在 main.js 中导入挂载到 Vue实例上
- 安装 vuex
vuex - state状态 (状态 == 数据)
- 明确如何给仓库提供数据、如何使用仓库的数据
- 提供数据:
- state 提供唯一的公共数据源,所有共享的数据都要统一放到 Store 中的 state 中储存。在state对象中可以添加我们要共享的数据
- 使用数据
- 通过 store 直接访问
$store.state.count
- 通过调用辅助函数(简化)
- 辅助函数 mapState ,帮助我们将 store 中的数据 自动 映射到组件的计算属性中
vuex - mutations
- 明确 vuex 同样遵循单项数据流,组件中不能直接修改仓库的数据
- 通过 strict: true 可以开启严格模式
- 掌握 mutations 的操作流程,修改 state 数据。(state数据的修改只能通过 mutations)
- 定义 mutations 对象,对象中存放着修改 state 的方法
- 每一个修改 state 的方法就可以看作一个小的 mutation
- 组件中提交调用 mutations
this.$store.commit('addCount')
mutations 传参
- 掌握 mutations 传参语法
this.$store.commit('xxx', 参数)
- 提供mutation函数(带参数 - 提交载荷 payload)
- 页面中调用 mutation
- 注意:
- mutation 只能传递和接收一个参数,如果需要多个参数,可以将其包装成一个对象。
- 在 store/index.js 中
mutations 传参练习
- 将输入框和 state 中的数据双向绑定,实现实时输入,实时更新。
- 实现步骤:
- 输入框内容渲染 (:value)
- 监听输入,获取内容 (@input)
- 封装 mutation 处理函数 (mutation 传参)
- 调用传参(commit)
辅助函数 - mapMutations
- 掌握辅助函数 mapMutations 映射方法
- mapMutations 和 mapState 很像,它是把 mutations 中的方法提取了出来,映射到组件methods中
vuex - actions
- 明确 actions 的基本语法,处理异步操作
- 说明:通过 mutation 操作的数据必须是同步的
- 注意:actions 中不能直接修改 state,想要修改 state 还是需要调用 mutation
- 需求:1s 后,修改 state 的 count 为666
- 步骤:
- 提供 action 方法
- 页面中 dispatch 调用
- 提供 action 方法
- 在 store/index.js 中添加 actions
- 在 Son1.vue 通过
this.$store.dispatch('changeCountAction', 666)调用 action 方法
辅助函数 - mapActions
- 掌握 mapActions 的语法,映射方法
- mapActions 是把位于 actions 中的方法提取出来,映射到 methods 中
vuex - getters
- 核心概念 getters 的基本语法(类似于计算属性)
- 除了 state 之外,有时我们还需要从 state 中派生出一些状态,这些状态是依赖于 state 的,此时就需要用到getters
- 场景:state 中定义了 list,为 1~10 的数组,需要在组件中展示所有大于 5 的数据
- 使用步骤
- 在 store/index.js 中定义 getters
- 在组件中访问 getters
- 通过 store 访问 getters
$store.geters.filterList - 通过辅助函数 mapGetters 映射
- 通过 store 访问 getters
- 具体使用:
- 在 getters 中的函数要注意:
- 形参是第一个参数,为 state
- 必须有返回值,即 getters 的值
- 在 store/index.js 中添加 getters
- 通过
$store.getters.filterList访问 - 通过 mapGetters 辅助函数映射
- 在 getters 中的函数要注意:
vuex - module
- module 模块的创建
- 由于 vuex 使用单一状态树,应用的所有状态会集中到一个比较大的对象。
- 当应用变得非常复杂时,store 对象就有可能变得相当臃肿。(vuex 会变的难以维护)
module - 子模块中 state 的访问
- 模块中 state 的访问
- 访问方式
- 直接通过模块名访问
$store.state.模块名.xxx - 通过 mapState 映射
- 根级别的映射:
mapState(['xxx']) - 子模块级别的映射
mapState('模块名', ['xxx'])- 需要开启命名空间
- 根级别的映射:
- 直接通过模块名访问
module - getters
- 模块中 getters 的访问语法
- 直接通过模块名访问
$store.gettersp['模块名/xxx']
- 通过 mapGetters 映射
- 根级别映射
mapGetters(['xxx']) - 子模块的映射
mapGetters('模块名', ['xxx'])- 同样需要开启命名空间
module - mutation
- 模块中 mutation 的调用语法
- 注意:
- 默认模块中的 mutation 和 actions 会被挂载到全局,需要开启命名空间,才会挂载到子模块
- 调用子模块中的 mutation:
- 直接通过 store 调用
$store.commit('模块名/xxx', 额外参数) - 通过 mapMutations 映射
- 根级别的映射
mapMutations(['xxx'])
- 子模块的映射
mapMutations('模块名', ['xxx'])
- 根级别的映射
- 直接通过 store 调用
mudule - actions
- 模块中 action 的调用语法(与 mutations 非常相似)
- 注意:
- 需要开启命名空间,actions 才会被挂载到子模块
- 调用子模块中的 action:
- 直接通过 store 调用:
$store.dispatch('模块名/xxx', 额外参数)
- 通过 mapActions 映射
- 根级别映射:
mapActions(['xxx']) - 子模块映射:
mapActions('模块名', ['xxx'])
综合案例 - 购物车
购物车 - 功能分析及创建项目
- 功能模块分析:
- 发送请求动态渲染购物车,vuex 存储数据
- 数字框控件,修改数据
- 动态计算,总价和总数量
- 脚手架新建项目(勾选 vuex )
- 将原本的 src 内容清空,替换为素材
购物车 - 构建模块及准备数据
- 构建模块
- 新建 store/modules/cart.js
- 挂载到 vuex 仓库上 store/index.js
- 准备数据
- 基于 json-server 工具,准备后端接口服务
- 步骤
- 安装全局工具 json-server (仅需安装一次)官网 'www.npmjs.com/package/jso…'
- 在代码根目录创建一个 db 目录
- 将准备好的json文件 Index.json 移入目录
- 进入 db 目录,启动后端接口服务 -
json-server --watch index.json-
- 访问接口测试:http://localhost:3000/cart
购物车 - 获取数据并存入 vuex,映射渲染
- 步骤
- 安装 axios
npm install axios
- 准备 actions 和 mutations
- 调用 action 获取数据
- 动态渲染(mapState 映射)
- 安装 axios
购物车 - 修改数量
- 修改数量功能
- 步骤:
- 添加点击事件
- 提供 action 函数和 mutation 函数
购物车 - 底部统计
- 步骤:
- 提供 getters
- 使用辅助函数 mapGetters 映射到组件中
- 提供 getters