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的单例模式 (singleton in Javascript)
Jun 11 Javascript
chrome原生方法之数组
Nov 30 Javascript
JS使用正则表达式除去字符串中重复字符的方法
Nov 05 Javascript
js表单中选择框值的获取及表单的序列化
Dec 17 Javascript
JS作用域链详解
Jun 26 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
Layui table field初始化加载时进行隐藏的方法
Sep 19 Javascript
vue实现简单加法计算器
Oct 22 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
Nov 12 Javascript
JS创建自定义对象的六种方法总结
Dec 15 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读取和编写XML DOM的实现代码
2011/02/03 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
js 操作css实现代码
2009/06/11 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
js动态添加事件并可传参数示例代码
2013/10/21 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
幼儿园教师辞职信
2014/01/18 职场文书
低碳环保倡议书
2014/04/14 职场文书
自荐信格式模板
2015/03/27 职场文书
2016年春节问候语
2015/11/11 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android