vue—slot,slot-scoped,以及2.6版本之后插槽的用法

释放双眼,带上耳机,听听看~!
00:00
00:00

slot 插槽 ,是用在组件中,向组件分发内容。它的内容可以包含任何模板代码,包括HTML。

vue 在 2.6.0 中,具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 这两个目前已被废弃但未被移除且仍有用的特性。但是将会在vue 3 中,被废弃的这两个,不会被支持即无效

在 2.6.0之前,插槽的用法:

1. 匿名插槽。

以 .vue 这种单文件模块为例

  1. //创建 testSlot.vue组件
  2. <template>
  3. <div>
         //slot里面也可以设置内容,这个可以设置不传内容时,slot有个默认值替换
  4. <slot>这里面是slot的默认值</slot>
  5. <h3>子组件页面</h3>
  6. </div>
  7. </template>
  8.  
  9. <script>
  10. export default {
  11. props:[],
  12. data:function(){
  13. return {}
  14. }
  15. }
  16. </script>
  17.  
  18. <style>
  19. </style>
  1. //引用testSlot组件
  2. <template>
  3. <div>
  4. <h1>引用testSlot组件的页面</h1>
  5. <testSlot>
  6. {{msg}}
  7. </testSlot>
  8. </div>
  9. </template>
  10.  
  11. <script>
  12. import testSlot from \'../components/testSlot\'
  13. export default{
  14. data () {
  15. return {
             msg:\'这是动态传入的slot的内容\'
           }
  16. },
  17. components:{ testSlot }
  18. }
  19. </script>
  20.  
  21. <style>
  22. </style>

 结果:

vue---slot,slot-scoped,以及2.6版本之后插槽的用法

注意事项:

1) 匿名的方式,就是指把在引用组件的时候,里面传的内容全部一起传送到组件页面中 <slot></slot> 所在的位置

2) 只要组件中有 <slot></slot> ,并且不管有多少个,都会全部渲染为传过来的内容

3) <slot></slot>里面也可以设置内容,这个内容是保证引入组件的时候,有个默认值。当然,<slot></slot>里面不设置内容也可以,这样只是没有默认值,是不会报错的

4) 传递的内容,也可以是动态的,如同上面一样。但是要注意的是,这个内容不能是 引用组件的时候组件上的内容,要注意作用域。可以查看官网 插槽编译作用域

5) 如果传递的内容没有slot 来接收,那么,传递的内容就会被抛弃掉,不会起作用。

5) 那这个时候,如果我想某个 <slot></slot> 传指定的 内容呢?那这个时候就需要具名插槽了。

 

 2. 具名插槽,就是给插槽指定名称,然后 一 一对应

  1. //引入组件的页面
  2. <testSlot>
  3. <template slot=\'header\'>
  4. <p>------------header----------------</p>
  5. <h3>这是header1的内容</h3>
  6. <p>这是header2的内容</p>
  7. </template>
  8. <template slot=\'footer\'>
  9. <p>------------footer----------------</p>
  10. <h3>这是footer1的内容</h3>
  11. <p>这是footer2的内容</p>
  12. </template>
  13. <p>-----------default-----------------</p>
  14. <p>这是default剩下的内容1</p>
  15. <p>这是default剩下的内容2</p>
  16. </testSlot>
  1. //组件当前页面
  2. <slot>---默认内容---</slot>
  3. <h3>slot组件页面</h3>
  4. <slot name=\'header\'>---header的默认内容---</slot>
  5. <slot name=\'footer\'>---footer的默认内容---</slot>

结果:

vue---slot,slot-scoped,以及2.6版本之后插槽的用法

注意事项:

1) 引入组件的页面,如果是多个内容,需要用template 包裹起来,并且添加 slot 属性和 自定义值 。

2) slot 的值  需要和 组件中 <slot  name=\’xxx\’></slot>  name的值相对应。

3) 如果剩下的内容没有包裹起来并制定值的话,那么这些内容会被渲染到 组件中 所有的  <slot></slot> 所在的位置

4) 如果 slot 设置为default 和 name 设置为default,那就和没设置slot与name是一样的。

5) 和vue 2.6.0 以后的具名插槽相比 template上的 slot=\’xxx\’ 只需要 改成 v-slot : xxx 就行了,等号改成了冒号,并且值没有引号,带引号反而会报错。

6) 具名插槽只需要  name值 与  slot的值  对应 ,插槽的顺序是没有关系的。

 

3. slot-scope 作用域插槽。

这个的作用,主要就是当向组件发送的内容需要和组件的props属性的内容有联系时,才使用这个作用域插槽。简单点来说就是:可以使用 子组件的数据 和 父组件传过来的props的值

  1. //引入组件的页面
  2. <template>
  3. <div>
  4. <!--这里向组件传入props-->
  5. <slotScope :message=\'msg\'>
  6. <!--这里的thing是随便取的名称,不与任何地方对应-->
  7. <div slot=\'sayWhat\' slot-scope=\'thing\'>说了:{{thing.said}}</div>
  8. <!--这里的val也是随便取的名称,不与任何地方对应-->
  9. <template slot=\'listbox\' slot-scope=\'val\'>
  10. <p>{{val.send.text}}</p>
  11. </template>
  12. </slotScope>
  13. </div>
  14. </template>
  15.  
  16. <script>
  17. import slotScope from \'../components/slotScope\'
  18. export default{
  19. data () {
  20. return {
  21. msg: \'这是动态传入的slot的内容\',
  22. }
  23. },
  24. components:{slotScope }
  25. }
  26. </script>
  27.  
  28. <style>
  29. </style>
  1. //组件页面
  2. <template>
  3. <div>
  4. <!--这里最重要的是 :send=valuesend也是可以随便取的,表示要传过去的值-->
  5. <slot name=\'listbox\' v-for=\'value in list\' :send=\'value\'></slot>
  6. <!--这里最重要的是 :said=\'message\'said也是可以随便取的,表示要传过去的值-->
  7. <slot name=\'sayWhat\' :said=\'message\'></slot>
  8. <ul>
  9. <li v-for=\'item in list\' :key=\'item.id\'>{{item.text}}</li>
  10. </ul>
  11. </div>
  12. </template>
  13.  
  14. <script>
  15. export default {
  16. props:[\'message\'],
  17. data:function(){
  18. return {
  19. list:[{
  20. \"id\":10,
  21. \"text\":\"苹果\"
  22. },{
  23. \"id\":20,
  24. \"text\":\"香蕉\"
  25. },{
  26. \"id\":30,
  27. \"text\":\"\"
  28. },{
  29. \"id\":40,
  30. \"text\":\"芒果\"
  31. }]
  32. }
  33. }
  34. }
  35. </script>
  36.  
  37. <style>
  38. </style>

 结果:

vue---slot,slot-scoped,以及2.6版本之后插槽的用法

注意事项:

1) 作用域插槽主要是  使用子组件的任何数据  来达到自定义显示内容的目的

2) 作用域插槽最最最最最重要的一步,即是在<slot></slot> 上绑定数据 ,如果没有绑定数据,则父组件收到的,只是一个空对象{ }

3) 作用域插槽中 <slot></slot> 上绑定数据,可以是写死的,也可以是动态绑定的。如果是动态绑定的,则也需要 v-bind:xxx

4) 作用域插槽中 <slot></slot> 上绑定的数据 也可以一个定义好的有返回值的 mthods 方法。比如我定义了 <slot  what=\’say()\’></slot> ,然后say方法为: say:function(){  return  \’我说了\’ } 。最后得到的结果就是  \”我说了\”,当然,动态绑定一定要加 v-bind:xxx。

5) 当 <slot></slot> 绑定上数据之后,引用组件的地方 中  发送的内容就能通过 slot-scope 来获取。获取到的内容,就是一个对象,比如 <slot name=\’sayWhat\’ said=\’message\’></slot>   我这里绑定  said=\’message\’ 之后, 那边接收到的就是 { said:\”xxxx\”} 一个对象。

6) slot-scope 可以接收任何有效的可以出现在函数定义的参数位置上的 JavaScript 表达式。

 

vue 2.6.0之后   v-slot  只能用在 组件component 或者 template 上 ,用在 divp 这种标签上是会报错的

1. 具名插槽的变化

  1. <testSlot>
  2. <!--2.6.0以前的写法-->
  3. <template slot=\'header\'>
  4. <p>------------header----------------</p>
  5. <h3>这是header1的内容</h3>
  6. <p>这是header2的内容</p>
  7. </template>

  8. <!--2.6.0之后的写法-->
  9. <template v-slot:header>
  10. <p>------------header----------------</p>
  11. <h3>这是header1的内容</h3>
  12. <p>这是header2的内容</p>
  13. </template>
  14. </testSlot> 

1) slot=\’ xxx \’  改成了  v-slot : xxx  并且冒号后面这个名称不能打引号

2) 组件页面中slot的内容没有变化

3) 2.6.0 之后  具名插槽 v-slot:header  可以缩写为 #header  ,必须是有参数才能这样写!!! # = \”xxx \”  这样是不行的   #default = \’xxx\’ 这样才可以

 

2. 作用域插槽的变化

  1. <slotScope :message=\'msg\'>
  2. <!--2.6.0之前的写法-->
  3. <div slot=\'sayWhat\' slot-scope=\'thing\'>说了:{{thing.said}}</div>
  4. <template slot=\'listbox\' slot-scope=\'value\'>
  5. <p>{{value.send.text}}</p>
  6. </template>
  7.  
  8. <!--2.6.0之前的写法,不能单独用在html标签上-->
  9. <template v-slot:sayWhat=\'thing\'>
  10.   <div>说了:{{thing.said}}</div>
  11. </template>
  12. <template v-slot:listbox=\'value\'>
  13. <p>{{value.send.text}}</p>
  14. </template>
  15. </slotScope>

1) 两个属性合并成了一个  v-slot : 插槽名称 = \’ 传过来的值 \’ 。

2) 组件页面中slot的内容没有变化

3) v-slot 不能用在 html 标签上

4) 如果是默认插槽 可以写成  v-slot=\’xxx\’。

5) 还增加了  可以解构插槽props 和 设置默认值的内容,具体的可以查看官网 解构插槽

 

3. 新增的还有 动态插槽名

什么是动态插槽名?大致就是动态指令参数也可以用在v-slot上,这个就要涉及到2.6.0新增的  动态参数

  1. <template v-slot:[attrContent]=\'msg\'>
  2. xxx
  3. </template>

这个 attrContent  会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。 比如这里attrContent 最终的值为 default  则渲染出来的结果 就是 v-slot:default=\’msg\’ 。

注意:

1) 单独在 [ ] 方括号中也可以使用表达式,但是不能存在引号和空格

2) 当然 这个动态的值  可以通过 方法计算属性,或者 data数据 里面的内容。重要的是这个动态的值 是 引用组件的 作用域。简单点说就是父级组件的作用域。

例如,上面 v-slot:sayWhat=\’thing\’  可以写成:

1) v-slot:[first+sec]=\’thing\’    注意 加号两边不能留空格

2) v-slot:[attr]=\’thing\’

3) v-slot:[attrs]=\’thing\’

4) v-slot:[getattr()]=\’thing\’

  1. export default{
  2. data () {
  3. return {
  4. msg: \'这是动态传入的slot的内容\',
  5. attr:\'sayWhat\',
  6. first:\'say\',
  7. sec:\'What\',
  8. }
  9. },
  10. components:{ slotScope },
  11. computed:{
  12. attrs:function(){
  13. return \'sayWhat\'
  14. }
  15. },
  16. methods:{
  17. getattr(){
  18. return \'sayWhat\'
  19. }
  20. }
  21. }

 

到此,插槽的内容就介绍完毕了。^_^ Y 

站长资讯

Easydarwin加FFMPEG实现HLS流视频点播

2020-11-9 3:45:10

站长资讯

一文掌握 Linux 性能分析之网络篇

2020-11-9 3:45:12

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
私信列表
搜索