[Vue]购物车案例(三)

300 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

购物车案例——实现列表组件删除功能

  • 从父组件把商品列表list数据传递过来,即父向子组件传值

  • 把传递过来的数据渲染到页面上。

  • 点击删除按钮的时候,删除对应的数据。

    • 给按钮添加点击事件把需要删除的id传递过来。

      • 子组件中不推荐操作父组件的数据,有可能多个子组件使用父组件的数据,我们需要把数据传递给父组件,让父组件操作数据。
      • 父组件删除对应的数据。

html 代码结构

 <div id="app">
    <div class="container">
      <!-- 把组件渲染到页面上 --> 
      <my-cart></my-cart>
    </div>
  </div>

js 代码结构

  <script type="text/javascript" src="js/vue.js"></script>
  <script type="text/javascript">
      code in here
  </script>

实现列表组件删除功能

3.2 把列表数据动态渲染到页面上

    var CartTitle = {
      props: ['uname'],
      template: `
        <div class="title">{{uname}}的商品</div>
      `
    }

3.3 给按钮添加点击事件把需要删除的id传递过来

    var CartList = {
      props: ['list'],
      template: `
        <div>
          <div :key='item.id' v-for='item in list' class="item">
            <img :src="item.img"/>
            <div class="name">{{item.name}}</div>
            <div class="change">
              <a href="">-</a>
              <input type="text" class="num" />
              <a href="">+</a>
            </div>
            <div class="del" @click='del(item.id)'>×</div>
          </div>
        </div>
      `,

3.4 子组件中不推荐操作父组件的数据,有可能多个子组件使用父组件的数据

我们需要把数据传递给父组件,让父组件操作数据。

      methods: {
        del: function(id){
           # 
          this.$emit('cart-del', id);
        }
      }
    }
    var CartTotal = {
      props: ['list'],
      template: `
        <div class="total">
          <span>总价:{{total}}</span>
          <button>结算</button>
        </div>
      `,
      computed: {
        total: function() {
          // 计算商品的总价
          var t = 0;
          this.list.forEach(item => {
            t += item.price * item.num;
          });
          return t;
        }
      }
    }
    Vue.component('my-cart',{
      data: function() {
        return {
          uname: '张三',
          list: [{
            id: 1,
            name: 'TCL彩电',
            price: 1000,
            num: 1,
            img: 'img/a.jpg'
          },{
            id: 2,
            name: '机顶盒',
            price: 1000,
            num: 1,
            img: 'img/b.jpg'
          },{
            id: 3,
            name: '海尔冰箱',
            price: 1000,
            num: 1,
            img: 'img/c.jpg'
          },{
            id: 4,
            name: '小米手机',
            price: 1000,
            num: 1,
            img: 'img/d.jpg'
          },{
            id: 5,
            name: 'PPTV电视',
            price: 1000,
            num: 2,
            img: 'img/e.jpg'
          }]
        }
      },

3.1 从父组件把商品列表list数据传递过来,即父向子组件传值。

      template: `
        <div class='cart'>
          <cart-title :uname='uname'></cart-title>

3.5 父组件通过事件绑定,接收子组件传递过来的数据

          <cart-list :list='list' @cart-del='delCart($event)'></cart-list>
          <cart-total :list='list'></cart-total>
        </div>
      `,
      components: {
        'cart-title': CartTitle,
        'cart-list': CartList,
        'cart-total': CartTotal
      },

3.6    根据id删除list中对应的数据

      methods: {      
        delCart: function(id) {
          // 1、找到id所对应数据的索引
          var index = this.list.findIndex(item=>{
            return item.id == id;
          });
          // 2、根据索引删除对应数据
          this.list.splice(index, 1);
        }
      }
    });
    var vm = new Vue({
      el: '#app',
      data: {
​
      }
    });
​
  </script>
</body>
</html>