【前端技术】Vuex 快速入门(面向初学者)

Vuex 快速入门(面向初学者)

Vuex 是 Vue 生态里的「集中式状态管理」库
一句话:当你需要在多个组件之间共享、持久或可追踪的数据时,用 Vuex 可以让数据流动可控、可调试、可预测


1. 为什么要用 Vuex?

  1. 组件树很深props/emit 层层传递麻烦。
  2. 跨页面共享:登录信息、购物车等全局状态。
  3. 调试回滚:通过时间线看每一次状态变更。
  4. 统一规则:所有修改都在一个地方(mutation),好管理、便于协作。

2. 核心概念秒记

概念作用关键词
state数据源单一真相
getter派生数据(类似计算属性)缓存
mutation同步修改 state 的唯一入口必须是同步
action处理异步逻辑,再提交 mutationAjax / 定时器
module将大 store 切分为命名空间解耦

3. 安装与创建 Store

# Vue 2 项目
npm i vuex@3
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  getters: {
    double: state => state.count * 2
  },
  mutations: {
    INCREMENT (state) {
      state.count++
    }
  },
  actions: {
    asyncIncrement ({ commit }) {
      setTimeout(() => commit('INCREMENT'), 1000)
    }
  }
})

然后在入口文件挂载:

import Vue from 'vue'
import App from './App.vue'
import store from './store'

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

4. 在组件里使用

<template>
  <div>
    <h2>计数:{{ count }}</h2>
    <p>双倍:{{ double }}</p>
    <button @click="INC">+1 (同步)</button>
    <button @click="asyncIncrement">+1 (异步)</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'

export default {
  computed: {
    ...mapState(['count']),
    ...mapGetters(['double'])
  },
  methods: {
    ...mapMutations({ INC: 'INCREMENT' }),
    ...mapActions(['asyncIncrement'])
  }
}
</script>

要点
mapState/mapGetters 把全局数据映射为本地计算属性。
mapMutations/mapActions 把提交方法映射为组件方法。
切记:组件里不要直接改 state,必须走 mutation


5. 模块化示例

// store/modules/user.js
export default {
  namespaced: true,   // 有命名空间
  state: () => ({ token: '' }),
  mutations: {
    SET_TOKEN (state, t) { state.token = t }
  },
  actions: {
    login ({ commit }, payload) {
      return api.login(payload).then(res => {
        commit('SET_TOKEN', res.token)
      })
    }
  }
}
// store/index.js
import Vuex from 'vuex'
import user from './modules/user'

export default new Vuex.Store({
  modules: { user }
})

组件调用:

// 带命名空间的映射
computed: {
  ...mapState('user', ['token'])
},
methods: {
  ...mapActions('user', ['login'])
}

6. 调试技巧

  1. Vue Devtools → Vuex 标签页可查看 state 与 mutation 时间线。
  2. 严格模式new Vuex.Store({ strict: process.env.NODE_ENV !== 'production' }) 防止非法改动 state。
  3. 插件:如 vuex-persistedstate 自动把某些 state 同步到 localStorage。

7. 常见疑问

Q:为什么 mutation 必须同步?
A:工具要记录“快照”,同步才可确保时间点与状态一致;异步放 action。

Q:Vue3 推荐用 Pinia 吗?
A:Pinia 是官方新一代状态库,API 更简洁,TypeScript 体验更好;但 Vuex 在现有 Vue2 项目仍大量使用。


8. 一句话总结

Vuex = 全局数据仓库 + 规定的读写流程。
牢记“读 state / 写 mutation / 异步放 action”这条铁律,再配合 mapXXX 辅助函数,你就能在任意组件中优雅地共享数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿寻寻

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值