一、默认插槽
创建默认插槽的代码如下,很简单,你只需要把 this.$slots.default 理解为一个创建默认插槽时,由vue提供的全局静态变量即可。直接拿来用。
Vue.component("slot_render",{
render: function (createElement) {
return createElement('div',[this.$slots.default])
}
})
<div id="slot_render_demo">
<slot_render>
默认插槽
</slot_render>
</div>
二、命名插槽
创建命名插槽的代码如下,也很简单,最关键的是插槽名字:this.$slots.slot_name1,这个名字(slot_name1)是自己随便取的,然后在使用的时候要对应起来即可。
Vue.component("slot_render",{
render: function (createElement) {
return createElement('div',[ this.$slots.slot_name1,this.$slots.slot_name2])
}
})
<div id="slot_render_demo">
<slot_render>
<template v-slot:slot_name1>
命名插槽1
</template>
<template v-slot:slot_name2>
命名插槽2
</template>
</slot_render>
</div>
三、作用域插槽
组件代码如下,主要使用到了全局变量:this.$scopedSlots,它的后面跟上插槽名称。作用域插槽主要是提供一种途径:把内部组件数据暴露给外部调用者,然后外部调用者进行定制或加工。
Vue.component("slot_render",{
props:['msg'],
render: function (createElement) {
return createElement('div', [
this.$scopedSlots.default({
text: this.msg
})
])
}
})
调用者代码如下,关键的代码是:v-slot:default="props",其中default是插槽名称,必须和组件定义时的一致。props时一个作用域名称,它的名字可以随便取,不一定非得是props。通过这个名称就可以访问组件定义时的作用域插槽的数据。
<div id="slot_render_demo">
<input type="text" v-model="msg" />
<slot_render v-bind:msg="msg">
<template v-slot:default="props">
<span>{{props.text}}</span>
</template>
</slot_render>
</div>
在这个例子中,当input的内容改变后,插槽里的内容也会自响应的变化。
备注:作用域插槽的另一种用法,将在后面的一篇文章里讲解。