详谈vue-slot与slot-scope

什么是插槽

插槽就是子组件提供给父组件使用的一个占位符,用<slot></slot>表示,父组件可以在这个占位符中填充任何模板代码,如 HTML、组件等,填充的内容会替换子组件的<slot></slot>标签。

插槽分类

  1. 单个插槽(匿名插槽)

    单个插槽可以放置在组件的任意位置,但是就像它的名字一 样,一个组件中只能有一个该类插槽

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

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

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

//父组件
<template>
  <div class="parent">
   <h3>我是父组件</h3>
    <child>  <!--子组件 -->
       <ul>  <!--因为在child子组件中定义了一个<slot></slot> ul中的内容就会显示到插槽中 -->
        <li>选项一</li>
        <li>选项二</li>
        <li>选项三</li>
        </ul>
    </child> 
  </div>
</template>
 
<script>
import child from './child.vue'
export default {
  name: 'parent',
  data() { 
    return {
 
    }
  },
  components:{
      child
  }
 }
</script> 
<style scoped>
.parent{
    margin-left: 100px;
    width: 200px;
    background: lightblue;
    margin-top: 20px;
}
</style>
//子组件
<template>
  <div class="child">
    <h3>这里是子组件</h3>
    <slot></slot>  <!--插槽-->
  </div>
</template>
 
<script>
export default {
  name: 'child',
  data() { 
    return {
 
    }
  }
 }
</script>
 
<style scoped>
 
</style>

渲染结果:
在这里插入图片描述
2. 具名插槽

简单来说,就是带有name属性的插槽,具名的插槽可以在组件中出现多次,而之前的匿名插槽只能出现一次。

  • 引入组件的页面,如果是多个内容,需要用template包裹起来,并且添加 slot 属性和自定义值 。
  • slot 的值需要和组件中 <slot name='xxx'></slot> name的值相对应。
  • 如果 slot 设置为default 和 name 设置为default,那就和没设置slot与name是一样的。
//父组件
<template>
  <div>
    <Slot>
      <!-- 具名插槽 -->
        <!--2.6.0以前的写法-->
     //<p style="color:red" slot=header>在首页写入二内容</p>
       <!--2.6.0之后的写法-->
     <!--<template v-slot:header>
         <p>新写法</p> 
      </template> -->
      <template #header>
        <p>第二种新写法</p>
      </template>
      <p style="color:red" slot="main">在首页写入三内容</p>
      <p style="color:red" slot="footer">在首页写入一内容</p> 
    </Slot>
  </div>
</template>

<script>
import Slot from './Slot.vue'
export default {
  components:{
    Slot
  },
  data(){
    return {
    }
  }
}
</script>

//子组件
<template>
  <div>
    子组件包含三个插槽
    <!-- 具名插槽,header、footer、main -->
    <slot name="header"></slot>
    <slot name="main"></slot>
    <slot name="footer"></slot>
  </div>
</template>

<script>
export default {
  // name:'slotTwo',
  data(){
    return {
    }
  },
}
</script>

渲染效果:
在这里插入图片描述
3. 作用域插槽

  • 作用域插槽主要是使用子组件的任何数据来达到自定义显示内容的目的
  • 作用域插槽最最最最最重要的一步,即是在<slot></slot>上绑定数据 ,如果没有绑定数据,则父组件收到的,只是一个空对象{ }。
  • 作用域插槽中 <slot></slot>上绑定数据,可以是写死的,也可以是动态绑定的。如果是动态绑定的,则需要 v-bind:xxx
  • 作用域插槽中 <slot></slot>上绑定的数据也可以传一个定义好的有返回值的 methods 方法。
  • 当绑定上数据之后,引用组件的地方就能通过 slot-scope来获取。获取到的内容,就是一个对象。
  • slot-scope可以接收任何有效的可以出现在函数定义的参数位置上的JavaScript 表达式
//子组件
<template>
  <div>
    <!-- 作用域插槽 -->
    <!-- 子组件使用:data绑定需要的值 -->
    <slot  name="myUser" :data="user"></slot>
	//绑定一个Methods
	<slot name="msg" :Msg='message()'></slot>
  </div>
</template>

<script>
export default {
  data(){
    return {
      user:[
        {name:'jack',age:18},
        {name:'tom',age:19},
        {name:'jerry',age:20}
      ],
      message:function(){
        return 'hello world'
      }
    }
  },
}
</script>
//父组件
<template>
  <div>
    <Slot>
      <!-- 作用域插槽 -->
      <!-- 父组件使用slot-scope,user.data就是子组件传过来的值 -->
        <!-- 2.6.0之前的写法 -->
      <!-- <template slot="myUser" slot-scope="user"> 
        <p v-for="(item,index) in user.data" :key="index">
          {{item}}
        </p>
      </template> -->
      <!-- 2.6.0之后的写法 -->
       <template v-slot:myUser='user'> 
        <p v-for="(item,index) in user.data" :key="index">
          {{item}}
        </p>
        //接受methods的插槽
      <template slot='msg' slot-scope="message">
         {{message.Msg}}
      </template>
    </Slot>
  </div>
</template>

<script>
import Slot from './Slot.vue'
export default {
  components:{
    Slot
  },
  data(){
    return {
    }
  }
}
</script>

渲染效果:
在这里插入图片描述
2.6版本之后新用法

  1. 具名插槽
  • slot=’ xxx '改成了 v-slot : xxx 并且冒号后面的名称不带引号
  • 组件页面中slot的内容没有变化
  • 2.6.0 之后具名插槽v-slot:header可以缩写为#header
  1. 作用域插槽
  • 两个属性合并成了一个 v-slot : 插槽名称 = ’ 要传的数据 ’ 。

  • 组件页面中slot的内容没有变化 。

  • v-slot 不能用在 html 标签上 。

  • 如果是默认插槽 可以写成 v-slot=‘xxx’。

      提示:*以上新用法在上面代码中有展示*
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue的slot-scope是一个用于在父组件中传递数据给子组件的特殊属性。它允许你在父组件中定义一个插槽,并将数据传递给子组件来使用。 使用slot-scope的一般步骤如下: 1. 在父组件中定义一个插槽,并使用slot-scope属性指定一个变量名。例如: ```html <template> <div> <slot :item="item"></slot> </div> </template> ``` 在这个例子中,我们使用:item="item"将变量item传递给插槽。 2. 在子组件中使用插槽,并在插槽的内容中使用slot-scope指定的变量名。例如: ```html <template> <div> <slot-scope="props"> <p>{{ props.item }}</p> </slot-scope> </div> </template> ``` 在这个例子中,我们使用slot-scope="props"将传递给插槽的变量名设置为props,并在插槽的内容中使用props.item来访问传递的数据。 3. 在父组件中使用子组件,并在子组件标签中传递数据给插槽。例如: ```html <template> <div> <child-component> <template v-slot:item="{ item }"> <p>{{ item }}</p> </template> </child-component> </div> </template> ``` 在这个例子中,我们使用v-slot:item="{ item }"将插槽中的变量名设置为item,并在插槽的内容中使用item来访问传递给子组件的数据。 通过使用slot-scope,我们可以在父组件中传递任意类型的数据给子组件,并在子组件中使用这些数据进行渲染或其他操作。这种机制为组件之间的数据交互提供了一种灵活且强大的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值