vue作用域插槽slot-scope详解
vue的插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示、以及怎样显示由父组件来决定。实际上,一个slot最核心的两个问题这里就点出来了,是显示不显示和怎样显示。了解vue的同学都知道插槽分为单个插槽,具名插槽,还有作用域插槽,前两种比较简单这里就不赘述了,今天的重点是讨论作用域插槽。简单来说,前两种插槽的内容和样式皆由父组件决定,也就是说显示什么内容和怎样显示都由父组件决定;但
vue的插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示、以及怎样显示由父组件来决定。 实际上,一个slot最核心的两个问题这里就点出来了,是显示不显示和怎样显示。
了解vue的同学都知道插槽分为单个插槽,具名插槽,还有作用域插槽,前两种比较简单这里就不赘述了,今天的重点是讨论作用域插槽。
简单来说,前两种插槽的内容和样式皆由父组件决定,也就是说显示什么内容和怎样显示都由父组件决定;但是第三种插槽就不同了,作用域插槽的样式由父组件决定,内容却由子组件控制。简单来说:前两种插槽不能绑定数据,作用域插槽是一个带绑定数据的插槽。
由于Vue官方在2.6版本以后改变了插槽的书写方式,所以,我们这里区分2.6版本之前的写法和2.6版本以后的写法:
我们先来看2.6版本之前的写法:
// 父组件
<template>
<div id="app">
<child>
<template slot-scope="a">
<p v-text="a.item"></p>
</template>
</child>
</div>
</template>
<script>
import child from './child';
export default {
name: 'app',
components: {
child
}
}
</script>
//子组件
<template>
<div>
<ul>
<li v-for="(item,index) in items" :key="index">{{item}}
<slot :item='item'></slot>
</li>
</ul>
</div>
</template>
<script>
export default {
data () {
return {
items:['Webkit','Gecko','Trident','Blink']
}
}
}
</script>
再来看2.6版本之后的写法,子组件的写法不用变,和原来一模一样,来看父组件的写法:
// 父组件
<template>
<div id="app">
<child>
<template v-slot="a">
<p v-text="a.item"></p>
</template>
</child>
</div>
</template>
<script>
import child from './child';
export default {
name: 'app',
components: {
child
}
}
</script>
我们可以清晰的看到,在子组件中有个插槽slot通过v-bind绑定了一个值item,在父组件中引用了子组件child,child标签里面可以看到作用域插槽template,此时slot-scope就是一个对象,这个对象是由子组件的插槽slot所绑定的值所组成的一个对象,比如在这里slot-scope = {item},这里的item来自子组件,而这里slot-scope的值是a,所以就有了下面的
<p v-text="a.item"></p>
说到这里,想必大家都应该明白了作用域插槽了吧,简单来说就一句话:可以绑定数据的插槽,显示内容完全由子组件决定,数据来自子组件。
如果绑定数据太多,而你不需要全都用到的时候可以使用es6的对象解构,关于对象解构比较简单,笔者在此就不再赘述了!
更多推荐
所有评论(0)