第三十八篇 Vue中封装Swiper组件 2.0

news2025/2/25 15:55:37

         上一篇内容讲到封装Swiper组件的一个过程,如果是静态的数据封装组件初始化在mounted当中并无多大影响,但是这样封装的组件复用性较低或者可能只使用一次,那么在动态使用通过ajax请求数据需要面临的是swiper初始化过早的问题,在mounted生命周期中初始化会导致swiper组件的创建完成但swiper中的轮播数据还未准备好造成swiper没法轮播起来,而在updated当中做swiper的初始化能够使swiper的轮播能够正常进行,但存在的问题一旦data数据中的状态改变会引起updated中的swiper初始化重复执行,具有一定隐患,所以在updated当中是不能够进行swiper初始化工作,转而到mounted生命周期当中来,通过设置key值的方式,设置key值的这种方式是在讲这个diff算法如何进行虚拟DOM的对比,不设置key值前在mounted生命周期当中初始化是swiper为了提高用户体验和效率,保留了swiper标签只替换了swiper中的数据,如果设置key值,swiper组件前后的key比对不同,Vue会将之前的swiper删除然后重新创建,此时swiper当中的数据已经准备好了可以进行swiper初始化工作,这样一来swiper组件的封装就已经告一段落了!


        以上的内容是对上一篇内容的总结回顾,那么既然已经解决了那些问题,swiper组件也能够成功的运行起来,封装组件不就到此结束了吗? 即使这样我们仍然还有一些需要进一步的发掘。先将上一篇内容的代码整理一份在这里继续讲解:

<div id="app">
    <swiper :key="swiperList.length">
        <div class="swiper-slide" v-for="(item,index) in swiperList" :key="index"> 
            <img :src="item" />    
        </div>
    </swiper>
</div>
<script>
Vue.component("swiper",{
    template:`
        <div>
            <div class="swiper-container author" >
                <div class="swiper-wrapper">
                    <slot></slot>
                </div>
            <div class="swiper-pagination"></div>
            </div>
    `,
    mounted(){
        new Swiper(".author",{
            loop:true,
            autoplay:{
                delay:2000
            },
            pagination:{
                el:'.swiper-pagination'
            }
        })
    }
})

new Vue({
    el:'#app',
    data:{
        swiperList:[]  // 请求的数据容器
    },
    mounted(){
        // 模拟发起ajax请求
        setTimeout(()=>{
            this.swiperList = [ 
                'https://s2.loli.net/2022/07/18/1nMDLzF35hsYZ8t.jpg' ,
                'https://s2.loli.net/2022/07/18/yFXUisGht9x5PjY.jpg' ,
                'https://s2.loli.net/2022/07/18/8WhpU5EDQTySONY.jpg' ]; 
        },2000)
    }
})
</script>

" v-if " 指令 

      以上通过上一篇的回顾和代码可以知道的是设置key值的这套过程换一个思路就是swiper组件在创建的时候要进行mounted生命周期对swiper进行初始化,前提是swiperList已经装备好了,这样才能够让swiper轮播起来,说到这你可能会想到有一个指令好像可行,谁呢?" v-if " 指令;通过判断swiperList.length来确定swiperList是否有数据,如果有的话在创建swiper组件然后swiper组件进入mounted生命周期对swiper进行初始化,这样一来swiper组件不也可以轮播起来了吗?

1. 代码编写:

<div id="app">
    <swiper v-if="swiperList.length">
        <div class="swiper-slide" v-for="(item,index) in swiperList" :key="index"> 
            <img :src="item" />    
        </div>
    </swiper>
</div>

2. 测试效果:

        通过v-if指令判断swiperList是否为真,也即是swiperList已经有数据了,此时创建swiper进入mounted生命周期进行swiper初始化,一次就能够成功!这也不失为封装组件的一个好办法!


封装Swiper组件的灵活性

        封装完swiper组件后会发现当我使用的时候不需要用这个指示器(圆点),那我怎么去掉呢?显然组件好像还不够灵活,可以使用之前讲过的哪些知识点呢?就是这个插槽,通过插槽的方式,如果使用者不想要这个图片指示器的话,就可以不传指示器,让组件变得更加的灵活;

        下面使用新版的slot,在讲新版本插槽的时候讲过要注意版本问题,同时要结合template标签进行包裹使用,同时还有简写,这里附上地址,回顾温习一下:  第三十一篇 v-slot 插槽使用

1. 编写代码

<div id="app">
    <swiper v-if="swiperList.length">
        <div class="swiper-slide" v-for="(item,index) in swiperList" :key="index"> 
            <img :src="item" />    
        </div>
        <!-- 使用者使用的话可以编写template的内容 -->
        <template #pagination>
            <div class="swiper-pagination"></div>
        </template>
    </swiper>
</div>
<script>
Vue.component("swiper",{
    template:`
        <div>
            <div class="swiper-container author" >
                <div class="swiper-wrapper">
                    <slot></slot>
                </div>
                <slot name="pagination"></slot>
            </div>
        </div>
    `,
...

2. 去掉 <template> 标签的内容测试

        没有对应的指示器圆点出现,那么当需要的时候可以进行编写<template>的内容;那么指示器解决了,这会我不想让它去自动轮播 (loop:true),默认是不轮播,要不要轮播让使用者自己决定,这个要怎么来解决呢?结合之前的什么内容呢? 就是这个属性,给组件传一个属性的方式,这里就结合了之前的组件通信内容,可以进行一个父传子,默认的loop值为false,将值赋给loop为true,那么顺着这个思路进行编码:

<div id="app">
    <swiper v-if="swiperList.length" :options="{loop:true}">
        <div class="swiper-slide" v-for="(item,index) in swiperList" :key="index"> 
            <img :src="item" />    
        </div>
        <template #pagination>
            <div class="swiper-pagination"></div>
        </template>
    </swiper>
</div>
Vue.component("swiper",{
    props:["options"],
    template:`
        <div>
            <div class="swiper-container author" >
                <div class="swiper-wrapper">
                    <slot></slot>
                </div>
                <slot name="pagination"></slot>
            </div>
        </div>
    `,    
    mounted(){
        new Swiper(".author",{
            loop:false,
            autoplay:{
                delay:2000
            },
            pagination:{
                el:'.swiper-pagination'
            }
        }),
        console.log("options值",this.options);
    },
    ...

        通过props传值将使用者想开启自动轮播的值传到子组件中,即options值;测试效果:

         传过来属性跟原来的对象进行合并,怎么合并进去?如何快速让两个对象合并在一起呢?


Object.assign()方法

        将所可枚举的自有的属性从一个或多个源对象复制到目标对象,返回修改后的对象。


1. 下面来将其进行合并,代码编写:(修改mounted中代码)

mounted(){
    var baseOptions = {
        loop:false,
        autoplay:{
            delay:2000
        },
        pagination:{
            el:'.swiper-pagination'
        }
    }
    new Swiper(".author",Object.assign(baseOptions,this.options))
}

2. 测试打印一下:

console.log(baseOptions);    // 预期: loop:false -> true 

         通过以上的这些为组件传入属性和使用插槽都能够使得组件得更加的灵活,封装一个好的组件所要具备的不单只是可复用性,还有它的灵活性,能够使使用者充分发挥。那么本篇的内容就到此结束了,那么你对Vue封装swiper组件是否已经掌握以及是否了解封装组件需要注意的内容了呢!在此感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【车间调度】基于matlab混合蛙跳算法 (SFLA) 求解简单调度问题【含Matlab源码 2247期】

⛄一、车间调度简介 在传统的SFLA中&#xff0c;每一个青蛙的位置代表一个解&#xff0c;若干个青蛙组成的种群代表一个解的集合&#xff0c;种群被划分为不同的组&#xff0c;即模因组&#xff0c;对每个模因组执行搜索过程&#xff0c;当达到终止条件后&#xff0c;重新将模…

编译原理13:SLR(1)分析表、LR(1)分析表

更强的LR分析 可以根据当前单词&#xff0c;来选择是移进还是归约。只要所有移进项目中的点后面的那些终结符&#xff0c;与归约项目生成的非终结符的Follow集合的元素没有重叠。若当前单词属于上述Follow集合里则规约 SLR(1)冲突解决办法 SLR(1)分析表的构造 SLR(1)分析表的构…

001. 组合

1.题目链接&#xff1a; 77. 组合 2.大概思路&#xff1a; 2.1题目要求&#xff1a; 给两个值 n 和 k &#xff0c;要求从[1&#xff0c;n]的区间中&#xff0c;输出所有元素数量为k的组合。&#xff08;不能有[1,1]&#xff0c;值只能取一次&#xff09; 2.2思路&#xff…

(十七)Spring6整合JUnit

文章目录环境Spring对JUnit4的支持Spring对JUnit5的支持上一篇&#xff1a;&#xff08;十六&#xff09;Spring对事务的支持 环境 spring6里程碑版本的仓库 依赖&#xff1a;spring context依赖、spring对junit的支持相关依赖、junit4依赖、junit5依赖 <!--配置多个仓库-…

Spring【Spring的创建与使用】

Spring【Spring的创建项目与使用】&#x1f34e;一.Spring创建项目&#x1f352;1.1 创建⼀个 Maven 项⽬&#x1f352;1.2 添加 Spring 框架⽀持&#x1f352;1.3 添加启动类&#x1f34e;二.Bean对象的存储与获取&#x1f352;2.1 存储 Bean 对象&#x1f349; 2.1.1 创建 Be…

C语言【微项目19】—大整数字符串乘法器[纯字符串乘法][乘法表与加法表]【2022-11-27】

C语言【微项目19】—大整数字符串乘法器[纯字符串乘法][乘法表与加法表]【2022-11-27】1.函数功能2 简要测试结果3.BigInterNoLimitMutiString.c3.大整数字符串乘法器实现思路4. 大整数字符串乘法器典型使用流程main.c【TDTX】 【C99】 【编译与运行环境】64位Windows操作系统&…

Unity嵌入Android项目开发

目录前言1 搭建开发环境2 创建Unity项目2.1 新建项目2.2 Unity构建配置2.3 Android环境相关配置2.4 导出Unity库文件3 创建Android项目3.1 新建Android项目3.2 Android环境相关配置3.2 导入Unity相关的库3.3 Android中跳转到Unity视图4 进阶扩展4.1 包体积优化4.1.1 mono和IL2C…

ILRuntime1.安装

目录 1&#xff1a;官网地址&#xff1a;介绍 — ILRuntime 2&#xff1a;注意事项&#xff1a; 3&#xff1a;安装 此文章是参照官方文档&#xff0c;自己的开发笔记。 1&#xff1a;官网地址&#xff1a;介绍 — ILRuntime 官方Unity示例代码&#xff1a;GitHub - Ourpa…

CUDA-矩阵乘2

这里从一个 cuda 初学者的角度来阐述如何优化一个形状较大的正方形乘正方形的 FP32 矩阵乘。 矩阵乘作为目前神经网络计算中占比最大的一个部分&#xff0c;其快慢会显著影响神经网络的训练与推断所消耗的时间。虽然现在市面上已经有非常多的矩阵乘的高效实现——如基于 cpu 的…

基于Pytorch框架的轻量级卷积神经网络垃圾分类识别系统

在我之前的博文中也写过一篇关于垃圾识别的文章&#xff0c;主要是基于tensorflow和keras实现的&#xff0c;数据集是一个比赛提供的&#xff0c;有40个细分的子类别&#xff0c;最近是在学习PyTorch框架&#xff0c;实践做项目的过程中就想拿垃圾识别的数据集再开发垃圾识别模…

物联网-常见的服务架构演变

常见的服务架构演变 背景 在互联网的发展中&#xff0c;后端的web服务也经历了很多的演变&#xff1b;在公司业务稍微简单的时候&#xff0c;采用简单的服务&#xff0c;可以提高开发效率&#xff0c;可以帮忙节省更多的成本。但随着用户数量的剧增&#xff0c;流量突增&…

keras-yolo3-master 项目实战cookbook

1、.h5文件转化 1.1 Error: FileNotFoundError: [Errno 2] No such file or directory: ‘yolov3.weights’ 解决办法&#xff1a;通过在.py文件中添加print()命令发现文件的打开路径有问题&#xff0c;因此在代码中手动添加.weights的绝对路径&#xff0c;使程序能够找到该文…

java.lang.reflect.Field 解读

java.lang.reflect.Field Java 中 Field 提供有关类或接口的单个字段的信息&#xff0c;以及对它的动态访问权限。反射的字段可能是一个类字段或实例字段。Field 是成员变量的意思。Field 也是一个类&#xff0c;该类位于 java.lang.reflect 包下。 https://docs.oracle.com/…

每天五分钟机器学习:支持向量机损失函数和互熵损失函数

本文重点 本节课程我们讲学习两个常见的损失函数,一个是支持向量机损失,也叫做hinge loss,另外一个损失函数是互熵损失函数,它常常应用于softmax分类器中。 hinge loss 单样本的hinge loss可以为: 这个意思是说样本分类错误的分数-样本分类正确的分数小于阈值▲,则损…

Spring Boot 2.7.6 正式版发布, SpringBoot 2.7.6来了

一、发布说明 11 月 25 日官方发布了 Spring Boot 2.7.6 版本&#xff0c;此版本包括 44 个错误修复、文档改进和依赖项升级。 二、更新内容 2.1 bug 修复 即使未启用基于注释的计划&#xff0c;ScheduledBeanLazyInitializationExcludeFilter 也会自动配置使用 ContextHi…

第16章-Spring AOP中的基础API

文章目录一、概述二、切点&#xff08;Pointcut&#xff09;三、通知&#xff08;Advice&#xff09;1. 环绕通知2. 前置通知3. 异常通知4. 后置通知四、通知者&#xff08;Advisor&#xff09;五、附录1. 常用接口2. 示例代码前面我们讲了基于 XML 和注解两种方式配置 AOP&…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.3 定时任务报表开发

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.3 定时任务报表开发2.3.1 直接开干2.3.2 小结2 自定义start…

JavaScript函数进阶:闭包

变量作用域 变量根据作用域的不同分为两种&#xff1a;全局变量和局部变量。 1. 函数内部可以使用全局变量。 2. 函数外部不可以使用局部变量。 3. 当函数执行完毕&#xff0c;本作用域内的局部变量会销毁 什么是闭包 闭包&#xff08;closure&#xff09;指有权访问另一…

Day13--商品列表-请求并渲染商品列表的数据

1.定义请求参数对象 接口部分&#xff1a; 文档部分&#xff1a; 我的操作&#xff1a; 1》在goods_list.vue中&#xff1a; 1>初步操作&#xff1a; 其效果图&#xff1a; 2>进一步操作&#xff1a; 在goods_list.vue中&#xff1a; 情况①&#xff1a; 情况②&…

python高级在线题目训练-第二套·主观题

1、《Walden》 是美国作家梭罗独居瓦尔登湖畔的记录,描绘了他两年多时间里的所见、所闻和所思。该书崇尚简朴生活&#xff0c;热爱大自然的风光&#xff0c;内容丰厚&#xff0c;意义深远&#xff0c;语言生动。 请用Python统计小说《Walden》 中各单词出现的频次&#xff0c;…