zoukankan      html  css  js  c++  java
  • 【Vue】03 Slot 插槽 & 自定义事件

    顾名思义就是一个槽,可以嵌入各种各样的东西

    Vue的插槽就是一个slot标签,可以在这个定义了插槽的组件中插入其他的组件

    但是有一点很重要:使用插槽的组件必须要用div标签一个根标签包裹,否则无效

    <div id="container-element" >
    
    <book>
      <aaa slot="aaa" v-bind:ta="head_title"></aaa>
      <bbb slot="aaa" v-for="item in items" v-bind:tb="item"></bbb>
    </book>
    
    
    
    
    </div>
    
    <script type="text/javascript">
    
      Vue.component("book", {
        template :
          "<div>" +
          "<slot name='aaa'></slot>" +
          "<ul>" +
          "<slot name='bbb'></slot>" +
          "</ul>" +
          "</div>"
      });
    
      Vue.component("aaa", {
        props : ['ta'],
        template : "<h3>{{ta}}</h3>"
      });
    
      Vue.component("bbb",{
        props : ['tb'],
        template : "<li>{{tb}}</li>"
      });
    
    
      let vueModel = new Vue({
        el : "#container-element",
        data : {
          head_title : "书籍列表",
          items : [
            "java",
            "linux",
            "c++",
            "python",
            "rust"
          ]
        }
    
      });
    </script>

    效果:

    自定义事件:

    组件中的事件与要执行的方法是在这个组件对象中声明:

    测试效果:

    但是在vueModel对象中的方法是不能被组件调用的

    当前的方法可以在控制台中使用

    效果:

    v-for似乎是可以设置一个迭代变量,然后可以传递这个变量给组件渲染:

    还是不是很能理解方法的绑定:

    简单来说就是这个意思:

    $emit 触发父组件的自定义事件

    代码:

    <book>
      <aaa slot="aaa" v-bind:ta="head_title"></aaa>
      <bbb slot="aaa" v-for="(item,index) in items" v-bind:tb="item" v-bind:i="index" v-on:remove="removeBookItem(index)"></bbb>
    </book>
    
    </div>
    
    <script type="text/javascript">
    
      Vue.component("book", {
        template :
          "<div>" +
          "<slot name='aaa'></slot>" +
          "<ul>" +
          "<slot name='bbb'></slot>" +
          "</ul>" +
          "</div>"
      });
    
      Vue.component("aaa", {
        props : ['ta'],
        template : "<h3>{{ta}}</h3>"
      });
    
      Vue.component("bbb",{
        props : ['tb','i'],
        template : "<li>{{i}}  {{tb}} <button @click='remove'>移除书籍</button></li> ",
        methods : {
          remove : function (i) {
            this.$emit("remove", i);
          }
    
        }
    
      });
      
      let vueModel = new Vue({
        el : "#container-element",
        data : {
          head_title : "书籍列表",
          items : [
            "java",
            "linux",
            "c++",
            "python",
            "rust"
          ]
        },
        methods : {
          removeBookItem : function (index) {
            // splice方法 (要执行删除的当前元素的索引,要删除的元素的个数, ...要增加的元素)
            alert("删除了:" + this.items[index]);
            this.items.splice(index, 1);
          }
        }
    
      });
    </script>
  • 相关阅读:
    关于代码中写日志的一些思考
    2018 年 深度学习框架 盘点 比较 推荐
    深度学习----实现一个博弈型的AI,从五子棋开始
    深度学习笔记----Anaconda及开发环境搭建
    彩票玩法介绍
    EditPlus 3.41 p1115 0728注册码
    丹--支付宝二维码
    C#类、方法的访问修饰符
    VS2010单元测试入门实践教程
    Nunit中如何进行事务性单元测试
  • 原文地址:https://www.cnblogs.com/mindzone/p/13335663.html
Copyright © 2011-2022 走看看