Vue.js组件中的slot 内容分发详解

简介: Vue.js组件中的slot 内容分发详解

学习是一个过程,记录下来,方便学习。之前做vue项目,很少用到其组件的Slot,以至于无法了解他的精髓,今天项目需要组件的自定义,需要用到Slot,也就认真的看了下vue里关于solt的一些知识点,总结一下。

1、Slot分发内容是干什么的?

简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示,就是Slot分发负责的活。

2、Slot分发小实例?

如下代码:

<div id="app">  
    <my-component>
        <span>这个是html内容</span>  //这行代码在页面里是无法渲染出来的,因为他放在了组件里面
    </my-component>
</div>  
<script>  
    var vm = new Vue({  
        el: '#app',  
        components: {  
            myComponent: {  
                template: "<div>这是个测试作用范围的文本</div>"  
            }  
        }  
    });  
</script>

上面的代码在浏览器中渲染出来是:““这是个测试作用范围的文本””这几个字,而不会显示“<span>这个是html内容</span> ”这行内容。因为默认情况下:父组件在子组件内套的内容,是不显示的。

但是如果我们想让 “这个是html内容”这个几个字显示该怎么写呢?那就试试slot吧,如下代码:

<div id="app">  
    <my-component>
        <span>这个是html内容</span>  //这行代码在页面里是无法渲染出来的,因为他放在了组件里面
    </my-component>
</div>  
<script>  
    var vm = new Vue({  
        el: '#app',  
        components: {  
            myComponent: {  
                template: "<div><slot></slot>这是个测试作用范围的文本</div>"  
            }  
        }  
    });  
</script>

上面的代码在浏览器中渲染的结果是:“这个是html内容这是个测试作用范围的文本”。当然了,我们slot写在哪里,其对应的内容显示在哪里。

如果上边的 template:写成 "<div>这是个测试作用范围的文本<slot></slot></div>"

那么渲染的结果是:“这是个测试作用范围的文本这个是html内容”。

3、具名slot

slot元素可以用一个特殊的属性name 来配置如何分发内容,多个slot可以有不用的名字,根据具名slot的name来进行匹配,显示内容。如下代码:

<div id="app">  
        <my-component>
            <span slot="first">111</span>  
            <span slot="second">222</span> 
       </my-component>
    </div>  
    <script>  
        var vm = new Vue({  
            el: '#app',  
            components: {  
                myComponent: {   
                    template: "<div><slot name='first'></slot>为了明确作用范围<slot name='second'></slot></div>"  
                }  
            }  
        });  
    </script>

上面的代码渲染的结果是:“111为了明确作用范围222”。

4、需要注意:分发内容的作用域

<div id="app">  
        <my-component>
            <span slot="first" @click="getText">111</span>  
            <span slot="second">222</span> 
       </my-component>
    </div>  
    <script>  
        var vm = new Vue({  
            el: '#app',  
            methods:{
                  getText:function(){
                       alert("111")
                  } 
            },
            components: {  
                myComponent: {   
                    template: "<button><slot name='first'></slot>为了明确作用范围<slot name='second'></slot></button>"  
                }  
            }  
        });  
    </script>

上面代码,如果我点击111(而不是按钮button全部),会触发父层的函数getText,弹出“111”。如果点击其他部分则不会有反应。为什么呢? 官方教程是这么说的:父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。

5、需要注意:当没有分发内容时的提示

假如父组件没有在子组件中放置有标签,或者是父组件在子组件中放置标签,但有slot属性,而子组件中没有该slot属性的标签。那么,子组件的slot标签,将不会起到任何作用,除非,该slot标签内有内容,那么在无分发内容的时候,会显示该slot标签内的内容。

上面这句话怎么理解呢?看下边代码。

<div id="app">  
        <my-component>
            <h1 slot="first">111</h1>  
       </my-component>
    </div>  
    <script>  
        var vm = new Vue({  
            el: '#app',  
            methods:{
                  getText:function(){
                       alert("111")
                  } 
            },
            components: {  
                myComponent: {   
                    template: "<div><slot name='first'>3333</slot>为了明确作用范围<slot name='second'></slot></div>"  
                }  
            }  
        });  
    </script>

上面的代码渲染结果:“111为了明确作用范围”。为啥会是这样呢?

子组件里<slot name='first'>3333</slot>这个的name属性first可以在父组件里找到对应的值,所以会显示父组件的值111,而忽略自身内部的3333。

而<slot name='second'></slot>没有在父组件里找到slot="second"的标签内容,所以会被忽略,不显示任何内容(这种情况下,如果是 template: "<div><slot name='first'>3333</slot>为了明确作用范围<slot name='second'>444</slot></div>"  ,那么就会渲染出 “111为了明确作用范围444”)。

6、slot的应用场景举例

(1、)

比如你自己做了个一个button组件,在根组件里注册为vButton,从而复用。

那么各个button上的文字肯定是不同的,但是这些文字大部分情况下也是不需要动态更新的,那么就不必用props之类的方法从根组件向子组件传递文字,直接用slot即可。

<template>
  <button>
    <slot></slot>
  </button>
</template>

根组件就可以这样用它:

<v-button>我是按钮111</v-button>,<v-button>我是按钮222</v-button>这样就会显示2个不同的按钮

这是最简单的一个用法示例。是不是觉得很方便,,,,哈哈哈。

再说一句吧:通常情况下,子组件的内容只能在子组件中定义。但是通过 slot,父组件定的内容可以传到子组件中去。总之慢慢摸索其中的精髓吧,开着小坦克,突突突.....

相关文章
|
18天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
152 2
|
4月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
584 0
|
6月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
783 4
|
4月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
4月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件的实现代码:支持自定义表情库、快捷键发送和输入框联动的聊天表情解决方案
本文详细介绍了在 Vue 项目中实现一个功能完善、交互友好的表情包输入组件的方法,并提供了具体的应用实例。组件设计包含表情分类展示、响应式布局、与输入框的交互及样式定制等功能。通过核心技术实现,如将表情插入输入框光标位置和点击外部关闭选择器,确保用户体验流畅。同时探讨了性能优化策略,如懒加载和虚拟滚动,以及扩展性方案,如自定义主题和国际化支持。最终,展示了如何在聊天界面中集成该组件,为用户提供丰富的表情输入体验。
334 8
|
4月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
215 1
|
4月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
141 0
|
6月前
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
425 6
|
11月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
243 64
|
11月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
353 64

热门文章

最新文章