Vuex状态管理【案例】:购物车2023.05.19下

 目录

23.修改GoodsList.vue

24.购物车页面,修改shopcart.js

25. 修改Shopcart.vue,效果展示


23.修改GoodsList.vue

<template>
  <div class="list">
    <div class="item" v-for="goods in goodslist" :key="goods.id">
      <div class="item-l">
        <img class="item-img" :src="goods.src">
      </div>
      <div class="item-r">
        <div class="item-title">{
   
   {goods.title}}</div>
        <div class="item-price">{
   
   {goods.price|currency}}</div>
        <div class="item-opt">
          <button @click="add(goods)">加入购物车</button>
        </div>
      </div>
    </div>
  </div>
</template>

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

  export default{
    computed:mapState({
      goodslist:state=>state.goods.list
    }),
    methods:mapActions('shopcart',['add']),
    created(){
      this.$store.dispatch('goods/getList')
    },
    filters:{
      currency(value){
        return '¥'+value
      }
    }
  }
</script>

<style>
  .item{
    border-bottom:1px dashed #ccc;
    padding: 10px;
  }
  .item::after{
    content: '';
    display: block;
    clear: both;
  }
  .item-l{
    float: left;
    font-size: 0;
  }
  .item-img{
    width: 100px;
    height: 100px;
    border: 1px solid #ccc;
  }
  .item-r{
    float: left;
    padding-left: 20px;
  }
  .item-title{
    font-size: 14px;
    margin-top: 10px;
  }
  .item-price{
    margin-top: 10px;
    color: #f00;
    font-size: 15px;
  }
  .item-opt{
    margin-top: 10px;
  }
  .item-opt button{
    border: 0;
    background: coral;
    color:#fff;
    padding: 4px 5px;
    cursor: pointer;
  }
</style>

24.购物车页面,修改shopcart.js

const state = {
  items: [] //保存购物车列表
}
const getters = { //计算总价
  totalPrice:(state)=>{
    return state.items.reduce((total,item)=>{
      return total+item.price*item.num
    },0).toFixed(2) //对前边的小数取两位
  }
}
const actions = {
  add(context,item){
    context.commit("add",item)
  },
  del(context,id){
    context.commit("del",id)
  }
}
const mutations = {
  add(context,item){
    const v=state.items.find(v=>v.id==item.id)
    if(v){
      ++v.num
    }
    else{
      state.items.push({
        id:item.id,
        title:item.title,
        price:item.price,
        src:item.src,
        num:1
      })
    }
  },
  del(context,id){
    state.items.forEach((item,index,arr)=>{
      if(item.id===id){ //三个等号是恒等
        arr.splice(index,1)
      }
    })
  }
}

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

25. 修改Shopcart.vue,效果展示

<template>
  <div class="list">
    <div class="item" v-for="item in items" :key="item.id">
      <div class="item-l">
        <img class="item-img" :src="item.src">
      </div>
      <div class="item-r">
        <div class="item-title">
          {
   
   {item.title}}<small>x{
   
   {item.num}}</small>
        </div>
        <div class="item-price">{
   
   {item.price|currency}}</div>
        <div class="item-opt">
          <button @click="del(item.id)">删除</button>
        </div>
      </div>
    </div>
    <div class="item-total" v-if="items.length">
      商品总价:{
   
   {total|currency}}
    </div>
    <div class="item-empty" v-else>购物车中没有商品</div>
  </div>
</template>

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

  export default{
    computed:{
      ...mapState({
        items:state=>state.shopcart.items
      }),
      ...mapGetters('shopcart',{total:'totalPrice'})
    },
    methods:mapActions('shopcart',['del']),
    filters:{
      currency(value){
        return '¥'+value
      }
    }
  }
</script>

<style>
  .item{
    border-bottom:1px dashed #ccc;
    padding: 10px;
  }
  .item::after{
    content: '';
    display: block;
    clear: both;
  }
  .item-l{
    float: left;
    font-size: 0;
  }
  .item-img{
    width: 100px;
    height: 100px;
    border: 1px solid #ccc;
  }
  .item-r{
    float: left;
    padding-left: 20px;
  }
  .item-title{
    font-size: 14px;
    margin-top: 10px;
  }
  .item-price{
    margin-top: 10px;
    color: #f00;
    font-size: 15px;
  }
  .item-opt{
    margin-top: 10px;
  }
  .item-opt button{
    border: 0;
    background: coral;
    color:#fff;
    padding: 4px 5px;
    cursor: pointer;
  }
</style>

 (1).添加之前

 (2).添加之后(单击“加入购物车”按钮,即可将商品添加到购物车,在底部的Tab栏中切换到“购物车”页面,可以查看购物车中的商品,并且会在底部显示商品的总价格,效果展示如下图所示):
a.加入一个商品购物车

b.重复添加同一商品至购物车(显示数量)

c.添加其他商品进入购物车

如果在购物中单击“删除”按钮,则表示删除商品,页面效果如下图所示:

 

猜你喜欢

转载自blog.csdn.net/m0_65065082/article/details/130766007
今日推荐