vue中插槽的本质

发布于:2024-06-13 ⋅ 阅读:(54) ⋅ 点赞:(0)

定义slotCompoent.vue 组件

<template>
    <slot></slot>
    <slot name='slot1'></slot>
    <slot name="slot2" msg="hello"></slot>
</template>

使用组件:

 <slotComponent>
        <p>默认的</p>
        <template #slot1>
          <p>具名插槽</p>
        </template>
        <template #slot2="{ msg }">
          {{ msg }}
        </template>
      </slotComponent>

import slotComponent from './slotComponent.vue'

我们可以将上面的使用插槽的看做成一个对象,属性对应着三个函数,其中函数的返回值就是代码写的标签生成的虚拟节点

// 伪代码

{
fucntion default (){}
fucntion slot1(){}
fucntion slot2({msg }){}

}

// 然后在定义插槽组件时相当于是在调用函数,函数的返回值就是对应的虚拟节点,最后渲染在页面上。
说明如下:

 	<slot></slot> // 相当于调用default函数,返回p元素
    <slot name='slot1'></slot> // 调用slot1函数,返回p元素
    <slot name="slot2" msg="hello"></slot> // 调用slot2函数,并传递了参数msg。

我们也可以验证一下使用插槽时传递的值是不是函数。

方式如下:
定义一个js文件:

//ComTwo.js

import { createElementVNode } from 'vue'
export default  {
    setup(props, { slots }){
        console.log('slots.defaults',slots); // 看一下打印的值
        return()=>{
            return createElementVNode('div',null,[]); // 创建一个虚拟节点
        }
    }
}

// 使用组件

 <ComTwo>
        <p>默认的</p>
        <template #slot1>
          <p>具名插槽</p>
        </template>
        <template #slot2="{ msg }">
          {{ msg }}

        </template>
      </ComTwo>

import ComTwo from './ComTwo.js'

我们发现ComTwo中打印的值如下:
在这里插入图片描述
我们发现传递的就是一个对象,展开三个属性,每个属性名对应插槽的名字,属性值是函数。返回值是对应的节点。


网站公告

今日签到

点亮在社区的每一天
去签到