slot插槽的使用

slot翻译为插槽,子组件中有一部分内容可以根据父组件传过来的dom进行显示,用slot标签表示;父组件可以在这个占位符中填充内容。
若是子组件中没有slot,则父组件传给它的任何内容都不显示!

1.匿名插槽

父组件传递到子组件的内容需要子组件用slot来占位置

<!-- 父组件 -->
<template>
    <div>
        <Child>
            <div>3.8女神节!</div>
        </Child>
    </div>
</template>
<!-- 子组件 -->
<template>
    <div>
        <h1>今天的节日是:</h1>
        <slot></slot>
    </div>
</template>

在这里插入图片描述

2.具名插槽

子组件中name的名字与父组件中slot的值相对应

<!-- 父组件 -->
<template>
  <div>
    <Child>
       <div slot="child">今天你真的好美!</div>
       <!-- 或者写v-slot,但只能写在template上, vue3.0语法-->
       <template v-slot:child>今天你真的好美!</template>
    </Child>
  </div>
</template>
<!-- 子组件 -->
<template>
    <div>
       <slot name="child"></slot>
    </div>
</template>

在这里插入图片描述

3.作用域插槽

slot-scope实现了父组件获取子组件的数据进行展示
props是个变量,可以随便取,但不能取关键字

<Child>
  <template slot-scope="slotProps">
    {{ slotProps.msg }}
  </template>
</Child>

slot-scope 也可以直接用于非 template 元素 (包括组件):

<Child>
  <span slot-scope="slotProps">
    {{ slotProps.msg }}
  </span>
</Child>

slot-scope中也可以使用解构赋值

<Child>
  <span slot-scope="{ msg }">
    {{ msg }}
  </span>
</Child>
<!-- 父组件 -->
<template>
    <Child>
        <template slot='child' slot-scope="props">
            <li>{{props.option}}</li>
        </template>
    </Child>
</template>
<!-- 子组件 -->
<template>
    <div>
        <slot name='child' :option="item.option" v-for="item in options">
        </slot>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                options: [
                    {
                        option: "男",
                        num: "28",
                    },
                    {
                        option: "女",
                        num: "30",
                    },
                ],
            }
        }
    }
</script>

props里存放的是数组里每一项的option ,通过:option="item.option"来传递
在这里插入图片描述
当我们看到这个是不是有似曾相似的感觉

<el-table-column label="跳转至">
  <template slot-scope="props">
    <!-- {{$log(props)}} -->
    <el-select v-model="props.row.jumpTo" placeholder="请选择">
      <el-option
        v-for="item in optionArray"
        :key="item.id"
        :label="item.label"
        :value="item.id"
      >
      </el-option>
    </el-select>
  </template>
</el-table-column>

我们把上面的具名插槽改为匿名插槽就可以了

<!-- 父组件 -->
<Child>
   <template  slot-scope="props">
       <li>{{props.option}}</li>
   </template>
</Child>
<!-- 子组件 -->
<slot :option="item.option" v-for="item in options"></slot>

4.判断是否使用了插槽

4.1匿名插槽
<div v-if="$slots.default">
      <slot></slot>
</div>
4.2具名插槽
<div v-if="$slots.footer">
      <slot name="footer"></slot>
 </div>
4.3作用域插槽
<div slot-scope="scope" v-if="$scopedSlots.default">
      <slot :scope="scope"></slot>
</div>
五.总结

匿名插槽和具名插槽实现父=>子传递内容
作用域插槽实现了子=>父传递内容

更多请参考插槽

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值