vue插槽slot使用
插槽就是子组件中的提供给父组件使用的一个占位符,用 表示,父组件可以在这个占位符中填充任何模板代码
slot中的name=“”要与组件中的slot=“”相对应
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
</todo>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
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: `<div>{{title}}</div>`
});
Vue.component("todo-items",{
props:['item'],
template:`<li>{{item}}</li>`
})
var vm = new Vue({
el: '#app',
data: {
title: "列表",
todoItems: ["java", "vue", "linux", "javascript"]
}
});
</script>
自定义组件内容分发 $emit(“事件名”,参数)
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title"></todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems"
:item="item" :index="index" @aaa="removeItem(index)"></todo-items>
</todo>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"></script>
<script>
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: `<div>{{title}}</div>`
});
Vue.component("todo-items",{
props:['item','index'],
template:`<li>{{index}}---------{{item}} <button @click="remove">删除</button></li> `,
methods: {
remove:function (index) {
// alert("111")
this.$emit('aaa',index)
}
}
})
var vm = new Vue({
el: '#app',
data: {
title: "列表",
todoItems: ["java", "vue", "linux", "javascript"]
},
methods: {
removeItem:function (index) {
console.log("删除了"+this.todoItems[index])
this.todoItems.splice(index,1);//删除当前元素
}
}
});
</script>