热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue左右循环滑动_前端开发思路超详解(Vue组件篇)

其实不管是什么框架,在开发中都有一些比较常规和通用的东西,那就是思想,接下来我将从以下三个点并基于vue开发一个Slider(
ba6d2bab0037cc0d52ec62ae1ff2d218.png

其实不管是什么框架,在开发中都有一些比较常规和通用的东西,那就是思想,接下来我将从以下三个点并基于vue开发一个Slider(滑条)组件,在这里我默认大家都会基本使用vue,若对vue相关概念还不是很清楚的可以转到,知乎的文档展示貌似对markdown不是很友好,大家可以直接转到Bennnis/slider查看文档

介绍 — Vue.js​cn.vuejs.org
ca62b23119c020ed88770c88b91e3370.png

概览

步骤
1. 组件抽象 (api设计)
2. 页面实现 (组件的html实现和css样式)
3. 建立关联 (组装)
项目构建
这里我们使用TUI-CLI快速搭建构建项目

Bennnis/tui-cli​github.com
eb54493a7f148fa5624ae169b8913b99.png

我们只需要关心src下的App.vue和components目录即可- src- App.vue- components/
一.组件抽象


首先在开发之前,我们需要对组件进行一个抽象操作,不需要关心页面如何去实现。
如何去抽象?很简单,两个点,属性和方法,比如我们现在抽象一个人:
1. 属性:身高,体重,爱好,头发颜色,脚的尺寸等等
2. 方法:吃饭,说话,打游戏,敲代码等等
我们再来抽象一个灯泡:
1. 属性:亮度,灯的颜色,灯的形状(圆的,细长的),灯的耗能等待
2. 方法:开,关 (当然这里还可以抽象成一个方法,就是“切换”)
抽象的程度决定了代码的复杂度和拓展性
好了言归正传,现在我们要抽象一个滑条组件需要怎么做呢?按我们上面的顺序来试试,在这里我们能想到多少就写多少,功能设计上有考虑不足是很正常的,因为我确实就没想到啊!不过没关系,我们先试试
1. 属性:宽度,填充色,打底色,最大值,最小值,单位值,当前选中值
2. 方法:改变值方法
好了,我现在就想到这些,先试试看呢!在设计api的时候也要考虑好属性的类型和初始值,比如这里这里的min和max还有value,我们严格要求成数字,并默认min为0,max为100,value为0
ps:如果用户传入了对应的属性值,那default将会被覆盖
在components目录下新建一个 slider.vue 文件,并添加以下代码

export default {props: {width: String,fillColor: String,underColor: String,min: {type: Number,default: 0},max: {type: Number,default: 100},unit: {type: Number,default: 1},value: {type: Number,default: 0}},methods: {setValue (val) {//我们先将方法抽象出来,具体实现请继续往下看//注:Vue中的组件属性不允许被直接赋值改变,因为破坏了单项数据流,这里只是为了体现逻辑实现,后面会讲解双向绑定实现并修改此处代码}}
}

二.页面实现

页面实现实际上去实现页面元素的布局,当然在写代码之前我们也可以做一下简单的页面元素的抽象。一个滑条由什么元素组成呢?

  1. 一个类进度条(拥有背景元素和填充元素)
  2. 一个可左右拖动的触发元素。

话不多说上代码


至此,我们的滑条组件的页面基本构造已经完成了。接下来我们将组件注册并在页面使用即可,看看接下来我们会遇到什么问题。

我们在App.vue引入slider组件或者使用Vue.component()全局注册,具体用法请参照Vue官方文档

修改App.vue为下列内容 (本例结合TUI组件库的部分组件进行页面的快速布局,TUI-CLI自动安装好了TUI,想了解更多请见Bennnis/TUI 喜欢的话顺便给个 star 哦!)



三.组装
我们在页面上注册并使用了 组件,接下来我们需要做什么呢?既然是输入组件,那双向绑定自然是少不了的。
ps:
* outM: 组件外部Model
* outV: 组件外部View
* inM: 组件内部Model
* inV: 组件内部View
对于这种输入组件我的开发思路一般是:
1. outM ↔ inM
2. outM ↔ outV, inM ↔ inV
### 1.outM ↔ inM
实现第一步,组件外部Model->组件内部Model,修改App.vue

*
* 省略部分
*export default {** 省略部分*data: {return {userInput: 0}}
}


再实现第二步,组件内部Model->组件外部Model, 修改slider.vue,这里并没有涉及到view的操作,我们下面会继续分析

*
* 省略部分
*
setValue (val) {this.$emit('input', val)
}


是不是很简单?outM ↔ inM实现完成。
那接下来我们继续拓展
outM ↔ inM => outV ↔ outM, inM ↔ inV
其实能走到这里后面的开发问题都不大了,只需要Model和View建立关联即可
我们从 inM ↔ inV 开始
### 2. M ↔ V
#### 1. inM -> inV
我们首先要靠考虑我们需要在视图上怎么去展现,不同于input组件,slider组件的展现形式更像是一个进度条,那我们肯定就要通过一些特殊操作了。
数据流向:M -> width -> V (通过value计算出一个width相关值并在视图上去设置样式)
我们修改一下slider.vue中的 "demo-slider__cover-line",并添加计算 “进度” 的属性coverPercent

>
*
* 省略部分
*computed: {coverPercent () {return `${100 * (this.value - this.min) / (this.max - this.min)}%`}
}


打开看看,好像漏了点什么,触发按钮好像也需要根据值的改变而改变位置,我们再修改一下"demo-slider__trigger"

>


庆祝一下,inM -> inV 完成,您可以手动改变value的绑定值来看一下效果
### 2. inV -> inM
对于slider组件来说,比较普遍的操作当然就是拖动触发按钮改变值了,或者直接点击under-line的某个位置改变值。这里我们从 "点击改变" 开始讲。

// 添加点击事件

***
*
* 省略部分
*methods: {** setValue method* jumpAhead (e) {this.endX = e.xlet percentage = (this.endX - this.$el.getBoundingClientRect().left) / this.$el.offsetWidthlet val = Math.floor((percentage + (this.min + this.unit / 2) / (this.max - this.min)) * (this.max - this.min) / this.unit) * this.unitthis.setValue(val)}
}


点击操作就已经完成了,我们的 inV -> inM 也拼接好了,其实到这里,咱们的组件也开发得差不多了,最后我们一起来实现一下拖动按钮改变值。原理大概分为以下几步
1. 鼠标按下(触发按钮):mousedown
2. 鼠标移动(任意位置):mousemove, 这里我们可以把每一次细微的改变都看成一次直接跳转,只是距离足够小,改变足够快,看起来就像在滑动,直接复用jumpAhead方法。但是这里有个问题,因为鼠标移动可能在页面的任何地方,所以需要在window上添加mousemove的监听,并在鼠标放开时移除即可
3. 鼠标放开(任意位置):mouseup
直接贴代码了

>
*
* 省略部分
*methods: {** 省略部分*startMoving () {this.addMovingListener()},stopMoving () {this.removeMovingListener()},addMovingListener () {window.addEventListener('mousemove', this.jumpAhead)window.addEventListener('mouseup', this.stopMoving)},removeMovingListener () {window.removeEventListener('mousemove', this.jumpAhead)window.removeEventListener('mouseup', this.stopMoving)}
}


拖动的时候可能会超出宽度范围,没关系,我们在setValue方法上限制一下即可

setValue (val) {if (val > this.max) {this.$emit('input', this.max)} else if (val }


至此,我们的slider组件就开发完成了,大家也可以试试传入其他值不仅仅是value。对了,上面还有几个属性没有组装哦,小伙伴们可以尝试一下,接着我的demo继续往下做,看能不能开发出更实用或者更有趣的功能。
源码已上传至 Github

Bennnis/slider​github.com
eb54493a7f148fa5624ae169b8913b99.png


再次贴上个人开发的组件库(您的star和issue是对我最大的支持)

Bennnis/TUI​github.com
eb54493a7f148fa5624ae169b8913b99.png


非常感谢您能看完这篇文章!



推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
author-avatar
手机用户2502886253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有