vuex的基本规则

Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则:

应用层级的状态应该集中到单个 store 对象中。

提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。

异步逻辑都应该封装到 action 里面。

state [type: Object]

const store = new Vuex.Store({
    state: {
        count: 1
    }
    mutations: ...
})

modules

const moduleA = {
    state,
    mutations,
    actions, // 可无
    getters, // 可无
    modules  // 可无, 可嵌套
}

const moduleB = {
    state,
    mutations,
    actions,
    getters
    modules
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})
store.state.a; // -> moduleA 的状态
store.state.a; // -> moduleB 的状态

getter

const store = new Vuex.Store({
    state: { ... },
    getter: {
        exampleGetter(state, getters) {
            return 
        }
    }
})

const module = {
    state: ...
    getter: {
        exampleGetter(state, getters, rootState)
    }
}

mutations [type: string]: Function

// like Reducer
const store = new Vuex.Store({
  ...
  mutations: {
    increment (state, playload) {
      // 变更状态
      state.count++
    }
  }
})

 

mutation 必须是同步函数

devtools 不知道什么时候回调函数实际上被调用 —— 实质上任何在回调函数中进行的的状态的改变都是不可追踪的

actions

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象?

支持异步:

  1. promise
  2. async / await
function (context) {}

context = { state, rootState, getters, commit, dispatch}
### Vuex 使用教程及示例 Vuex 是专门为 Vue.js 开发的状态管理模式,用于管理复杂应用程序中的共享状态。它提供了一种集中式的存储机制来管理组件之间的全局状态,并通过一系列规则确保状态的变化具有可预测性[^3]。 #### 核心概念 Vuex 的核心由五个主要部分组成:`state`, `getters`, `mutations`, `actions`, 和 `modules`。以下是它们的作用: - **State**: 存储应用的数据,类似于组件内的 `data` 属性。它是 Vuex 中数据的唯一来源。 - **Getters**: 类似于计算属性,用来从 state 中派生出一些状态,或者执行逻辑操作后再返回结果。 - **Mutations**: 提交更改的方法,负责更新 store 中的状态。需要注意的是,mutation 必须是同步函数。 - **Actions**: 与 mutation 类似,但它可以包含异步操作。action 不会直接改变状态,而是提交 mutations 来完成这一任务。 - **Modules**: 当应用变得非常庞大时,可以通过模块化的方式来分割 store,使结构更加清晰和易于维护。 #### 辅助函数 为了简化在组件中访问 Vuex Store 的过程,Vuex 提供了一些辅助函数,比如 `mapState`, `mapGetters`, `mapActions`, 和 `mapMutations`。这些工具可以帮助开发者更方便地映射 store 到组件实例上[^2]。 #### 示例代码 下面是一个简单的待办事项 (Todo List) 示例,展示如何使用 Vuex 进行状态管理和基本的操作功能实现。 ```javascript // 定义 store 文件夹下的 index.js 或者 vuex-store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { todos: [ { id: 1, text: '学习 JavaScript', done: true }, { id: 2, text: '掌握 Vue.js', done: false } ] }, getters: { allTodos(state){ return state.todos; }, completedTodos(state){ return state.todos.filter(todo => todo.done); } }, mutations: { addTodo(state, payload){ const maxId = Math.max(...state.todos.map(t => t.id)); state.todos.push({ id: maxId + 1, ...payload }); }, removeTodo(state, id){ state.todos = state.todos.filter(todo => todo.id !== id); }, toggleComplete(state, id){ let idx = state.todos.findIndex(todo => todo.id === id); if(idx >=0 ){ state.todos[idx].done = !state.todos[idx].done; } } }, actions:{ asyncAddTodo(context, payload){ setTimeout(() => context.commit('addTodo', payload), 1000); // 模拟异步请求 } } }); ``` ```html <!-- 组件文件 --> <template> <div> <ul> <li v-for="(todo,index) in filteredTodos" :key="index"> <span @click="toggleCompletion(todo)" :class="{completed: todo.done}">{{ todo.text }}</span> <button @click="removeItem(todo)">X</button> </li> </ul> <input type="text" placeholder="输入新任务..." v-model="newTask"/> <button @click="addItem">添加</button> </div> </template> <script> export default{ computed:{ filteredTodos(){ return this.$store.getters.completedTodos; // 只显示已完成的任务作为例子 }, newTask:{ get(){ return '';}, set(val){this.newTaskValue=val;} } }, methods:{ ...mapMutations(['addTodo','removeTodo']), ...mapActions(['asyncAddTodo']), addItem(){ if(this.newTask.trim()){ let task={text:this.newTask}; this.asyncAddTodo(task); } }, removeItem(item){ this.removeTodo(item.id); }, toggleCompletion(item){ this.toggleComplete(item.id); } } } </script> <style scoped> .completed{ text-decoration: line-through;} </style> ``` 上述代码片段展示了如何创建一个 Vuex Store 并将其集成到 Vue 组件中,从而实现了增删改查的功能[^1]。 #### 应用场景 实际开发过程中,当多个视图依赖同一份数据、来自不同视图的行为需要变更同一份数据时,就可以考虑引入 Vuex 来统一管理这部分复杂的业务逻辑[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值