vue+swiper实现左右滑动的测试题功能


Posted in Javascript onOctober 30, 2020

最近在做一个测试题,前后可以切换题目,点击按钮选择答案,选择答案的同时改变按钮的背景色,如下图所示:

vue+swiper实现左右滑动的测试题功能

初始代码

我用了vue和swiper。所有的题目是一个对象数组,通过v-for渲染:

<swiper ref="mySwiper" :options="swiperOptions">
 <swiper-slide v-for="(item, index) in listData" :key="index">
  <div class="question-box">
   <div class="idx">- 第{{ index+1 }}题 -</div>
   <div class="question">{{ item.question }}</div>
  </div>
  <button @click="goNext(index, 'a')" :class="item.answer=='a' ? 'active': ''">是</button>
  <button @click="goNext(index, 'b')" :class="item.answer=='b' ? 'active': ''">否</button>
 </swiper-slide>
</swiper>

一开始我把每道题目的answer存放在对象里面,点击的按钮时候切换answer的值,button的动态class监听到值改变后会引发背景色的改变。js部分:

goNext(index, answer) {
 this.$set(this.listData[index], 'answer', answer)
 this.swiper.slideNext(100)
},

发现问题

测试发现这样把点击事件和动态样式互相依赖,会造成大概几百毫秒的延迟才执行slideNext(),是可以直观感受到的延迟。通过调试,发现造成延迟有两方面的原因:

  • this.$set 更改数组
  • 执行完点击事件动态class监听到数据的改变 中间也有延迟。

于是我换了一个思路,不把每个题目的answer放在对像数组里面,而是在data里面定义一个answerMap,这样解决了问题1。为了解决问题2,我选择把动态样式 :class 去掉,改成用原生js在点击事件里面直接修改class。这样两步下来,确实看不到延迟了。

优化后的代码

html部分

<button @click="goNext($event, index, 'a')">是</button>
<button @click="goNext($event, index, 'b')">否</button>

js部分

goNext(e, index, answer) {
 const element = e.target
 const bro = element.parentNode.children
 for (let i = 0; i < bro.length; i++) {
  if (bro[i] !== element) {
   bro[i].classList.remove("active")
  }
 }
 element.classList.add('active')
 this.answerMap[this.listData[index].question] = answer
 this.swiper.slideNext(100)
},

测试结果:可喜可贺,slideNext()不再有肉眼可见的延迟了。

有的时候为了少写点代码,不知不觉牺牲了性能。这次实践,虽然原生JS使我增加了好几行代码,但是带来的性能提升也是非常明显的。经过这次优化,我觉得如果对Vue源码理解透彻的人,大概是能马上知道优化点。我虽然看过一遍源码,但还是理解不够深入。需要学习的还有很多呀~

到此这篇关于vue+swiper实现左右滑动的测试题功能的文章就介绍到这了,更多相关vue左右滑动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
面向对象的Javascript之二(接口实现介绍)
Jan 27 Javascript
上传的js验证(图片/文件的扩展名)
Apr 25 Javascript
如何使用Javascript正则表达式来格式化XML内容
Jul 04 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
javascript实现回到顶部特效
May 06 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
Dec 13 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
Nov 26 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
May 12 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
Dec 16 Javascript
如何用原生js写一个弹窗消息提醒插件
May 24 Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 Javascript
利用vue3+ts实现管理后台(增删改查)
Oct 30 #Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 #Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 #Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 #Javascript
JavaScript实现轮播图效果
Oct 30 #Javascript
vue组件添加事件@click.native操作
Oct 30 #Javascript
解决removeEventListener 无法清除监听的问题
Oct 30 #Javascript
You might like
PHP实现网上点歌(二)
2006/10/09 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
使用ThinkJs搭建微信中控服务的实现方法
2019/08/08 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
[53:52]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
DE1103使用报告
2022/04/05 无线电
golang的文件创建及读写操作
2022/04/14 Golang
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技