当前位置: 首页 > Web前端 > HTML

vuejs中的默认插槽-具名插槽-作用域插槽三者的比较

时间:2023-03-28 01:45:35 HTML

vuejs中默认槽的比较——命名槽——作用域槽在使用槽的时候,使用槽是非常方便的。一定程度上可以减少模板中大量逻辑判断的使用,控制不能显示的内容,也可以让代码组织结构更加清晰。虽然使用起来简单,但是插件中的一些插槽不太好理解,不是很直观。它允许父组件在子组件的指定位置插入一个html结构。它是自由灵活的,也是组件之间的一种通信方式。有defaultslots,namedslotsandtherearescopedslots当你使用element-ui表单时,虽然你知道如何使用它,表头,内容模板的渲染,你会用到slot,但是它经常非常混乱,因为它在今天是抽象的。起来学习。学完之后,大家在看element-ui表单的时候,希望能给大家带来一些启发。下次再用的时候,你就能更上一层楼了。视频讲解-见b站-defaultslot视频讲解-见b站-namedslot视频讲解-见b站-scopeslotdefaultslot官方文档介绍:Vue实现了一套内容分发API,这套API的设计灵感来自WebComponents规范草案,将元素理解为承载分布式内容的出口并不容易。也就是说,可以作为元素标签的占位符,可以将父组件引用的组件中的html标签内容引入到App组件中,如下例所示。SlotBase.vue组件在写SlotBase.vue组件时,引入slot标签,如下图.wrap{display:flex;证明内容:居中;}.list{宽度:400px;高度:200px;边框:1px纯红色;margin-right:10px;}子组件中的标签为槽位,替换父组件中的

默认内容

如果插入html模板父组件的自定义标签,并且不在子组件中使用槽,则在父组件中插入的标签内容不会被插入。现在你知道插槽是什么了吧,你可以在component标签中定义需要的内容。通过插槽在组件内部添加到组件中的元素就像一个入口,即所谓的插槽,它提供了内容的入口,也决定了内容的位置。component标签中定义的内容,通过这个“入口”可以添加到组件里面的“插件”槽中,就是component标签中的内容。插槽中的“插槽”是组件中的元素。当没有元素时,组件标签中的内容将不会被渲染。当是defaultslot时,我们可以用template标签把它包起来,在上面加上v-slot:default属性,代表默认slot

defaultcontent

命名插件如果想把不合理的内容放到不合理的位置,那么默认槽是做不到的。顾名思义,命名slot就是给slot定义一个名称,让每一个不合理的模板对应不合理的名称。在组件中插入的模板属性中添加v-slot:槽名,在子组件中添加name属性。需要注意的是,name的值需要和v-slot的值保持一一对应,否则达不到我们预期的效果,如下面的示例代码所示:App父组件

我是直播卖酒-content

我是直播打赏-content

而在子组件中,slotBase.vue.wrap{display:flex;证明内容:居中;}.list{宽度:400px;高度:200px;边框:1px纯红色;right:10px;}上面我使用了一个v-if条件渲染表达式,我们可以根据一些条件来控制元素上方命名槽的显示和隐藏,在父组件中v-slot:content可以简写作为#content,当我们看到这个缩写时当你知道它也是槽的具体名称时,它与v-on和v-bind一样,v-slot还有一个缩写,就是把参数(v-slot:)之前的所有内容替换成人物#比如v-slot:header可以改写成#header如果不理解,对简写slotname有点陌生从上面的例子我们可以得出一些结论namedslots可以根据name来渲染没有定义名称的html标签模板内容的内容将统一由默认槽渲染。默认插槽实际上是一个名为default的命名插槽。父组件中槽的内容可以是模板html标签元素,也可以是组件。注意这个v-slot只能用在旧版本的模板标签上。在父组件上使用v-slot:插槽名称。这是vue2.6.0之后的写法。在vue2.6.0之前,可以在模板上使用slot="slot""ScopedSlot"这个名字,相比DefaultSlot、NamedSlot、ScopeSlot,有点难理解。,可能会更好有时,允许插槽内容访问仅在子组件中可用的数据是有用的。插槽中内容的流动方向是从组件标签到组件内部,而作用域插槽允许作用域反转。流程,从组件内部到组件标签,可以在组件标签中访问组件内部的变量,也就是说,在父组件的模板中,如何获取子组件传过来的数据,以及子组件(插入Slot)内部定义的数据,如何传递给父组件,即数据可以通过scopeslot传递。我们在slotBase.vue组件中定义了一个数据消息msg.wrap{display:flex;证明内容:居中;}.list{宽度:400px;高度:200px;边框:1px纯红色;margin-right:10px;}在上面的代码中,msg属性被绑定到slot元素上。这个属性叫做slotprop。那么在父作用域中,应该如何接收子组件传过来的数据呢?在v2.6.0中,使用了v-slot:slotname="slotProps",其中slotProps任意定义,name任意。代码如下:{{slotProps.msg}}//也可以缩写为#slotname="propertyProps"{{slotProps.msg}}和老版本也可以这样写{{slotProps.msg}}新版本不能和vue2.6.0以下版本混用注意那这个过时的语法在vue3.0就不会出现了,所以还是用最新的写法吧,但是一些老的vue2.0项目,老版本的写法,以上是理解的默认槽,命名槽,使用scopedslots,slots是一个非常强大的功能,在复用组件的时候对于结构的复用和精简代码非常有用,如果你做过那种后台cms管理系统,对于窗体弹窗有很多种不同的类型,以及在表单弹窗中,有时需要根据后台返回的界面props显示指定的内容,这时候,插槽非常有用。exclusivedefaultslotwhentheprovidedcontent的缩写只有在使用默认槽时,组件的标签才能作为槽的模板我们可以直接在组件上使用v-slot

{{slotProps.user}}

也可以简化就像假设未指定的内容对应默认插槽一样,假设没有参数的v-slot对应默认插槽

{{slotProps.user}}

需要注意的是下面的写法是不允许的。v-slot用于自定义标签组件时,不能缩写。命名插槽必须在自定义元素上使用“:::只要有多个slot,所有slot都使用完整的基于模板的语法,即在模板标签{{slotProps.user.firstName}}...总结以上这一段内容,slot是一个很强大的特性,子组件内部默认使用slot发生,并且在父组件中,使用html标签,或者如果组件在子组件中使用了多个插槽,则使用命名插槽来区分每个插槽,并且子组件,并在父组件中使用模板标签,其中v-slot有缩写#slotname,可以用在特定的标签上,但是当有多个插槽时,它只能用在模板标签上。当父组件要获取子组件中的数据时,子组件如何将内部数据传递给外部组件呢?going呢,在子组件中,在slotslotprops中传递给父组件,在父组件中,通过v-slot接收:slotname="slotProps",这个slotProps是一个集合对象,这是接收子组件props的作用域槽,也是父子组件传递数据的一种方式