使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件

导语
最近看到不少使用vue制作的音乐播放器,挺好玩的,本来工作中也经常使用Vue,一起交流学习,好的话点个star哦
本项目特点如下 :
1. 原生js封装自己的跨域请求函数,支持promise调用,支持错误处理
2. 制作一些复用性强的vue组件,如轮播图组件,支持手势滑动,无限循环,图片按需加载
3. 清晰明了的项目目录
项目仓库地址
项目演示地址
从项目中提取的banner组件地址
一、规划目录
一个易于维护和迭代的项目,应该是具有可靠的项目目录的,这里,在vue-cli生成的目录中,加入了services、directives、utils、store等目录,并在webpack中修改相应的导入地址:

1. services 用于全局管理接口和http请求
2. directives 用于添加全局指令
3. utils 用于放置通用js函数
4. store 用于管理vuex数据等

二、制作公共css,
主要采用scss+em单位+currentColor继承父级颜色+before&after伪类制作
本项目制作的公共css有:
1. 播放器要用到的图标
2. 用于vue transition标签切换时使用的css3动画
3. css reset
4. 项目主题颜色,目前只能在项目初始化之前设置主题颜色,用于管理,所有组件主题颜色都来源于此

三、全局API
分成两个部分:
1. jsonp分装,负责http请求
2. 收集url地址,并放在API类上,并循环将url用bind函数导入到jsonp封装函数中,其他请求同样可用


四、核心组件
包括 :
1. banner组件
2. 播放器
1.banner组件
该组件只对传入的数据进行处理,并相应转化,保证了组件的通用性

核心的函数主要是对***无限循环的处理、触摸屏滑动,图片按需加载***处理:

computed : {
sliderImg : function(){
const [...saveImg] = this.bannerlist, //拷贝图片列表数据,在展示区域的图片实际上首尾拷贝了一样的图片,即尾端拷贝第一张,首端拷贝最后一张
[imgfirst, ...other] = this.bannerlist;
saveImg.unshift(other[other.length-1])
saveImg.push(imgfirst)
return saveImg
},
},
mounted () {
if (this.bannerlist && this.bannerlist.length) {
this.interTimer = setInterval(()=>{
this.sliderStart()
},3000)
}
},
methods : {
linkURl (item) {
window.open(item[this.linkurl])
},
getURl (item,index) { //用于减少一次性请求,只加载当前的图片,加载之后添加标识
if (!item) {
return reloadImg
}
if (item.hasload) {
return item[this.picurl]
}
if (this.nowSlider == index-1) {
item.hasload = true
return item[this.picurl]
}
return reloadImg
},
stopSlider (e) {
e.preventDefault()
e.stopPropagation()
if (e.target != e.currentTarget) { //事件委托节省下事件绑定,排除当前绑定的dom
clearInterval(this.interTimer)
delete this.sliderActive['transition'] //关闭css3过渡效果
this.startTouch = e.targetTouches[0].screenX
}
},
moveSlider (e) {
e.preventDefault()
e.stopPropagation()
if (this.nowSlider === -1||this.nowSlider === this.bannerlist.length) { //首端与尾端未连接好禁止滑动
return;
}
if (e.target != e.currentTarget) {
this.moveTouch = e.targetTouches[0].screenX
let slideDir = this.moveTouch - this.startTouch,
targetWidth = parseInt(window.getComputedStyle(e.target).width),
tranDir;
if (slideDir < -50 || slideDir > 50) { //加了50容错值,能预防触摸时图片突然闪动
if (slideDir < 0) { //再重新补回差值
slideDir -= 50
} else {
slideDir += 50
}
tranDir = -targetWidth * (this.nowSlider+1) + slideDir//触摸时图片随手指移动,距离须减去当前图片宽度乘以当前滚动索引
this.sliderActive.transform = `translate3d(${tranDir}px,0,0)`
}
}
},
continSilder (e) { //结束触摸
e.preventDefault()
e.stopPropagation()
if (e.target != e.currentTarget && this.moveTouch) {
const slideDir = this.moveTouch - this.startTouch
if (slideDir < 0) {
this.nowSlider ++
} else if (slideDir > 0) {
this.nowSlider --
}
this.nowSlider --
this.sliderStart() //立即设置位置
this.moveTouch = 0 //清空手势位置
this.startTouch = 0
this.interTimer = setInterval(()=>{
this.sliderStart()
},3000)
}
},
sliderStart () {
this.nowSlider ++
this.nowSlider %= this.sliderImg.length
if (this.nowSlider === this.bannerlist.length) { //向右滑动到最大值时,将位置初始化并清0 nowSlider
setTimeout(() => { //设置一个定时器,用于异步处理,一个进行尾端拷贝的图片的正常滑动,这个处理在差不多到达时重置,造成无限循环的错觉
this.sliderActive = {
transform: `translate3d(-100vw,0,0)`
}
this.nowSlider = 0
}, 500)
}
if (this.nowSlider === -1) { //向右滑动到最小值时,将位置置为最大值
setTimeout(() => {
this.nowSlider = this.bannerlist.length-1
this.sliderActive = {
transform: `translate3d(${-100*(this.nowSlider+1)}vw,0,0)`
}
}, 500)
}
this.sliderActive = Object.assign({},{
transition:'transform 0.5s',
transform: `translate3d(${-100*(this.nowSlider+1)}vw,0,0)`
})
}
}
2.播放器功能
播放器的所有功能主要依赖vuex(store.js)的控制,由于音乐是在整个app内都播放的,故audio标签放在了App.vue中:
store.js:
APP.vue:
computed : {
audioSrc : function () { //对当前播放的音频切换,放在顶层
const song = this.$store.state.nowsong;
let audioTimer;
if (!song) {
this.$store.state.playing = false
clearInterval(audioTimer)
return null
}
this.$store.state.playing = true
audioTimer = setInterval(()=>{ //每秒获取进度
let audio = document.getElementById('m-audio');
if (audio) {
this.$store.state.audioProgss = audio.currentTime/audio.duration*100+'%'
} else {
clearInterval(audioTimer)
}
},1000)
return `${API.url.getsong}${song.songid}.m4a?fromtag=46` //播放一首歌曲
},
playing : function () {
return this.$store.state.playing
},
},
directives : {
play : { //控制是否播放
update : function(el,binding) {
if (binding.value) {
el.play()
} else {
el.pause()
}
}
}
},
整体项目核心功能介绍到此.有好的建议尽管提哦
本文转载于:使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件
使用Vue2+webpack+Es6快速开发一个移动端项目,封装属于自己的jsonpAPI和手势响应式组件的更多相关文章
- Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案
Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 解决方式:安装 "babel-polyfill" 即可. 命令:npm install --save-dev ...
- 使用.NET Core快速开发一个较正规的命令行应用程序
程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...
- 如何快速开发一个支持高效、高并发的分布式ID生成器
ID生成器是指能产生不重复ID服务的程序,在后台开发过程中,尤其是分布式服务.微服务程序开发过程中,经常会用到,例如,为用户的每个请求产生一个唯一ID.为每个消息产生一个ID等等,ID生成器也是进行无 ...
- 快速开发一个PHP扩展
快速开发一个PHP扩展 作者:heiyeluren时间:2008-12-5博客:http://blog.csdn.net/heiyeshuwu 本文通过非常快速的方式讲解了如何制作一个PHP 5.2 ...
- 基于django快速开发一个网站(一)
基于django快速开发一个网站(一) * 创建虚拟环境.基于虚拟环境创建django==2.0.0和图片加载库和mysql数据库驱动 1. 创建目录并创建虚拟环境 ╰$ mkdir Cornuco ...
- 【移动端 Web】怎么循序渐进地开发一个移动端页面
1. 移动页面开发基础 1.1 像素——什么是像素 像素是 Web 页面布局的基础,那么到底什么才是一个像素呢? 像素:一个像素就是计算机屏幕所能显示一种特定颜色的最小区域.这是像素的概念,实际上,W ...
- 两天快速开发一个自己的微信小程序
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Songti SC" } p.p2 { margin: 0.0px 0. ...
- 快速开发一个自己的微信小程序
一.写在前面 1.为什么要学小程序开发? 对于前端开发而言,微信小程序因为其简单快速.开发成本低.用户流量巨大等特点,也就成了前端开发工程师必会的一个技能. 2.先看看小程序效果 (1)欢迎页 (2) ...
- 有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务
更多云原生技术资讯可关注阿里巴巴云原生技术圈. Puppeteer 是什么? puppeteer 官网的介绍如下: Puppeteer is a Node library which provides ...
随机推荐
- C语言do-while语句
"直到"型 (do-while) 语句的特点: 先执行循环,然后判断条件是否成立.
- 三、Java入门
Java入门 Java的特性和优势 特性 简单 面对对象 可移植性 优势 性能高 分布式(跨平台:Write Once .Run Anywhere) 动态性(反射) 多线程 ...
- 对element-ui的table组件的二次封装
首先,使用过element-ui的table组建的同学都知道,每次使用的时候表头字段都要一个一个的去写,写起来很麻烦,既不美观又浪费时间,基于以上原因,对table组件进行二次封装,使我们在使用的时候 ...
- C++:用字符串数组实现大数运算,以两个不高于40位的大数运算为例。
因为基本数据类型中整型的内存范围有限,所以直接进行大数之间的运算,不仅浪费空间,而且运行缓慢,甚至有些会导致数据溢出. 那怎么办呢? 这时我们就想直接不行,那咱们来间接的. 这就是我们今天主要要讲的: ...
- Python中的super().__init__()
Python里的super().init()有什么用? 简单的说super().__init__(),就是继承父类的init方法,同样可以使用super()去继承其他方法. 下面是三种不同的继承.调用 ...
- 『现学现忘』Docker基础 — 25、Docker镜像讲解
目录 1.镜像是什么 2.Docker镜像获取的方式 3.Docker镜像加载原理 (1)UnionFS(联合文件系统) (2)Docker镜像加载原理 1.镜像是什么 镜像是一种轻量级.可执行的独立 ...
- emu8086实现两位数加法运算
题目说明:给出一个公式,例如 "35 + 28 = ",输出计算结果 一.准备材料 DOS功能调用表:https://blog.csdn.net/mybelief321/artic ...
- 最大连续子序列和(DP)
DP入门_最大连续子序列(最大连续和) Description 有一条崎岖的山路,该山路被分成了n段(1<=n<=100,000),每段山路的驾驶体验不同.作为老司机的刘师傅给每段山路打分 ...
- linux的服务自动启动的配置
1.开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /et ...
- SINAMICS S120的核心控制单元CU320使用教程,电机模块接线
SINAMICS是西门子公司新一代的驱动产品,它正在逐步取代现有的MASTERDRIVES及SIMODRIVE系列的驱动系统.SINAMICS S120是集V/f控制.矢量控制和伺服控制于一体的多轴驱 ...