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 相关文章推荐
子窗体与父窗体传值示例js代码
Aug 01 Javascript
js购物车实现思路及代码(个人感觉不错)
Dec 23 Javascript
浅谈javascript中return语句
Jul 15 Javascript
JS实现网页游戏中滑块响应鼠标点击移动效果
Oct 19 Javascript
整理Javascript基础语法学习笔记
Nov 29 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 Javascript
JQuery获取鼠标进入和离开容器的方向
Dec 29 Javascript
Vue异步组件使用详解
Apr 08 Javascript
JS实现可切换图片的幻灯切换效果示例
May 24 Javascript
JS实现判断数组是否包含某个元素示例
May 24 Javascript
Openlayers学习之地图比例尺控件
Sep 28 Javascript
vue浏览器返回监听的具体步骤
Feb 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
桌面中心(二)数据库写入
2006/10/09 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
php生成短域名函数
2015/03/23 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
javascript封装addLoadEvent实现页面同时加载执行多个函数的方法
2016/07/25 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
Python中的迭代器漫谈
2015/02/03 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
pycharm远程linux开发和调试代码的方法
2018/07/17 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
selenium+python自动化测试之多窗口切换
2019/01/23 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Django日志及中间件模块应用案例
2020/09/10 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
学生会竞聘书范文
2014/03/31 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
Go语言并发编程 sync.Once
2021/10/16 Golang