※前提条件:vue3 的uniapp开发
每一个 Vuex 应用的核心就是 store(仓库),它包含着你的应用中大部分的状态 (state)。
状态管理有5个核心:state、getter、mutation、action、module。
单一状态树,定义应用状态的默认初始值,页面显示所需的数据从该对象中进行读取。
由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态: 注意:以下的代码,实际并不会使用,这里只作为讲解介绍使用
// 创建一个 Counter 组件 const Counter = { computed: { count () { return store.state.count } } }
每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。
然而,这种模式导致组件依赖全局状态单例。在模块化的构建系统中,在每个需要使用 state 的组件中需要频繁地导入,并且在测试组件时需要模拟状态。
Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中(需调用 Vue.use(Vuex)):
通过属性访问,需要在根节点注入 store
import store from '@/store/index.js';//需要引入store export default { data() { return {} }, computed: { username() { return store.state.username } } }
export default { data() { return {} }, computed: { username() { return this.$store.state.username } } }
vuex | 全局变量 |
不能直接改变store里面的变量,由统一的方法修改数据 | 可以任意修改 |
每个组件可以根据自己vuex的变量名引用不受影响 | 全局变量可能操作命名污染 |
解决了多组件之间通信的问题 | 跨页面数据共享 |
适用于多模块、业务关系复杂的中大型项目 | 适用于demo或者小型项目 |
只要你遵守以上规则,如何组织代码随你便。如果你的 store 文件太大,只需将 action 、mutation 和 getter 分割到单独的文件。
对于大型应用,我们会希望把 Vuex 相关代码分割到模块中。下面是项目结构示例:
├── pages ├── static └── store ├── index.js # 我们组装模块并导出 store 的地方 ├── actions.js # 根级别的 action ├── mutations.js # 根级别的 mutation └── modules # 模块文件夹 ├── cart.js # 购物车模块 └── products.js # 产品模块 ├── App.vue ├── main.js ├── manifest.json ├── pages.json └── uni.scss
Comment: