前言

前段时间呢实现了一个模仿移动端app的通过滑动来切换路由/tab的效果,详见vuejs实现spa页面组件滑动特效。完了之后呢就在想能不能做成一个组件的形式,改进一下,抽离出来,顺便再发布到npm上,不是美滋滋?这两天正好有时间,就把它写出来了,我给他起名叫tab-slider,中间遇到一些坑,分享一蛤。

正文

简单介绍

正如我上一篇文章所说,如果你需要这种功能

  1. 即将离开的组件和将要进入的组合需要同时出现在页面中
  2. 用手指拖动页面可以切换路由,而不仅仅是点击链接跳转
  3. 结合以上两点,拖动过程中同时显示两个组件,手指离开屏幕后执行切换路由或者返回的动作

tab-slider也许可以满足你,具体实现思路可以去看上一篇文章,这里就不讲了,来看一下效果图:

改进方面

  • 相比之前每个路由组件都要写touch事件的蠢写法,我把touch事件写在了router-view上,增强了代码的复用,事实上不这么改我也没法将组件抽离出来给别人用
  • 支持多个tab切换,之前是只有2个,写法固定,现在可以有任意个tab切换。

踩过的坑

在我开发XiXi这个仿DiDi app项目的时,我使用的Vue版本是2.4.4,而我写tab-slider的时候使用了最新版本的Vue 2.5.16。写完之后我遇到了一个问题,滑动完毕切换路由的时候,router-view所对应的区域会闪一下,而通过点击router-link切换路由则不会。
Vue2.5.16效果图:

where?哪有问题?

这里一开始我觉得可能是新老项目css样式做了部分更改,影响了浏览器的重绘或是回流,苦苦搜寻无果。后来通过chrome控制台的的performance发现:新版本的vue多了个flushCallbacksactivity,耗时9ms。这是什么?继续google,没什么有用的东西,ok没关系,去Vue仓库里搜,发现他第一次写入是在14 Oct 2017,也就是Vue2.5.2发布的时候,这个版本修改了nextTick实现机制,并关闭了一个issue,有兴趣的同学可以看看。这个issue下面呢又有人reference了这个issue,里面正好讲解了相关内容。开源社区简直棒极了!

why?问题是什么?

简单来说呢就是新版Vue对于DOM相关事件是放在macro task里,其他情况默认走micro task,而micro task要先于macro task执行。而我项目中的写法是,对拖曳的dom监听了transitionend事件,当transition结束后进行路由切换。所以原因应该是滑动结束后(也就是transition结束),路由没有在第一时间进行跳转,所以出现了一瞬间的“白屏”,在我们看来就是闪了一下。

how?怎么解决?

  • solution1: 使用低版本Vue,2.4.4及以下。
  • solution2: 修改写法,直接使用settimeout,延迟时间与动画时间一致,而由于js的异步机制,实际延迟时间总是略大于写入的延迟时间,基本上能达到想要的效果。

这里我采用了solution2,毕竟是写出来给人用了,总要有个通用的解决方案。

另外个坑就是在发布到npm之后,引入我的包,没法正常使用,提示组件未注册,折腾了许久,参考了vant和cube-ui的组件导出方式,却一直没能成功导出正确的对象。最后发现原因在于webpack的配置上: 需要在output属性中添加library以及libraryTarget,这样才能正确导出对象。

怎么用

说了那么多废话,这组件怎么用?

  • 安装:npm i -S tab-slider
  • main.js中引入样式,import 'tab-slider/dist/index.css'
  • 在需要的组件中注册子组件,import TabSlider from 'tab-slider',也可以在main.js中引入,并通过Vue.use()来使之成为一个全局组件。
  • 接受一个comp的prop,类型是数组,数组中的每一项是对象,对象中又包含了namecomponent属性。其中name属性必须和路由名字相同,(这也意味着你必须为每个路由取名),component则是对应的组件。这里要注意一下,comp中每一项的顺序需要与你的router-link顺序一一对应。
  • 还接受一个default-index,表示默认跳转的路由,从0开始。

可以改进的地方

  • webpack相关配置还是通过vue-cli生成的,删除了一些不必要的东西,但还是没有做到最简。打包出来的东西也有9kb,好像有点大的过分。
  • 可以把router-link的内容也直接做进去,毕竟tab和内容区是紧密联系的。
  • 提供更多的选项(prop)给使用者。

么得了

如果对你有帮助的话点个赞点个收藏点个star提个issue都是可以的哦 仓库地址

Vue实现的滑动切换路由组件相关推荐

  1. 项目前端(一)、vue项目中引入vue-router路由组件

    1.在项目根目录下,执行 npm install vue-vouter 是否成功引入router路由组件,我们可以查看package.json文件中dependencies标签下是否有vue-rout ...

  2. 基于 vue +better scroll滑动切换页面 并支持下拉刷新案例

    也是公司项目 ,内部app的资讯模块整改,改是不可能改的,之前还是用jquery.感觉越改越混乱,还是重做.就仿着今日头条.等资讯页面做了一个dome,话不多说,先看效果! 微信扫码预览 效果看完,感 ...

  3. 使用vue-touch实现移动端左右滑动屏幕切换页面(左右滑动切换路由)

    1.安装vue-touch npm install vue-touch@next --save 2.在main.js中引入 import  VueTouch from 'vue-touch' Vue. ...

  4. vue移动端滑动切换图片的一个简单思路

    最近想仿一下美团app里的榛果民宿,当做移动端的练习.github地址在这里,还没做完. 按照app里的图片切换效果想了一个简单的实现思路,在这个基础上做更复杂一点更炫酷一点的轮播应该也是可以的.效果 ...

  5. vue导航栏滑动切换居中,导航栏超出部分可以滑动,点击触发滑动对应的index,且滑动时导航栏会自动对应

    效果图 模仿婚礼纪电子请帖模块 导航栏超出部分可以滑动,点击触发滑动对应的index,且滑动时导航栏会自动对应 Html部分  <template><div class=" ...

  6. 路由守卫-vue切换路由登录判断、条件判断

    在vue项目中,切换路由时肯定会碰到需要登录的路由,其原理就是在切换路径之前进行判断,你不可能进入页面再去判断有无登录重新定向到login,那样的话会导致页面已经渲染以及它的各种请求已经发出. 一.如 ...

  7. Vue教程6【完结】【vue-router】路由,路由传参,编程式路由导航,缓存路由组件,路由守卫,路由模式,vue ui组件库

    vue-router 了解 vue插件库,用来实现SPA应用(单页面) 整个页面只有一个完整的页面 点击页面中导航链接,不会刷新页面,只做局部更新 数据通过ajax请求 路由的理解 一组映射关系(ke ...

  8. vue切换路由页面数据缓存_Vue-Router实现前端页面缓存

    一.使用情景 在使用Vue开发单页面应用时,我们通常会使用Vue-Router进行页面导航,Vue-Router在进行路由切换的时候,页面是会重新加载,对应的生命周期函数也会再次执行一遍,但是在有些业 ...

  9. vue切换菜单时不需要页面刷新_antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作...

    废话不说,上代码! nav 1 nav 2 nav 3 重点: 1,selectedkeys要设置成$route.path地址 2,a-menu-item 的key设置成要去的地址 刷新页面,成功! ...

最新文章

  1. Linux 安装Resin4.0.40
  2. Linux(CentOs6.4)安装Git
  3. exec sp_prepare @P1 output
  4. fpga中wire和reg的区别
  5. ubuntu nginx配置负载均衡篇(二)
  6. Windows远程连接的用户名和密码怎么设置?
  7. 在线打mysql代码_mysql 在线alter table要留神_mysql
  8. cmake 学习笔记(四)
  9. paip.一千 常用汉字 高频汉字 覆盖率90%
  10. 专精特新企业数据库-专精特新企业名单及汇总
  11. 教你用VC6写热血江湖小外挂
  12. Spring Data JPA 的动态查询和一对多及多对多查询
  13. iReport编辑报表,以及打印PDF
  14. c# RoundUp函数
  15. QEMUKVM 虚拟机使用实例
  16. Apriori算法作电影推荐
  17. 美国J1签证面签需要准备哪些材料?
  18. ServerSocket和Socket连接
  19. 全球近90%的电影院现已对外开放;日本千叶将在东京奥运期间推出虚拟旅游 | 美通社头条...
  20. 【转载学习】Ceph新长支持稳定版本Luminous(12.x.x)新功能总结

热门文章

  1. 千本樱计算机音乐谱,【C型】我来发几个谱子 【千本樱】【权御天下】
  2. java中如何getchar_是否有与getchar等效的Java?
  3. SpringBoot启动流程分析(四):IoC容器的初始化过程
  4. TinkPHP框架学习-01基本知识
  5. 用Emacs进行Java开发
  6. java集合浅谈(一)
  7. u-boot.lds文件简介
  8. POJ2349+prim
  9. linux系统中各个文件描述——陆续添加
  10. PHP中数组的三种排序方法