第四十篇 Vue封装swiper组件(v-swiper指令) 3.0

news2024/10/2 10:38:29

         在前面讲到 Vue组件的封装不知道还记不记得,这里就不在过多的赘述,这里附上链接跳转可以进行回顾翻阅,上一篇内容​​​​​​​讲到这个自定义的指令,也就是为这篇封装swiper组件使用指令做铺垫的,那么也一同附在这里:

        第三十七篇 Vue中封装Swiper组件

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

        第三十九篇 自定义指令 - directive


自定义指令 - v-swiper

        在这之前封装swiper组件所遇到的问题就是swiper什么时候开始进行初始化的问题,不是初始化过早,就是会被重复执行,所以需要知道到底在什么时机来对swiper进行初始化?上一篇内容讲到自定义指令当中我们知道自定义指令其实就是操作底层DOM,但目的并不一定是非要去操作DOM,虽然大多时候需要去操作DOM需求其实并不多,但是有时候需要知道的是DOM在什么时候会被刚刚创建完;封装swiper组件时我们就是在寻找DOM在什么时候会被创建出来,swiper好进行初始化内容,这样一来就不会造成具有初始化过早之类的问题,那么指令当中有一个指令生命周期inserted,当绑定该指令的标签插入父节点的时候就会触发;下面先来一段代码:

<div id="app">
    <div class="swiper-container mySwiper">
        <div class="swiper-wrapper">
            <div class="swiper-slide" v-for="item in swiperList" :key="index">
                <img :src="item" alt="">
            </div>
            <div class="swiper-pagination"></div>
        </div>
    </div>
</div>
<script>
    new Vue({
        el:'#app',
        data:{
            swiperList:[]
        },
        mounted(){
                 // 假设请求回来的数据赋值给swiperList
                this.swiperList = [ 
                    'ImageOne' ,
                     'ImageTwo' ,
                      'ImageThree' ]; 

                // new Swiper(".author")

            },2000)
        }
    })
</script>

        通过之前内容的学习能够知道Swiper在请求数据完成做初始化并不能够让swiper轮播起来,即初始化过早,需要知道DOM什么时候创建,这段数据会在DOM创建完插入父节点当中再进行初始化才能轮播;

         下面来编写v-swiper自定义指令,在控制台上了解指令绑定的标签插入父节点的过程:

<div id="app">
    ...
    <div class="swiper-slide" v-for="item in swiperList" :key="item" v-swiper>
         <img :src="item" alt="">
    </div>
    ...
</div>
<script>
    Vue.directive("swiper",{
        inserted(el){
            console.log(el);
        }
    })

         当绑有 v-swiper 指令的标签插入父节点当中,会打印原生DOM节点;

         那么知道这个时机不就可以做swiper初始化的内容,那么能直接讲new Swiper的内容移到inserted当中吗?测试一下:

1. 编写代码:

<script>
    Vue.directive("swiper",{
        inserted(el){
            console.log(el);
            new Swiper(".mySwiper",{
                loop:true,
                pagination:{
                    el:'.swiper-pagination'
                }
            })
        }
    })

2. 测试效果:

        这又是为什么?每插入一条数据都会触发inserted走一遍,这里其实仅仅只需要知道是否全部已经插入到父节点当中,不需要每一条都触发一次,只需判断最后一条数据是否插入完成,这就意味着整个内容已经插入到父节点的内容了,也就是 if (最后一个节点插入){ 进行swiper初始化 },怎么去判断是否是最后一个节点呢?通过当前的索引值和swiperList的长度进行判断,当索引index等于swiperList.length - 1时再触发swiper的初始化,索引值index可以通过v-swiper指令进行传值,swiperList.length怎么获取得到呢?this.swiperList.length? 看一下this指向

console.log(el,this);

 

        this是指向window,这样一来拿不到,这里可以更组件进行类比,组件也不能轻易拿到父组件的状态,组件要通过通信才拿到,指令可以传过来index一个变量,那么通过指令其实也可以传递一个对象,以对象的方式传过来不久可以了。

<div class="swiper-slide" v-for="(item,index) in swiperList" :key="item" 
                v-swiper="{ current:index , length : swiperList.length }">
                <img :src="item" alt="">
            </div>
console.log(binding.value)

         获取到后进行判断当前是否是最后一个节点,进行swiper初始化:

<div id="app">
    <div class="swiper-container mySwiper">
        <div class="swiper-wrapper">
            <div class="swiper-slide" v-for="(item,index) in swiperList" :key="item" 
                v-swiper="{ current:index , length : swiperList.length }">
                <img :src="item" alt="">
            </div>
        </div>
        <div class="swiper-pagination"></div>
    </div>
</div>
<script>
    Vue.directive("swiper",{
        inserted(el,binding){
            console.log(binding.value)
            if( binding.value.current === binding.value.length-1 ){
                new Swiper(".mySwiper",{
                    loop:true,
                    pagination:{
                        el:'.swiper-pagination'
                    }
                })
            }
        }
    })
...
</script>

测试效果:

        能够实现正常swiper的轮播以及指示器也能够呼应上,以上就是通过指令的方式来解决swiper初始化过早的问题,下面将它与之前封装的组件进行最终的合并,当然这只也是一种编写的方法,主要还是通过这种方式学习swiper封装组件的一个过程,能够启发你的思路;


封装swiper组件 3.0 

        下面结合组件和指令来进行swiper组件的封装,同样组件的目的不仅在于它的复用性还有灵活性,这里来简单的设置swiper能够轮播不会出现初始化和之前所讲到的种种问题,其次是可以满足使用者可以选择性的使用轮播指示器,以及轮播是否自动轮播,就这几个点来封装;

1. 编写代码

<div id="app">
    <swiper>
        <div class="swiper-slide" v-for="(item,index) in swiperList" :key="item" 
            v-swiper="{ current:index , length : swiperList.length , loop : true }">
            <img :src="item" alt="">
        </div>
        <template #pagination>
            <div class="swiper-pagination"></div>
        </template>
    </swiper>
</div>
<script>  
    Vue.directive("swiper",{
        inserted(el,binding){
            const baseOptions = {
                loop:false,
                autoplay:{
                    delay:2000
                },
                pagination:{
                    el:'.swiper-pagination'
                }
            }
            const updateOptions = {
                loop:binding.value.loop
            }
            if(binding.value.current === binding.value.length-1){
                new Swiper(".mySwiper",Object.assign(baseOptions,updateOptions))
                console.log(Object.assign(baseOptions,updateOptions))
            }
        }
    })

    Vue.component("swiper",{
        template:`
        <div class="swiper-container mySwiper">
            <div class="swiper-wrapper">
                <slot></slot>
            </div>
            <slot name="pagination"></slot>
        </div>
        `,
    })

    new Vue({
        el:'#app',
        data:{
            swiperList:[]
        },
        mounted(){
                 // 假设请求回来的数据赋值给swiperList
                this.swiperList = [ 
                    'ImageOne' ,
                     'ImageTwo' ,
                      'ImageThree' ]; 

                // new Swiper(".author")

            },2000)
        }
    })
</script>

2. 测试效果

        以上就是本篇的内容了,本篇的前半部分自定义指令的内容如果能够理解动画,后半部分对组件的封装难度的话来理解和完成的话会比较容易些,那么在Vue中封装swiper组件的内容也就暂时到此告一段落,在此感谢大家的支持!

 

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

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

相关文章

电子电气架构设计之三电系统设计

文中缩略词参考 SSTS&#xff1a;Sub System Technical Specification&#xff0c;子系统功能规范 CTS&#xff1a;Component Technical Specification&#xff0c;部件功能规范 DCDC&#xff1a;Direct Current Direct Current Converter&#xff0c;直流转直流变换器 BMS&…

Postgresql源码(92)深入分析HOT更新

0 概述与总结 hot更新已经有几篇分析了&#xff0c;这里是最后一篇&#xff08;总结性的&#xff0c;前面的可以忽略&#xff09;。前面在看update代码时&#xff0c;大部分集中在heap_update上&#xff0c;没有涉及寻找HOT链的逻辑。本篇重点看HOT链是如何使用的。 &#xf…

[附源码]计算机毕业设计JAVA鑫地酒店酒水库存管理系统论文

[附源码]计算机毕业设计JAVA鑫地酒店酒水库存管理系统论文 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …

搜索技术——群智能

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 一&#xff1a;初识群智能 1.1&#xff1a;粒子群算法 粒子群算法&#xff0c;也称粒子群优化算法或鸟群觅食算法&#xff08;Particle Swarm Optimization&#xff09;&#xff0c;缩写…

语音特征:spectrogram、Fbank(fiterbank)、MFCC

1.各种语音特征 语音特征用于语音识别和语音合成等。 语音特征有声谱图spectrogram、Fbank(fiterbank)、MFCC(Mel-frequency cepstral coefficients)等。 Fbank 特征提取方法就是相当 于 MFCC 去掉最后一步的离散余弦变换&#xff08;有损变换&#xff09;. 在深度学习之前…

git学习笔记

1、安装及配置git 1、到官网下载git安装包&#xff1a;https://git-scm.com/download/win 2、安装完成后&#xff0c;菜单栏有如下工具 3、配置账户和邮件信息 $ git config --global user.name "xxx"$ git config --global user.email "xxxmegvii.com"4…

十大排序算法(C++)

十大排序算法Sorting algorithm(C) 百度百科&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。排序算法&#xff0c;就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地…

高通平台开发系列讲解(AI篇)如何让yolov5运行在SNPE

文章目录 一、模型下载二、模型转换三、模型量化四、后处理加速沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍高通平台SNPE SDK运行yolov5。 一、模型下载 首先去git上下载yolov5s的代码和模型https://github.com/ultralytics/yolov5 二、模型转换 采…

Python爬虫实战,requests+xlwings模块,Python实现制作天气预报表!

前言 今天为大家介绍PythonExcel的实战项目&#xff0c;非常有趣&#xff0c;废话不多说。 Let’s start happily 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; xlwings模块 requests模块 pathlib模块 xlwings模块 json模块 环境搭建 安装Python并…

RAR压缩包,去除密码?

压缩包设置了加密&#xff0c;需要输入压缩包密码才能够顺利解压文件出来。但是有些时候&#xff0c;一些文件只需要一段时间内要加密&#xff0c;之后文件不需要加密了&#xff0c;每次解压文件的时候还是需要输入压缩包密码才行&#xff0c;就很麻烦&#xff0c;那么RAR压缩包…

SAP 接口主动推送企业微信异常消息

"推送企业微信格式lv_json { "msgtype": "markdown", "markdown": &&{ "content": "### 异常JOB通知\n >JOB名称&#xff1a; && gt_alv-jobname && \n 程序名称&#xff1a; && gt_…

戟星安全实验室|五分钟教你挖掘小程序漏洞

戟星安全实验室 忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等。 本文约1252字&#xff0c;阅读约需5分钟。 前言 现在大多小程序反编译教程所使用的都是node.js&#xff0c;操作过程较为麻烦…

第一周练习——认识复杂度和简单排序算法

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;《数据结构与算法》 &#x1f4e7;如果文章知识点有错误的地方&a…

Mediapipe学习记录

学习文档 1、Google MediaPipe&#xff1a;设备端机器学习【完整解决方案】背后的技术实现 - 极术社区 - 连接开发者与智能计算生态 2、【转载】Google MediaPipe&#xff1a;设备端机器学习【完整解决方案】背后的技术实现 3、MediaPipe框架结构 - 走看看 Handtracking封装…

qt creator 设置 项目依赖关系

qt creator中有两种设置项目依赖关系的方式。 1、对于有依赖的项目&#xff0c;如果工程比较简单&#xff0c;可以将所有项目放到一个空的项目下&#xff0c;然后显示地指定从属关系&#xff0c;参考&#xff1a;qmake TEMPLATE subdirs_丘上人的博客-CSDN博客 2、通过qt cre…

leecode#Excel表列序号#组合两个表

题目描述&#xff1a; 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 分析&#xff1a; 法1&#xff0c;进制转换 这道题要求将Excel 表中的列名称转换成相对应的列序号。由于Excel 表的列名称由大写字母组成&#xff…

vue学习53~60(Vue组件化编程)

2 Vue组件化编程 2.1 模块与组件、模块化与组件化 2.1.1 模块 理解:向外提供特定功能的js程序,一般就是一 个js文件为什么: js 文件很多很复杂作用:复用js,简化js的编写,提高js运行效率 2.1.2 组件 理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image…)为什么…

正大国际期货:外盘期货交易中常见的五类技术分析方法

外盘期货交易中&#xff0c;技术分析是必不可少的&#xff0c;技术分析是指以市场行为为研究对象&#xff0c;以判断市场趋势并跟随趋势的周期性变化来进行一切金融衍生物交易决策的方法的总和。常用的技术方法大体上可以分五大类&#xff1a;指标类、切线类、形态类、波浪类、…

安卓程序逆向与防护

安卓程序逆向与防护实际用处代码打包生成apk的步骤程序基础逆向步骤程序基础防御代码混淆针对逆向工具的防御手段ProguardSO文件防止二次打包程序进阶逆向攻击实战练习逆向简易安卓程序实际用处 1.当想要获得一款前后端分离的安卓程序的数据时&#xff0c;一般会考虑抓包后端传…

Kanzi:关于kanzi的一点杂谈

概述&#xff1a; 做过开发的小伙伴在初次接触Kanzi Studio 这个开发工具时&#xff0c;可能有点摸不着头脑&#xff0c;由于 它不像Android studio 也 不像QT &#xff0c;而且最大的一个区别是&#xff1a;kanzi基本不用写代码逻辑来控制程序显示UI&#xff0c;但是Android …