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

Vue&Bootstrap结合学习笔记(二)

时间:2023-03-30 23:27:08 CSS

这篇文章主要讲述了我在学习Vue和Bootstrap过程中遇到的关于槽的问题和解决方法。关于namedslots和slotscopes的解释我就不重复了,占篇幅。这里我简单谈谈我的个人看法。插槽是保留位置。槽其实就是定义组件时预留的一些位置。在使用组件时,将组件中一些额外的标签写入相应的预留位置,就是槽的作用。Slots适合内容不固定的组件,正是因为无法预见组件内部所有可能的标签或内容,所以干脆留个空位给用户想填什么就填什么。命名槽适用于具有一定结构和多个不固定内容的组件。这时候在定义组件的时候,其实是预留了多个空位,分别命名(如果只有一个,当然也可以使用namedslots,但是肯定不如defaultslot,只会增加配置成本).然后将内容分成多个块,命名为使用时预留空位的名称。组件理解为什么要定义组件?答:定义组件是一种封装形式,用最简单的标签和属性配置来表达一大段比较丰富的结构效果和一些数据和事件。Bootstrapcomponent-Collapse(Accordionexample)官网HTML代码可折叠组项目#1

心是成对的陈词滥调会批判,为了同样的上流生活我们指责terryrichardson要鱿鱼。3wolfmoonservices,但不是skateboardsmartbrunch的愿望。快餐车藜麦不知道这样的零食。Brunch3wolfmoon时间,有someputabirdonitsincedirectcoffeenoassumptionshoreditch和。别管瑞士凯菲耶,他们不懂精酿啤酒,韦斯·安德森信条他们将以虔诚的方式前行。素食主义者例外屠夫转lomo。黑色紧身裤、精酿啤酒、从农场到餐桌、生牛仔布、美学合成物,你可能没有听说过它们,我们归咎于可持续劳动VHS。
可折叠组项目#2思想准备批评陈词滥调,对于如此高尚的生活,我们指责鱿鱼的特里理查森。3wolfmoonservices,但不是skateboardsmartbrunch的愿望。快餐车藜麦不知道这样的零食。早午餐3wolfmoontempor,suntaliqua在上面放了一只鸟鱿鱼单源咖啡nullaassumendashoreditch等。Nihilanimkeffiyehhelvetica,精酿啤酒laborewesandersoncrednesciuntsapienteeaproident。Adveganexcepteurbutchervicelomo。Leggingsoccaecat精酿啤酒从农场到餐桌,原始牛仔布审美合成器你可能没有听说过它们可持续VHS。可折叠组项目#3动画参数c荔枝会骂,为了同样的上流生活我们指责terryrichardsonsquid。3wolfmoonservices,但不是skateboardsmartbrunch的愿望。快餐车藜麦不知道这样的零食。没有shoreditch和的假设。他们不关心瑞士头巾、精酿啤酒、韦斯·安德森的信誉,他们不知道如何明智地去做。素食主义者例外屠夫转lomo。紧身裤深色精酿啤酒从农场到餐桌,原始牛仔布美学和合成器,他巧妙地为您提供服务,我们收取可持续劳动力VHS。示例代码结构比较长,很有规律,很容易找到几个常见的结构:card,card-header,card-body...copywriting是具体的显示信息,也是我们希望组件配置的最精简的组件配置Animpariatur...灵魂诞生了……Animpariatur...Header一般文字就够了,所以直接在label属性上配置内容,比如'Animpariatur...'我们想象它可能是一个或多个其他组件甚至是一大段html(带标签),此时放在属性中是不合适的。配置超级麻烦。可以看出在data中的一个数组中使用v-for命令可以轻松渲染,获取内容并不容易。$children是一个虚拟DOM,没有找到将其逆向成html的API;而且,即使找到了,也会像header一样通过遍历和渲染来渲染,只不过只会渲染成字符串。使用v-html指令,标准的HTML标签确实没有被渲染,但是定义的组件标签无法正确解析渲染(不知道Vue有没有对应的API方法解决)。slot只能解决content中的标签解析问题,但是会将所有内容(上例中的3个div)一起解析,无法拆分namedslot可以解决内容无法拆分的问题。然后我们将用名称标记每个内容。name的取值必须满足内容个数不定的条件,所以最好使用与序号相关的,在v-for命令中匹配即可。问题解决!组件定义Vue.component('widget-collapse',{template:`
{{item.header}}
`,data(){letchildren=this.$slots,items=[];for(letiinchildren){letnode=children[i][0];if(node.tag){项目[i]=({header:VTool.attr(node,'header')||('Item'+items.length),})}}return{vitems:items}}})组件使用Animpariatur...Animpariatur...Animpariatur...当组件优化是used为每个节点写一个slot太麻烦,而且容易出错。删除节点或调整节点顺序很麻烦。程序可以动态添加slot属性吗?答:没有找到对应的API,但是对比default和namedslots的$slots数据对象,发现key为default和namedname分别动态增加$slots属性Vue.component('widget-collapse',{template:`
{{item.header}}
`,data(){让孩子=this.$slots.default,items=[];for(leti=0,len=children.length;iAnimpariatur...Animpariatur...Animpariatur...同步更新上面的设置基本初始化没问题,但是vue对象更新时$slots对象会发生变化(找到updateChildComponent通过跟踪代码方法在更新下层组件时执行vm.$slots=resolveSlots(renderChildren,parentVnode.context);覆盖之前收缩过的$slots,会在vm._render方法中重新渲染,并且在事件之前没有宣布任何东西,然后暴力覆盖和重写)Vue.component('widget-collapse',{...created(){let_render=this._render;this._render=function(){let$slots=this.$slots;for(letnamein$slots){if(name!=='default'){return_render.apply(this,arguments);}}//这时候肯定是一个新的$slots,改写对应关系letchildren=this.$slots.default,items=[];for(leti=0,len=children.length;i