Vuex 的使用场景和使用方法

1. Vuex 是什么?

Vuex 是 Vue.js 的状态管理模式,专门用于管理多个组件共享的状态。它的核心思想是:

• 集中式存储:将应用的所有状态集中管理

• 单一数据源:整个应用的状态存在一个 store 中

• 只能通过特定 mutation 修改 state

• 支持调试、插件和热重载

2. Vuex 的使用场景

Vuex 的最佳使用场景是中大型复杂应用,主要包括以下情况:

• 多个组件需要共享状态(如登录状态、用户信息、购物车等)

• 多级组件传参复杂、跨组件通信频繁

• 需要统一管理和跟踪状态变化(如记录修改历史、调试)

3. Vuex 的使用方法(示例)

以一个简单的购物车为例:
  1. 安装 Vuex
javascript 复制代码
npm install vuex@next
2. 创建 Store(store/index.js)
javascript 复制代码
// store/index.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    cart: []
  },
  getters: {
    cartItemCount: (state) => state.cart.length,
    totalPrice: (state) => state.cart.reduce((total, item) => total + item.price * item.quantity, 0)
  },
  mutations: {
    ADD_TO_CART(state, product) {
      const item = state.cart.find(i => i.id === product.id);
      if (item) {
        item.quantity++;
      } else {
        state.cart.push({ ...product, quantity: 1 });
      }
    },
    REMOVE_FROM_CART(state, productId) {
      state.cart = state.cart.filter(item => item.id !== productId);
    }
  },
  actions: {
    addToCart({ commit }, product) {
      commit('ADD_TO_CART', product);
    },
    removeFromCart({ commit }, productId) {
      commit('REMOVE_FROM_CART', productId);
    }
  }
});
3. 注册 Store(main.js)
javascript 复制代码
// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';

createApp(App).use(store).mount('#app');
4. 使用 Vuex 在组件中读取和修改数据
javascript 复制代码
<!-- components/ProductList.vue -->
<template>
  <div>
    <h2>Product List</h2>
    <div v-for="product in products" :key="product.id">
      <p>{{ product.name }} - ${{ product.price }}</p>
      <button @click="addToCart(product)">Add to Cart</button>
    </div>
  </div>
</template>
<script setup>
import { useStore } from 'vuex';

const store = useStore();

const products = [
  { id: 1, name: "Product A", price: 100 },
  { id: 2, name: "Product B", price: 200 }
];

const addToCart = (product) => {
  store.dispatch('addToCart', product);
};
</script>
javascript 复制代码
<!-- components/Cart.vue -->
<template>
  <div>
    <h2>Shopping Cart</h2>
    <div v-if="cart.length === 0">Cart is empty</div>
    <div v-else>
      <div v-for="item in cart" :key="item.id">
        <p>{{ item.name }} - ${{ item.price }} x {{ item.quantity }}</p>
        <button @click="removeFromCart(item.id)">Remove</button>
      </div>
      <p>Total Price: ${{ totalPrice }}</p>
    </div>
  </div>
</template>

<script setup>
import { useStore } from 'vuex';
const store = useStore();

const cart = store.state.cart;
const totalPrice = store.getters.totalPrice;

const removeFromCart = (id) => {
  store.dispatch('removeFromCart', id);
};
</script>

4. 运行效果

  1. 点击"Add to Cart",商品加入购物车。

  2. 购物车列表展示商品数量和总价。

  3. 点击"Remove"可移除商品。

5. Vuex 使用总结

• Vuex 适合复杂状态管理和组件树很深的场景。

• 在简单应用中,可以直接使用 props 和 emit 传递数据。

• 在大型项目中,Vuex 能提供良好的状态管理和调试能力。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net