Web前端vue必做笔记之一:Vuex基本使用(二)

本文介绍如何使用Vue框架中的状态管理模式Vuex实现购物车功能。包括配置Vuex商店、定义状态(state)、提交更改(mutations)及触发动作(actions)等步骤,并展示了在Vue组件中如何调用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Web前端vue必做笔记之一:Vuex基本使用(二)

我们来看看这个功能
在这里插入图片描述

首先我们看到Vuex的主目录index.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

import state from './state';
import mutations from './mutations';
import * as actions from './actions';
import * as getters from './getters';
 

 
export default new Vuex.Store({
  state,       //保存的一些数据,比如说购物车列表
  getters,     //可以理解成是state一个计算属性
  mutations,    //可以理解是设置数据
  actions,     //可以理解是处理多个mutations执行
  
});

在state.js中

//比如说一下购物车列表
const state = {
     items:[]
}

export default state;

在getters.js中

export const items = function(state){
      
    return state.items;      //通过getters可以访问state中items的数据
}   

在mutations-types.js中

//专门用来管理操作数据的方法

//添加购物车方法
export const PUSH_PRODUCT_TO_CART = 'PUSH_PRODUCT_TO_CART';

//增加商品数量方法
export const INCREMENT_ITEM_QUANTITY = 'INCREMENT_ITEM_QUANTITY'

在mutations.js

import * as types from './mutation-types';

const mutations = {

    //添加购物车方法
    //每次添加商品就增加商品的id,title,quantity(数量)
    [types.PUSH_PRODUCT_TO_CART](state,product){
          state.items.push({
                id:product.id,
                title:product.title,
                quantity:1
          })
    },

     //如果已经有商品了,就增加数量就可以了
    [types.INCREMENT_ITEM_QUANTITY](state, product) {
         const cartItem = state.items.find(item => item.id === product.id);
         cartItem.quantity++;
    }
   
}

export default mutations;

在App.vue中

<template>
  <div id="app">
    <ul>
       <li v-for="item in listData" :key="item.id">
            <h3>{{item.title}}</h3>
            <!-- 这个item参数会传到action中第二个参数(也就是product), actions中第一个参数vuex会自动帮我们传入,我们自己传入的参数会从第二位算起 -->
            <button @click="addProductToCart(item)">添加到购物车</button>  
       </li>
    </ul>

    <ul>
       <li v-for="item in items" :key="item.id">
          <h1>{{item}}</h1>
       </li>
    </ul>

     <!-- 使用getters访问数据 -->
    <!-- <h2>{{items}}</h2> -->


    <!-- 不用getters访问数据 -->
    <!-- <h1>{{$store.state.items}}</h1> -->
          
  </div>
</template>

<script>
import axios from 'axios';
import {mapGetters, mapActions} from 'vuex';
export default {
     data(){
          return {
              listData:[]
          }
     },
     computed:{
         ...mapGetters(['items'])
     },

     methods:{
           _getList(){
                 axios.get('https://jsonplaceholder.typicode.com/albums?_limit=5')
                 .then(({data}) =>{
                       this.listData = data;
                 })
           },

          //  ...mapMutations({
          //       pushProductToCart: 'PUSH_PRODUCT_TO_CART'
          //  })

          // addProductToCart(){} 相当于定义了这个方法,所以可以在组件中使用这个方法
           ...mapActions([
             'addProductToCart'
           ])
          
        //  如果不写mapActions就需要这样写,就麻烦一些
        //   addProductToCart(item){
        //       this.$$store.dispatch('addProcuctToCart',item);
        //   }
     },
     created(){
          this._getList();
     }
}
</script>
<style>

</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值