Vuex基本用法

Vuex状态管理实战

 一、Vuex基本写法

store文件夹下,新建index.js

import Vue from 'vue'
import Vues from 'vuex'

Vue.use(Vuex)

const modulesFiles = require.context('./modules', true, /\.js$/)

const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})

const store = new Vuex.store({
    modules
})

export default store

main.js中引入store/index.js

import store from './store/index'


new Vue({
  router,
  store,
  render: (h) => h(App)
}).$mount('#app')

新建modules 文件夹,新建 home.js


const state = {
  menuList:[],
  selectedMenu: 1, 
  
}

const getters = {
  totalSum: (state) => {
    return state.selectedMenu + 1
  }
}

const mutations = {
  updateMenuList: (state, data) => {
    state.menuList= data
  },
 
}
const actions = {
  // -- 获取 菜单 list
  async getMenuList({ dispatch, state, commit }, paramObj = null) {
    const data = await getBubbleShowData(paramObj)
    commit('updateMenuList', data)
  }
}

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}

二、Vuex中四个map方法的使用 mapState mapGetters mapActions mapMutations

1. mapState: 帮助我们映射state中的数据为计算属性,

  this.$store.state.home.checkedChildTheme // home是store的module

import {mapState,mapGetters} from 'vuex'

computed: {
    //借助mapState生成计算属性:selectMenu(对象写法)
     ...mapState({selectMenu:'selectMenu'}),
    
    // 获取modules里的state
    ...mapState({
      selectMenu: (state) => state.home.selectMenu
    })

         
    //借助mapState生成计算属性:selectMenu(数组写法)
    ...mapState(['selectMenu']),

    // 获取modules里的state
    ...mapState('home', ['selectMenu'])

}

2.mapGetter帮助我们映射getters中的数据为计算属性: 

this.$store.getters.totalSum

import {mapState,mapGetters} from 'vuex'

computed: {
    //借助mapGetters生成计算属性:totalSum(对象写法)
    ...mapGetters({totalSum:'totalSum'}),

    //借助mapGetters生成计算属性:totalSum(数组写法)
    ...mapGetters(['totalSum'])
},
// 原生写法

<p>{{$store.state.name}}</p>

3.mapActions用来生成actions对话,包含this.$store.dispatch(xxx)的函数

this.$store.dispatch('home/getMenuList', {})

import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'

methods:{
    //靠mapActions生成:getList(对象形式)
    ...mapActions({getList:'getList'})

    //靠mapActions生成:getList(数组形式)
    ...mapActions(['getList'])

    // this.getList() 
}

4.mapMutations帮助我们生成mutations中的方法, 即 this.$store.commit()函数

 this.$store.commit('home/updateMenuList', val) 

methods:{
    //靠mapActions生成:updateSelectedMenu(对象形式)
    ...mapActions({updateSelectedMenu:'updateSelectedMenu'})

    //靠mapActions生成:updateSelectedMenu(数组形式)
    ...mapActions(['updateSelectedMenu'])
}

### Vuex基本概念与用法 #### 什么是 VuexVuex 是专为 Vue.js 应用设计的一个状态管理模式[^1]。它的核心思想来源于 Flux、Redux 和 The Elm Architecture,旨在提供一种集中式的解决方案来管理复杂应用中的共享状态。通过 Vuex,开发者能够更加清晰地追踪和维护全局状态的变化过程。 --- #### Vuex 的主要组成部分 Vuex 主要由以下几个部分组成:`State`, `Getters`, `Mutations`, `Actions` 和 `Modules`[^2]。 ##### 1. **State** `State` 存储了整个应用的状态数据,类似于一个全局变量容器。任何组件都可以读取这些数据,但不能直接修改它们。为了保持一致性,所有的状态更改都必须通过 Mutations 来完成。 示例代码展示如何定义并访问 State: ```javascript const store = new Vuex.Store({ state: { count: 0 } }); // 组件中访问 State computed: { count() { return this.$store.state.count; } } ``` --- ##### 2. **Getters** `Getters` 类似于 Store 中的计算属性,允许我们从 State 中派生一些新值。可以通过返回函数的方式实现参数化 Getter[^3]。 示例代码演示 Getter 的使用: ```javascript const store = new Vuex.Store({ state: { todos: [ { id: 1, text: '学习 Vuex', done: true }, { id: 2, text: '复习 JavaScript', done: false } ] }, getters: { doneTodos(state) { return state.todos.filter(todo => todo.done); } } }); // 在组件中使用 Getter computed: { doneTodos() { return this.$store.getters.doneTodos; } } ``` --- ##### 3. **Mutations** `Mutations` 是唯一可以改变 State 的地方,并且必须是同步操作。每个 Mutation 都有一个字符串类型的事件名以及回调函数[^4]。 示例代码说明如何创建和调用 Mutation: ```javascript const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state, n) { state.count += n; } } }); // 调用 Mutation this.$store.commit('increment', 5); // 将 count 加上 5 ``` --- ##### 4. **Actions** `Actions` 提交的是 Mutations,而不是直接变更状态;并且 Actions 支持异步操作。这意味着可以在 Action 内部执行诸如 API 请求之类的任务后再提交 Mutation。 下面是一段简单的 Action 示例: ```javascript const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } }, actions: { asyncIncrement(context) { setTimeout(() => { context.commit('increment'); }, 1000); } } }); // 调用 Action this.$store.dispatch('asyncIncrement'); // 一秒后将 count 增加 1 ``` --- ##### 5. **Modules** 随着应用规模的增长,Store 文件可能会变得臃肿难懂。因此 Vuex 提供了一种模块化的方案——即把 Store 划分为多个独立的小型模块[^5]。 以下是如何设置 Modules 的例子: ```javascript const userModule = { state: { name: 'John Doe' }, mutations: {}, actions: {} }; const productModule = { state: { items: [] }, mutations: {}, actions: {} }; const store = new Vuex.Store({ modules: { user: userModule, products: productModule } }); ``` 此时,在组件中可以通过命名空间的形式访问对应模块的数据或方法,例如 `this.$store.state.user.name`。 --- #### Vuex 的优势 - **单一数据源**:所有应用级别的状态都被存储在一个集中的 Store 对象中。 - **状态可追踪性**:由于所有的状态变化都需要经过 Mutations 进行记录,所以更容易调试和回溯问题所在。 - **更好的协同工作能力**:对于大型项目而言,团队成员之间能更方便地理解和维护公共状态逻辑。 --- #### 使用场景建议 并非任何时候都应该引入 Vuex。只有当遇到跨组件通信困难或者存在大量需要共享的状态时才考虑采用它[^1]。如果只是局部范围内的父子组件间通讯,则推荐继续沿用 Props 和 Events 方式解决即可。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值