A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】前端笔记Vue项目 第3天 7
3.  实现列表组件删除功能


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


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


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


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


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


父组件删除对应的数据
[AppleScript] 纯文本查看 复制代码
<div id="app">

    <div class="container">

      <my-cart></my-cart>

    </div>

  </div>

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

  <script type="text/javascript">

     

    var CartTitle = {

      props: ['uname'],

      template: `

        <div class="title">{{uname}}的商品</div>

      `

    }

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

    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>

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

            <div class="del" @click='del(item.id)'>×</div>

          </div>

        </div>

      `,

      methods: {

        del: function(id){

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

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

          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'

          }]

        }

      },

[AppleScript] 纯文本查看 复制代码
# 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
      },
      methods: {
        # 3.6    根据id删除list中对应的数据        
        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>


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马