插槽slot
简单的理解就是一段html
代码模板,只是需要的在一个特定的情况下使用。插槽分为普通插槽,具名插槽,作用域插槽。
-
普通插槽
普通插槽,新建一个局部组件tip
,在tip
中新建一个slot
标签,里面放上一段html
代码模板,然后在父级组件引用tip
,局部组件tip
中如果填写的有内容,则就渲染填写的内容,否则就渲染局部组件slot
里面的内容。
局部组件
<template>
<div>
<slot>今天天气很棒</slot>
</div>
</template>
父级组件
<template>
<div>
<tip>666</tip>
</div>
</template>
<script>
import tip from "../components/Tip";
</script>
渲染结果-
具名插槽
有时候需要使用多个插槽,就需要使用具名插槽。在局部组件tip
中slot
加一个name
属性,然后在父级组件使用时,通过v-slot=name
,来使用指定的插槽。
注意
v-slot
只能使用template
中
局部组件
<template>
<div>
<slot name="der" >今天天气很棒</slot>
</div>
</template>
父级组件
<template>
<div>
<tip>
<template v-slot:der><span>真棒!</span></template>
</tip>
</div>
</template>
缩写
<template>
<div>
<tip>
<template #der><span>真棒!</span></template>
</tip>
</div>
</template>
渲染结果-
作用域插槽
作用域插槽就是在父组件中让插槽内容能够访问子组件中才有的数据。子组件的插槽通过v-bind
绑定子组件的data
属性,在父级组件中自定义一个属性名,通过这个属性名可以访问到子组件传递的属性值,类似于父子通信的props
。
局部组件
<template>
<div>
<slot name="der" :na="name">今天天气很棒</slot>
</div>
</template>
<script>
export default {
data(){
return {
name:'小明'
}
}
}
</script>
父级组件
<template>
<div>
<tip><template #der="tool">{{tool.na}}</template></tip>//tool是自定义的,der为slot的name
或
<tip><template v-bind:der="tool">{{tool.na}}</template></tip>
</div>
</template>
渲染结果