1. 在线DEMO
http://va-carousel.xiaoshang.online
2. 首先是一张思维导图
3. 然后是以上属性的标注说明
4. 代码层
4.1 除去可从父组件接收的属性,组件自身有以下属性:
1 | data() { |
4.2 组件挂载之前
- 计算每项元素的宽度,即itemWidth的值
- 初始化显示的图片列表,即list。这里存储的数据才是真正会被在页面上渲染的。每次切换,实际上就是修改该list中的数据,对应的视图会自动更新,数据驱动视图嘛。
1 | beforeMount() { |
4.3 组件挂在后,检查autoplay属性,若该属性为true,则产生一个计时器
1 | mounted() { |
4.4 startTimer函数很简单,就是间隔一定时间触发一次next(向后)切换
1 | // 开始计时器 |
4.5 next函数
1 | // 下一张 |
4.6 对应的还有一个prev函数,与next函数逻辑相反,这里就不展示代码了
4.7 点击图片时,向父组件释放事件selectedItem,传递两个参数 item 和 index 分别为当前点击的对象,和该对象在list中的位置
1 | // 点击图片 |
4.8 鼠标悬浮在组件上时,停止自动切换(若autoplay为ture), 鼠标离开时,继续切换
1 | handleMouseEnter() { |
4.9 然后是过渡效果的实现
因为arrow元素也在transition-group中,所以当arrow=‘hover’时,arrow的显示、隐藏也会触发钩子函数,但是我们的钩子函数是针对image-item写的,所以需要在函数中检测是哪个元素触发的,这里通过检查className进行判断。
然后针对向前、向后两种情况设置不同的样式
1 | beforeEnter(el) { |
4.10 这里使用了Velocity,这是一个实现动画效果的js库,之所以使用这个库是因为试了n种方案都没能实现预期效果emm
1 | enter(el, done) { |
4.11 然后是对应的beforeLeave、leave函数,这里就不展示了
以上基本就是所有js部分,整体感受就是,一旦实现逻辑搞清楚,代码实现起来还是挺容易的,然后就是框架的熟悉程度。
5. npm包发布
这本是工作业务中的一个功能需求,因为没能在网上找到现成的轮子,找个差不多效果的领导不满意,所以只能自己写了,做都做了不发出来感觉白写了. . .
npm发布流程简单概括就是
1.注册
去npm官网注册个账号
2.生成npm包
文件夹中有package.json文件就是一个npm包
3.在终端使用npm publish发布包,成功之后,该项目文件夹下所有文件都会上传至npm官网,当用户使用npm install安装后,就会将整个文件夹下载至node_modules文件夹中,对于这个项目,本是一个使用vue-cli生成的vue项目,组件路径src/components/VaCarousel.vue
,所以使用npm install va-carousel安装之后,只需要在项目中像这样导入即可使用(前提是你的项目也是使用vue-cli生成的,对于其他方式搭建的项目可能会出现一些错误):import VaCarousel from 'va-carousel/src/components/VaCarousel.vue'
以上