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 相关文章推荐
基于jQuery的获取标签名的代码
Jul 16 Javascript
js键盘上下左右键怎么触发function(实例讲解)
Dec 14 Javascript
JavaScript如何实现跨域请求
Aug 05 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
jQuery实现弹窗居中效果类似alert()
Feb 27 Javascript
在js中做数字字符串补0(js补零)
Mar 25 Javascript
JS数组去重(4种方法)
Mar 27 Javascript
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
Apr 13 Javascript
JS数组求和的常用方法实例小结
Jan 07 Javascript
vue.js路由mode配置之去掉url上默认的#方法
Nov 01 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
利用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实现var_export的详细介绍
2013/06/20 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
使用JavaScript switch case 另类写法
2010/03/14 Javascript
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
js获取域名的方法
2015/01/27 Javascript
jquery衣服颜色选取插件效果代码分享
2015/08/28 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
理解javascript中的闭包
2017/01/11 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
微信小程序模拟cookie的实现
2018/06/20 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
vue实现图书管理系统
2020/12/29 Vue.js
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
用python写爬虫简单吗
2020/07/28 Python
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
高一历史教学反思
2014/01/13 职场文书
高中生自我评语大全
2014/01/19 职场文书
党员个人年度总结
2015/02/14 职场文书
采购部2015年度工作总结
2015/07/24 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
浅谈Python数学建模之固定费用问题
2021/06/23 Python
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB