vue-slot及自定义分发

Vue-slot插槽

应用在组合组件的场景中


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <todo>
      <todo-title slot="todo-title" v-bind:title="title"></todo-title>   <!--  v-bind简写为一个冒号:-->
        <todo-items slot="todo-items" v-for="item in todoItems" v-bind:item="item"></todo-items>
    </todo>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
    // Vue.component("todo",{
    //     template: "<div>"+
    //         "<slot></slot>" +
    //         "<ul>" +
    //         "<slot></slot>"+
    //         "</ul>"+
    //         "</div>"
    // });
    Vue.component("todo",{   //反斜杠实现换行,slot插槽
        template: "<div>\
            <slot name='todo-title'></slot>\
            <ul>\
            <slot name='todo-items'></slot>\
            </ul>\
            </div>"
    });

    Vue.component("todo-title",{    //将数据填充到第一个组件
        props:["title"],   // 接收参数
        template: "<p>{{title}}</p>"
    });

    Vue.component("todo-items",{
        props:["item"],
        template:"<li>{{item}}</li>"
    });

    var  vm=new Vue({
        el:"#app",
        data:{
            title:"列表",
            todoItems:["C","java","Python"]
        }
    });
</script>
</body>
</html>

image


自定义事件分发

组件中也可以定义方法实现参数传递和事件分发: this.$emit('自定义事件名',参数)


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <todo>
      <todo-title slot="todo-title" v-bind:title="title"></todo-title>   <!--  v-bind简写为一个冒号:-->
        <todo-items slot="todo-items" v-for="(item,index) in todoItems"
                    v-bind:item="item" v-bind:index="index" v-on:remove="removeItems(index)"></todo-items>
    </todo>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
    // Vue.component("todo",{
    //     template: "<div>"+
    //         "<slot></slot>" +
    //         "<ul>" +
    //         "<slot></slot>"+
    //         "</ul>"+
    //         "</div>"
    // });
    Vue.component("todo",{   //反斜杠实现换行
        template: "<div>\
            <slot name='todo-title'></slot>\
            <ul>\
            <slot name='todo-items'></slot>\
            </ul>\
            </div>"
    });

    Vue.component("todo-title",{    //将数据填充到第一个组件
        props:["title"],   // 接收参数
        template: "<p>{{title}}</p>"
    });

    Vue.component("todo-items",{
        props:["item","index"],
        template:"<li>{{index}}---{{item}}<button @click='remove'>删除</button></li>",     //@是事件的简写(v-on)
        methods:{   //只能绑定当前组件的方法
            remove: function (index) {
                this.$emit("remove",index);
            }
        }
    });

    var  vm=new Vue({
        el:"#app",
        data:{
            title:"列表",
            todoItems:["C","java","Python"]
        },
        methods: {
            removeItems:function (index) {
                this.todoItems.splice(index,1)  //一次删除一个元素
                console.log("删除了"+this.todoItems[index]+"ok")
            }
        }
    });
</script>
</body>
</html>

image

posted @ 2023-01-03 10:09  原语  阅读(17)  评论(0编辑  收藏  举报