vuex的购物车效果 index.js
import Vue from 'vue'; import Vuex, { Store } from 'vuex'; import { stat } from 'fs'; Vue.use(Vuex); let store = new Store({ state:{ list: [ { id:1, count: 0, price: 10, goodsname: '橘子' }, { id:2, count: 0, price:8, goodsname: '苹果' }, { id:3, count: 0, price:4, goodsname: '香蕉' }, { id:4, count: 0, price:4, goodsname: '桃子' } ], sum:0, price:0 }, getters: { sellPrice(state) { return (ind)=>{ //getters 传参 return state.list[ind].price * state.list[ind].count; } }, mycount(state){ state.sum=0; //必须初始化每次的数量 for(let i= 0;i<state.list.length;i++){//遍历总数 let num = state.list[i].count; state.sum+=num } return state.sum; }, allPrice(state){ state.sum=0;//必须初始化每次的数量确保每次遍历的值都是准确的 state.price=0;//必须初始化每次的价格确保每次遍历的值都是准确的 for(let i= 0;i<state.list.length;i++){ //遍历总数 let num = state.list[i].count; let price = state.list[i].price; state.price += num*price; } return state.price; } }, mutations: { add(state,ind) { //进行数量的增加 state.list[ind].count++; }, del(state,ind) { //进行数量的 if (state.list[ind].count === 0) { state.list[ind].count === 0; } else { state.list[ind].count--; } } } }) export default store;
app.vue
<template>
<div id="app">
<table class="table">
<tr>
<td>商品</td>
<td>价格</td>
<td>数量</td>
<td colspan="3"></td>
</tr>
<tr v-for='(item,ind) in list' :key="ind">
<td> {{item.goodsname}}</td>
<td>{{item.price}}/斤</td>
<td><input type="text" v-model.number="item.count" class="num" ></td>
<td>总价{{sellPrice(ind)}}</td>
<td>
<button @click="add(ind)">add</button>
</td>
<td><button @click="del(ind)">del</button></td>
</tr>
<tr>
<td colspan="2"></td>
<td>
<span>总量{{mycount}}</span>
</td>
<td>
<span>结算{{allPrice}}</span>
</td>
</tr>
</table>
</div>
</template>
<script>
import { mapGetters, mapState, mapMutations, mapActions } from "vuex";
export default {
name: "App",
computed: {
...mapGetters(["sellPrice", "mycount", "allPrice"]),
...mapState(["list"])
},
created() {},
methods: {
...mapMutations(["add", "del"])
}
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
ul {
list-style: none;
margin: 0;
padding: 0;
}
.num {
max-width:100px;
width: 20px;
display: inline-block;
height: auto;
outline: none;
text-align: center;
}
.table {
width: 500px;
overflow: hidden;
background: skyblue;
}
tr,td{
width: 100px;
text-align: center;
border: none;
border: 1px solid black;
}
</style>

浙公网安备 33010602011771号