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 能提供良好的状态管理和调试能力。

相关推荐
喜樂的CC8 分钟前
[react]Next.js之自适应布局和高清屏幕适配解决方案
javascript·react.js·postcss
天天扭码22 分钟前
零基础 | 入门前端必备技巧——使用 DOM 操作插入 HTML 元素
前端·javascript·dom
咖啡虫1 小时前
css中的3d使用:深入理解 CSS Perspective 与 Transform-Style
前端·css·3d
烛阴1 小时前
手把手教你搭建 Express 日志系统,告别线上事故!
javascript·后端·express
拉不动的猪1 小时前
设计模式之------策略模式
前端·javascript·面试
旭久1 小时前
react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR
前端·javascript·react.js
独行soc1 小时前
2025年常见渗透测试面试题-红队面试宝典下(题目+回答)
linux·运维·服务器·前端·面试·职场和发展·csrf
uhakadotcom2 小时前
Google Earth Engine 机器学习入门:基础知识与实用示例详解
前端·javascript·面试
麓殇⊙2 小时前
Vue--组件练习案例
前端·javascript·vue.js
outstanding木槿2 小时前
React中 点击事件写法 的注意(this、箭头函数)
前端·javascript·react.js