vue中插槽的本质是什么?

  • vue中slot插槽的本质是函数

    • 默认插槽: 一个名为default的函数

    • 命名插槽: 一个名为插槽名的函数

    • 作用域插槽: 一个带参数的函数

    声明一个带有插槽的组件Card

    • 正常写法
    xml 复制代码
    <template>
        <div>
            <slot name="title"/>
            <slot name="body"/>
            <slot :index="1" username="张三"/>
        </div>
    </template>
    • 下面这段代码和上面代码的作用是一样的, 每一个slot标签将来会编译成一个函数, 传递到组件内部.
      1. 没有name属性的slot会被编译为一个名为default的无参函数
      2. 有name属性的会被编译为一个以name属性值作为函数名的无参函数,
      3. 带有其他属性的slot标签会被编译为一个带参函数.
    xml 复制代码
    <script>
    import { h } from 'vue'
    export default {
        render() {
            // 在组件内部可以通过this.$slot获取插槽内容
            // 调用具名插槽函数
            const title = this.$slots.title()
            const body = this.$slots.body()
            // 调用默认作用域插槽函数
            const defaults = this.$slots.default({
                index: 1, username: '张三'
            })
            return h('div', {}, [
                defaults,
                title,
                body
            ])
        }
    }
    </script>

    调用一个带有插槽的组件Card

    xml 复制代码
    <template>
        <div>
            <Card>
                <!-- 会被编译为一个名为title的无参函数const title = ()=>{}, 传递给Card组件-->
                <template #title>
                    <h3>这是标题</h3>
                </template>
                <!-- 会被编译为一个名为body的无参函数const body = ()=>{}, 传递给Card组件-->
                <template #body>
                    <div>这是段落</div>
                </template>
                <!-- 会被编译为一个名为default的带参函数const default = (args)=>{}, 
                传递给Card组件-->
                <template v-slot="{ index, username }">
                    <div>{{ index }}-{{ username }}</div>
                </template>
            </Card>
        </div>
    </template>
    <script setup>
    import Card from './Card.vue'
    </script>
相关推荐
徐小夕1 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
前端Hardy2 小时前
别再无脑用 `JSON.parse()` 了!这个安全漏洞你可能每天都在触发
前端·javascript·vue.js
前端Hardy2 小时前
别再让 `console.log` 上线了!它正在悄悄拖垮你的生产系统
前端·javascript·vue.js
青青家的小灰灰2 小时前
从入门到精通:Vue3 ref vs reactive 最佳实践与底层原理
前端·vue.js·面试
OpenTiny社区2 小时前
我的新同事是个AI:支持skill后,它用TinyVue搭项目还挺溜!
前端·vue.js·ai编程
李剑一3 小时前
大屏天气展示太普通?视觉升级!用 Canvas 做动态天气遮罩,雷阵雨效果直接封神
前端·vue.js·canvas
本末倒置1833 小时前
面向 Vue 开发者的 Next.js 快速入门指南
前端·vue.js
滕青山3 小时前
文本字符数统计 在线工具核心JS实现
前端·javascript·vue.js
Fisschl3 小时前
在 Vue 中使用 remark 渲染 markdown
vue.js
SuperEugene3 小时前
Vue状态管理扫盲篇:状态管理中的常见坑 | 循环依赖、状态污染与调试技巧
前端·vue.js·面试