轮播图组件

<template>
<div class="slider" ref="slider">
<div class="slider-group" ref="sliderGroup">
//这里的<slot></slot>插槽表示里面的内容可以由引用这个轮播图组件的推荐组件来插入 只需要在<slider></slider>标签里面插入内容就可以把slot标签替换掉
<slot></slot>
</div>
<div class="dots"> </div>
</div>
</template>

推荐页面组件

<template>
<div class="recommend">
<div class="recommend-content">
<!-- 因为我们的recommend是通过异步拿到的 可能会有延时 但是如果不加上v-if的话 我们可能在没有拿到数据的情况下就
把插槽插入进去了 那么slider.vue里面的mounted()也就执行了
-->
<div class="slider-wrapper" v-if="recommend.length">
<slider>
<!-- 填写插槽 -->
<div v-for="(item,index) in recommend" :key="index">
<a :href="item.linkUrl">
<img :src="item.picUrl">
</a>
</div>
</slider>
</div>
<div class="recommend-list">
<h1 class="list-title">热门歌单推荐</h1>
<ul></ul>
</div>
</div>
</div>
</template>
<script> import Slider from '../../base/slider/slider.vue'
import {getRecommend} from '../../api/recommend.js'
import { ERR_OK } from '../../api/config.js' export default {
data(){//为了将实例里面的轮播图数据与dom相关 要有一个data()方法
return {
recommend:[]
} },
created(){//一般在这个生命钩子里面加载数据
this._getRecommend()
},
methods:{
_getRecommend(){
getRecommend().then((res)=>{//这个res就是我们抓取到的数据对象 因为getRecommend()方法返回的是一个promise对象 如果promise对象里面执行resolve()成功了 那么就会执行then里面的方法
if(res.code===ERR_OK){
// console.log(res.data.slider)
this.recommend=res.data.slider
}
}) }
},
components:{
     //注册轮播图组件
Slider
}
} </script>

轮播图组件

<script>

//引入better-scroll插件
import BScroll from 'better-scroll' //引入的这个方法是判断元素有没有传入该方法的类名 如果有的话就直接返回 如果没有的话就加上该类名 在轮播图组件中 添加的类名是.slider-item 这个类名的作用是让轮播图浮动 在一行显示
import {addClass} from '../../common/js/dom.js' export default {
data(){
return {
dots:[],//页面上的小点 将实例里面的dots数据与dom相关 需要有data方法 //定义当前是第几页
currentPageIndex:0
}
},
props:{
loop:{
type:Boolean,
default:true
},
autoPlsy:{
type:Boolean,
default:true
},
interval:{//设置轮播时间间隔
type:Number,
default:4000
}
}, //什么时候初始化better-scroll呢?
//如果better-scroll插件有问题可能是渲染时间(如数据还没加载完页面就渲染了)或者页面高度和宽度不对
//所以我们要在mouted()中调用获取轮播图 mounted(){ //知识点:通常我们要保证dom成功渲染的时候可以加个延时
//可以用this.nextstick()
//也可以用setTineout() setTimeout(()=>{//可以延迟20ms 因为一般浏览器加载需要17ms
this._setSliderWidth(); //设置轮播图的宽高等数据 // 这里要在前面渲染好 不然后面获取到的小圆点的数量就是已经经过better-scroll插件复制过的数目 this._initDots();
this._initSlider(); },20) //因为上面有个插槽slot在recommend.vue中插入数据 能够在slider.vue组件中渲染出来
//因为我们mouted()里面的方法是异步的 所以可能在操作dom的时候还没有渲染出来 浏览器就操作了
//所以我们在这里加个延时 就可避免此问题 //我们还要思考一个问题:就是我们mounted()的时候 slot里面的元素有没有 在推荐组件里面判断一下v-if="recommend.length"即可 },
methods:{
_setSliderWidth(){ //获取页面的dom元素的方法 this.$refs.名字 this.children=this.$refs.sliderGroup.children
let width=0
let sliderWidth=this.$refs.slider.clientWidth
console.log('sliderWidth',sliderWidth);//
for(let i=0;i<this.children.length;i++){
let child=this.children[i];
//给每一个dom元素添加类名为slider-item
addClass(child,'slider-item') //设置每一个child的宽度 每个child的宽度就等于总容器的宽度
child.style.width=sliderWidth+'px' //总的图片的宽度 这里后面一定不能加上'px'了 否则就是字符串的相加了
//就拿不到正确的数值了
width+=sliderWidth // console.log('width',width) } if(this.loop){//如果要做到无缝滚动的话 其实是在两侧加上了两张图片的宽度
//所以总的宽度就等于width+=2*sliderWidth 因为这里是用
//let 声明的child 考虑到作用域问题 所以在{}用2倍的sliderWidth比较合适
//sliderWidth就等于每张图片的宽度 width+=2*sliderWidth; } this.$refs.sliderGroup.style.width=width+'px'
// console.log(this.$refs.sliderGroup)
console.log('width....',width) },
//初始化轮播图
_initSlider(){
this.slider=new BScroll(this.$refs.slider,{
scrollX:true,
scrollY:false,
momentum:false,
snap: {
loop: this.loop,
threshold: 0.3,
speed: 400
}
})
}, //初始化dots
_initDots(){
this.dots=new Array(this.$refs.sliderGroup.children.length)
}
}
}
</script>

Vue实现音乐播放器(七):轮播图组件(二)的更多相关文章

  1. js原生选项卡(自动播放无缝滚动轮播图)二

    今天分享一下自动播放轮播图,自动播放轮播图是在昨天分享的轮播图的基础上添加了定时器,用定时器控制图片的自动切换,函数中首先封装一个方向的自动播放工能的小函数,这个函数中添加定时器,定时器中可以放向右走 ...

  2. vue自定义轮播图组件 swiper

    1.banner 组件 components/Banner.vue <!-- 轮播图 组件 --> <template> <div class="swiper- ...

  3. vue移动音乐app开发学习(三):轮播图组件的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  4. 原生JS面向对象思想封装轮播图组件

    原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...

  5. Vue2 轮播图组件 slide组件

    Vue2原生始轮播图组件,支持宽度自适应.高度设置.轮播时间设置.左右箭头按钮控制,圆点按钮切换,以及箭头.圆点按钮是否显示. <v-carousel :slideData="slid ...

  6. 使用原生js将轮播图组件化

    代码地址如下:http://www.demodashi.com/demo/11316.html   这是一个轮播图组件,这里是代码地址,需要传入容器的id和图片地址,支持Internet Explor ...

  7. bootstrap轮播图组件

    一.轮播图组件模板(官方文档) <div id="carousel-example-generic" class="carousel slide" dat ...

  8. reactjs-swiper react轮播图组件基于swiper

    react轮播图组件基于swiper demo地址:http://reactjs-ui.github.io/reactjs-swiper/simple.html 1. 下载安装 npm install ...

  9. 03 uni-app框架学习:轮播图组件的使用

    1.轮播图组件的使用 参照官方文档 2.在页面上加入这个组件 3.在页面中引去css样式 并编写样式 ps:upx单位是什么 简单来说 就相当于小程序中的rpx 是一个自适应的单位 会根据屏幕宽度自动 ...

随机推荐

  1. Python 矩阵(线性代数)

    Python 矩阵(线性代数) 这里有一份新手友好的线性代数笔记,是和深度学习花书配套,还被Ian Goodfellow老师翻了牌. 笔记来自巴黎高等师范学院的博士生Hadrien Jean,是针对& ...

  2. Python和Js打印心形

    看到一行Python写的代码,会用LovePython输出心形: print('\n'.join([''.join([('LovePython'[(x-y)%10]if((x*0.05)**2+(y* ...

  3. media查询(来源于bootstrap)

    /* 大屏幕 */@media (min-width: 1200px) { ... } /* 平板电脑和小屏电脑之间的分辨率 */@media (min-width: 768px) and (max- ...

  4. Redis主从架构核心原理

    Redis-Cluster工作原理: redis集群内置了16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果 ...

  5. spring boot 枚举使用的坑2

    上一篇说到在枚举当在controller的方法做参数时的坑,解决方法是配置了一个converter,后来想想,如果不闲每次都加一个注解麻烦的话,可以在参数前面加一个注解,添加一个解析器应该也可以解决这 ...

  6. STM32 时钟系统

    1.在 STM32F4 中,有 5 个最重要的时钟源,为 HSI.HSE.LSI.LSE.PLL.其中 PLL 实际是分为两个时钟源,分别为主 PLL 和专用 PLL. 2.   ①.LSI 是低速内 ...

  7. css3 transform中的matrix矩阵

    CSS3中的矩阵CSS3中的矩阵指的是一个方法,书写为matrix()和matrix3d(),前者是元素2D平面的移动变换(transform),后者则是3D变换.2D变换矩阵为3*3, 如上面矩阵示 ...

  8. IP地址与子网掩码逐位相与

    逐位相与说的其实就是子网掩码与网络地址相同位置的数字相加,当和为2的时候该位置写作1,否则的话写作0

  9. 如何用git将本地代码上传github

    其实去年就用github了,但是毕竟也只是在上面搜索一些工作的难点和自我学习,自己都没有贡献过代码,觉得确实很low,知道今天自己用了2周左右的时间开发了 微信小程序,有了自己的贡献代码,所以想上传到 ...

  10. SQLAlchemy 增删改查 一对一 多对多

    首先要导入SQLAIchemy模块 from sqlalchemy.ect.declaative import declarative_base 创建orm基类 Base = declarative_ ...