文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue.slot原理及slot是如何实现的

2023-06-30 12:21

关注

本篇内容介绍了“Vue.slot原理及slot是如何实现的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、回顾 slot 用法

1. 默认插槽

<!-- 子组件 --><template>  <div class="wrapper">    <!-- 默认插槽 -->    <div class="main">      <slot></slot>    </div></template><!-- 父组件 --><my-slot>  <template>    <h2>默认插槽</h2>  </template></my-slot>

页面展示效果如图:

Vue.slot原理及slot是如何实现的

2. 具名插槽

接着上述的案例,添加具名插槽 header ,代码如下:

<!-- 子组件 --><template>  <div class="wrapper">    <!-- header 具名插槽 -->    <header class="header">      <slot name="header"></slot>    </header>    <!-- 默认插槽 -->    <div class="main">      <slot></slot>    </div></template><!-- 父组件 --><my-slot>  <template v-slot:header>    <h2>header 具名插槽</h2>  </template>  <template>    <h2>默认插槽</h2>  </template></my-slot>

如上代码块可以发现:

页面展示效果如图:

Vue.slot原理及slot是如何实现的

3. 作用域插槽(slot-scope)

再接着上述案例,添加作用域插槽 footer ,代码如下

<!-- 子组件 --><template>  <div class="wrapper">    <!-- header 具名插槽 -->    <header class="header">      <slot name="header"></slot>    </header>    <!-- 默认插槽 -->    <div class="main">      <slot></slot>    </div>    <!-- footer 具名 + 作用域插槽 -->    <footer class="footer">      <slot name="footer" :footerInfo="footerInfo"></slot>    </footer>  </div></template><script>export default {  name: "mySlot",  data () {    return {      footerInfo: {        text: '这是 子组件 footer插槽 的作用域数据'      }    }  }}</script><!-- 父组件 --><my-slot>  <template v-slot:header>    <h2>header 具名插槽</h2>  </template>  <template>    <h2>默认插槽</h2>  </template>  <template v-slot:footer="slotProps">    <h2>footer 具名 + 作用域插槽</h2>    <p>{{ slotProps.footerInfo.text }}</p>  </template></my-slot>

如上代码块可以发现:

页面展示效果如图:

Vue.slot原理及slot是如何实现的

好了,简单回顾完用法后,笔者在这里先提三个问题:

  1. 普通插槽、 作用域插槽 的 vNode 是在哪个环节生成的,render 父组件时还是子组件时?

  2. 作用域插槽 为什么能在父组件访问到子组件的数据?

  3. 普通插槽 跟 作用域插槽 在实现上有区别吗?

我们带着疑问接着往下看!

二、不同slot的编译区别

我们根据上述最终的案例代码,执行一下打包命令,看看 Vue 在编译模板的时候,是怎么处理我们的 slot 的!事不宜迟,赶紧 build 一哈~(偷偷告诉大?,Vue 处理 作用域插槽普通插槽 的差异就是从编译开始的,也就是 render函数 会有所不同)

这里笔者顺便使用 v2.5 的具名插槽写法给大?参照一下(对具名插槽header做改写,使用 slot="header" 的写法),大家可以看下 v2.6v2.5 具名插槽的 写法、实现 上的区别~反正也不难,也就顺便带出来看看了

Vue.slot原理及slot是如何实现的

上图左边是 v2.6 、右边是 v2.5 的,这里,我们集中关注:

其实根据上述编译后的结果,我们不妨这样猜测

这里放出具体的 作用域插槽 打包后代码,大家一看就很清晰了:

{  scopedSlots: t._u([    {      key: "footer",       // 函数接收了一个参数n          fn: function (n) {        return [          // h2 标签的 render 函数          e("h2", [t._v("footer 具名 + 作用域插槽")]),           // p 标签的 render 函数,这里可以看到编译后是:n.footerInfo.text          e("p", [t._v(t._s(n.footerInfo.text))])        ]      }    }  ])}

三、slot实现原理

1. 断点调试

为了方便大家看调试结果,当前项目的组件结构主要是这样,有三大层:

Vue -> <App /> -> <my-slot />

这里笔者在运行时代码 initRender()renderSlot() 中,打上 debugger ,直接带大火看看执行流程。这里简单介绍下两个方法:

接下来直接看实验截图:

先是进入initRender()(这里跳过初始化 大VueApp 的过程)。直接到初始化 my-slot组件 过程。【 简单解释:由于 App组件 执行 render 得到 App组件vNode ,在 patch 过程中 遇到 vue-component-my-slot 的 vNode ,又执行 my-slot组件 的 初始化流程。】

Vue.slot原理及slot是如何实现的

Vue.slot原理及slot是如何实现的

再是进入 renderSlot()。接着上面继续单步执行,会走到 renderSlot 中。这时候,已经进入到 my-slot组件render 阶段了。回顾第一步中,此时我们手握 默认插槽的vNode,并存在 vm.$slot.default

header插槽

Vue.slot原理及slot是如何实现的

Vue.slot原理及slot是如何实现的

Vue.slot原理及slot是如何实现的

默认插槽

Vue.slot原理及slot是如何实现的

Vue.slot原理及slot是如何实现的

作用域插槽

Vue.slot原理及slot是如何实现的

2. 总结插槽实现原理

其实上面的流程只是论证过程,大家不可以不必深陷其中。笔者在这里直接根据实践过程,给大伙总结出结论!也就是要回到我们一开始的三个问题!

普通插槽、 作用域插槽 的 vNode 是在哪个环节生成的,render 父组件时还是子组件时?

作用域插槽 为什么能在父组件访问到子组件的数据?

普通插槽 跟 作用域插槽 在实现上有区别吗?

“Vue.slot原理及slot是如何实现的”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯