Vue实现简单购物车功能

基本效果

模拟json数据

[
  {
    "isSelected":true,
    "image":"https://img10.360buyimg.com/cms/s80x80_jfs/t1/25474/2/7242/163408/5c6a2aacE4a9b5d08/f40901e59808caae.jpg",
    "title":"【官方正品 品牌直营】【精选优质反绒皮 加绒可选】专柜同款原装直邮 品质",
    "desc":"颜色:灰色-四季尺码 :#42",
    "price":120.12321,
    "num":3
  },

  {
    "isSelected":true,
    "image":"https://img10.360buyimg.com/cms/s80x80_jfs/t1/25474/2/7242/163408/5c6a2aacE4a9b5d08/f40901e59808caae.jpg",
    "title":"【官方正品 品牌直营】【精选优质反绒皮 加绒可选】专柜同款原装直邮 品质",
    "desc":"颜色:灰色-四季尺码 :#42",
    "price":120,
    "num":5
  }


]

实现代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>

<body>
<div id="app">
    <div class="container">
        <div class="rows">
            <table class="table table-bordered">
                <caption><h1>购物商场</h1> </caption>
                <tr>
                    <td><input type="checkbox"  v-model="changeAll">全选</td>
                    <td>商品</td>
                    <td>描述</td>
                    <td>价格</td>
                    <td>数量</td>
                    <td>小计</td>
                    <td><button class="btn btn-danger">操作</button></td>
                </tr>
                <tr v-for="(produce,index)  in produces">
                    <td><input type="checkbox" v-model="produce.isSelected" ></td>
                    <td>
                        <img :src="produce.image" >
                        {
   
   {produce.title}}
                    </td>
                    <td>{
   
   {produce.desc}}</td>
                    <td>{
   
   {produce.price | toFixed(2) }}</td>
                    <td><input type="number" v-model.number="produce.num"></td>
                    <td>{
   
   {produce.price*produce.num | toFixed(2)}}</td>
                    <td><button class="btn btn-danger" @click="del(produce)">删除</button></td>
                </tr>
                <tr>
                    <td callspan="6">总价:{
   
   {sum | toFixed(2) }}</td>
                </tr>
            </table>
    </div>
    </div>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    let vm  = new Vue({
        el:"#app",
        data:{
            produces:[],
        },
        methods:{
            del(produce){ //传递要删除的商品,然后根据商品在数组中查询,并且删除,
                this.produces=this.produces.filter(item=>item!==produce);
            },
            getData(){
                axios.get('./cart.json').then(res=>{//成功
                    this.produces = res.data;
                },err=>{//失败
                    console.log(err);
                })
            }
        },
        created(){ //这个方法在数据被初始化后调用
            this.getData();
        },
        filters:{
            toFixed(input,param1){ //过滤器,其实也就是一个简单的方法,没有什么两样,,
                return input.toFixed(param1);
            }
        },
        computed:{
            changeAll:{
                get(){
                    return this.produces.every(p=>p.isSelected)
                },
                set(val){
                    this.produces.forEach(p=>p.isSelected=val)
                }
            },
            sum:{
                get(){
                    return this.produces.reduce((prev,next)=>{
                        if(!next.isSelected){
                            return prev
                        }
                        return prev+next.price*next.num;
                    },0)
                }
            }
        }
    })
</script>
</html>

猜你喜欢

转载自blog.csdn.net/Yun__shen/article/details/87626229