为什么刷新可以更新幻灯片,下拉就不可以,我找不到哪里有错误
来源:5-3 更新幻灯片
宗桦
2019-09-02 00:41:11
home下的index.vue
<template>
<div class="home">
<header class="g-header-container">
<home-header></home-header>
</header>
<me-scroll
:data="recommends"
pullDown
@pull-down="pullToRefresh"
>
<home-slider ref="slider"></home-slider>
<home-nav></home-nav>
<home-recommend @loaded="getRecommends"></home-recommend>
</me-scroll>
<div class="g-backtop-container"></div>
<router-view></router-view>
</div>
</template>
<script>
import HomeHeader from './header';
import HomeSlider from './slider';
import MeScroll from 'base/scroll';
import HomeNav from './nav';
import HomeRecommend from './recommend';
export default{
name:'Home',
components:{
MeScroll,
HomeHeader,
HomeSlider,
HomeNav,
HomeRecommend
},
data(){
return{
recommends:[]
};
},
methods:{
updateScroll(){
},
getRecommends(recommends){
this.recommends = recommends;
},
pullToRefresh(end){//下拉刷新
this.$refs.slider.update().then(end);
// setTimeout(() => {
// console.log('下拉刷新');
// end();
// },1000);
}
}
};
</script>
<style lang="scss" scoped>
@import "~assets/scss/mixins";
.home{
overflow: hidden;
width:100%;
height:100%;
background-color:$bgc-theme;
}
</style>home下的slider.vue
<template>
<!-- 传参 -->
<div class="slider-wrapper">
<!-- 意思是没有数据才懒加载 -->
<me-loading inline v-if="!sliders.length"></me-loading>
<!-- else就直接输出数据-->
<me-slider
:data="sliders"
:direction="direction"
:loop="loop"
:interval="interval"
:pagination="pagination"
v-else
>
<!-- 这里直接写就会直接写到插槽位置 -->
<swiper-slide
v-for="(item,index) in sliders"
:key="index"
>
<a :href="item.linkUrl" class="slider-link">
<img :src="item.picUrl" alt class="slider-img" />
</a>
</swiper-slide>
</me-slider>
</div>
</template>
<script>
import MeSlider from "base/slider";
// 业务组件
import { swiperSlide } from "vue-awesome-swiper";
// 配置文件
import { sliderOptions } from "./config";
//用axio插件来引入服务器上的数据,这个是要写的引入文件,不然校验不通过
import {getHomeSlider} from "api/home";
import MeLoading from 'base/loading';
export default {
name: "HomeSlider",
components: {
MeSlider,
MeLoading,
swiperSlide
},
data() {
return {
direction: sliderOptions.direction,
loop: sliderOptions.loop,
interval: sliderOptions.interval,
pagination: sliderOptions.pagination,
sliders: []// 这是空数组的初始值
};
},
created(){////用axio插件,获取远程数据
this.getSliders();//这是自己写的一个函数
},
methods: {//获取数据,然后赋值给sliders
//外部接口API
update(){
return this.getSliders();
},
getSliders(){
return getHomeSlider().then(data =>{
this.sliders = data;
});
}
}
};
</script>
<style lang="scss" scoped>
.slider-wrapper {
height: 183px;
}
.slider-link {
display: block;
}
.slider-link,
.slider-img {
width: 100%;
height: 100%;
}
</style>base下的slider/index.vue
<template>
<!-- 基础组件第二步,写组件标签,和插槽,还有分页器 -->
<swiper :options="swiperOption" :key="keyId">
<!-- 插槽 -->
<slot></slot>
<!-- 分页器 -->
<div class="swiper-pagination" v-if="pagination" slot="pagination"></div>
</swiper>
</template>
<script>
//基础组件第一部,引入swiper
import { swiper } from "vue-awesome-swiper";
export default {
name: "MeSlider",
components: {
swiper
},
// 接收参数
props: {
// 滑动的方向
direction: {
type: String,
default: "horizontal", //水平
validator(value) {
//验证,value是自己返回来的值,大于-1,就是这个两个值之一
return [
"horizontal",
"vertical"
].indexOf(value) > -1;
}
},
//控制自动轮播和轮播速度
interval: {
type: Number,
default: 3000,
validator(value) {
//验证,值必须大于等于0
return value >= 0;
}
},
//无缝滚动
loop: {
type: Boolean,
default: true
},
//分页器
pagination: {
type: Boolean,
default: true
},
data:{
type:Array,
default(){
return [];
}
}
},
data(){
return{
keyId:Math.random(),
swiperOption:{
watchOverflow:true,//只有1个slide(非loop),swiper会失效且隐藏导航
direction:this.direction,
autoplay:this.interval?{//如果不为真就根本不开启自动轮播
delay:this.interval,
disableOnInteraction:false//一旦用户有交互就停止了自动轮播,false表示不停止
}:false,
slidesPerView:1,//设置slider容器能够同时显示的slider数量
loop:this.loop,//无缝滚动
pagination:{//分页器
el:this.pagination ? '.swiper-pagination' : null
}
}
};
},
//监听
watch:{
data(newData){
if(newData.length === 0){
return;
}
this.keyId = Math.random();
}
}
};
</script>
<style lang="scss" scoped>
.swiper-container{
width:100%;
height:100%;
}
</style>api下的home.js
import axios from 'axios';
import jsonp from 'assets/js/jsonp';
import {SUCC_CODE,TIMEOUT,HOME_RECOMMEND_PAGE_SIZE,jsonpOptions} from './config';
//获取幻灯片数据--ajax
//打乱数组的顺序
const shuffle = (arr) =>{
const arrLength = arr.length;
let i = arrLength;
let rndNum;//当前的索引
while(i--){
if(i !==(rndNum = Math.floor(Math.random()*arrLength))){
[arr[i],arr[rndNum]] = [arr[rndNum],arr[i]];
}
}
return arr;
};
export const getHomeSlider = () => {
return axios.get('http://www.imooc.com/api/home/slider',{
timeout:TIMEOUT
}).then(res => {
//看看是否成功,成功的CODE数据是等于0
if(res.data.code === SUCC_CODE){
let sliders = res.data.slider;//下拉刷新
const slider = [sliders[Math.floor(Math.random()*sliders.length)]];
sliders = shuffle(sliders.filter(() =>Math.random() >=0.5));//filter会遍历数组每一个值,50%,筛选里面的值,返回的是真就保留假就剔除
if(sliders.length === 0){//万一全被删了,就把一张的赋值给sliders,这就是为什么取一张的原因
sliders = slider;
}
return sliders;
}
// 错误处理
throw new Error('没有成功获取到数据!');
}).catch(err => {//catch可以捕获到所有错误
if(err){
console.log(err);
}
//如果超时错误,或有其他错误,则返回一张图片
return [{
linkUrl:"https://www.imooc.com",
picUrl:require('assets/img/404.png')
}
];//延迟
}).then(data => {
return new Promise(resolve =>{
setTimeout(()=>{
resolve(data)
},1000);
})
});
};
//获取热门的推荐数据--jsonp page=1是第一页,psize是每页20条
export const getHomeRecommend = (page =1,psize=HOME_RECOMMEND_PAGE_SIZE) =>{
const url = 'https://ju.taobao.com/json/tg/ajaxGetItemsV2.json';
const params = {//参数
page,
psize,
type:0,//默认的
frontCatId:''
};
return jsonp(url,params,jsonpOptions).then(res =>{
if(res.code === '200'){
return res;
}
throw new Error('没有成功获取到数据!');
}).catch(err => {//catch可以捕获到所有错误,如果获取数据成功不会走这一步
if(err){
console.log(err);
}
}).then(data => {//获取数据成功会走这一步,然后会吧44行的res传到data来
return new Promise(resolve =>{
setTimeout(()=>{
resolve(data)
},1000);
})
});
};3回答
同学你好, 如下所示, 应该先判断是否开启上拉, 如果开启上拉,就不执行后面的语句了, 建议修改:

如果帮助到了你, 欢迎采纳!
祝学习愉快~~~~
宗桦
提问者
2019-09-02
<template>
<!-- 滚动条swiper的参数 -->
<swiper :options="swiperOption" ref="swiper">
<div class="mine-scroll-pull-down" v-if="pullDown">
<me-loading :text="pullDownText" inline ref="pullDownLoading"></me-loading>
</div>
<swiper-slide>
<slot></slot>
</swiper-slide>
<div class="mine-scroll-pull-up" v-if="pullUp">
<me-loading :text="pullUpText" inline ref="pullUpLoading"></me-loading>
</div>
<div class="swiper-scrollbar" v-if="scrollbar" slot="scrollbar"></div>
</swiper>
</template>
<script>
//滚动条要引入swiper插件
import {swiper,swiperSlide} from 'vue-awesome-swiper';
import MeLoading from 'base/loading';
import {
PULL_DOWN_HEIGHT,
PULL_DOWN_TEXT_INIT,
PULL_DOWN_TEXT_START,
PULL_DOWN_TEXT_ING,
PULL_DOWN_TEXT_END,
PULL_UP_HEIGHT,
PULL_UP_TEXT_INIT,
PULL_UP_TEXT_START,
PULL_UP_TEXT_ING,
PULL_UP_TEXT_END
} from './config';
export default {
name: "MeScroll",
components:{
swiper,
swiperSlide,
MeLoading
},
props:{
scrollbar:{
type:Boolean,
default:true
},
data:{
type:[Array,Object]
},
pullDown:{
type:Boolean,
default:false
},
pullUp:{//接收参数
type:Boolean,
default:false
}
},//配置参数
data(){
return{
pulling:false,//是否正在下拉或上拉,默认是false
pullDownText:PULL_DOWN_TEXT_START,
pullUpText:PULL_DOWN_TEXT_INIT,
swiperOption:{
direction:'vertical',
slidesPerView:'auto',
freeMode:true,
setWrapperSize:true,
scrollbar:{
el:this.scrollbar ? '.swiper-scrollbar' :null,
hide:true
},
on:{//触发事件,swiper提供的触发事件
sliderMove:this.scroll,//执行scroll(),第74行代码
touchEnd:this.touchEnd
}
}
};
},
watch:{//监测data的变化,有变化就更新滚动条
data(){
this.update();
}
},
methods:{
update(){//外部共用的API,更新滚动条
this.$refs.swiper && this.$refs.swiper.swiper.update();
},
//内部自己使用的
scroll(){
const swiper = this.$refs.swiper.swiper;
if(this.pulling){
return;
}
if(swiper.translate >0 ){
if(!this.pullDown){
return;
}
if(swiper.translate> PULL_DOWN_HEIGHT){
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_START)
}else{
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_INIT)
}
}else if(swiper.isEnd){//判断上拉是否到了底部
if(!this.pullUp){
return;
}
const isPullUp = Math.abs(swiper.translate) + swiper.height - PULL_UP_HEIGHT > parseInt(swiper.$wrapperEl.css('height'));//判断是否达到了上拉触发条件
if(isPullUp){
this.$refs.pullUpLoading.setText(PULL_UP_TEXT_START);//超过了上拉的高度就替换文字
}else{
this.$refs.pullUpLoading.setText(PULL_UP_TEXT_INIT);//否则会回到初始值
}
}
},
touchEnd(){
if(this.pullDown){
return;
}
const swiper = this.$refs.swiper.swiper;
if(swiper.translate > PULL_DOWN_HEIGHT){//超过高度可以下拉
if(!this.pullDown){
return;
}
this.pulling = true;
swiper.allowTouchMove = false;//下拉的时候禁止触摸
swiper.setTransition(swiper.params.speed);//设置初始速度
swiper.setTranslate(PULL_DOWN_HEIGHT);//拖过了要回到100的高度
swiper.params.virtualTranslate = true;//定住不给回弹
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_ING);
this.$emit('pull-down',this.pullDownEnd);
}else if (swiper.isEnd){
const totalHeight = parseInt(swiper.$wrapperEl.css('height'));
const isPullUp = Math.abs(swiper.translate) + swiper.height - PULL_UP_HEIGHT > totalHeight;
if(isPullUp){
if(!this.pullUp){
return;
}
this.pulling = true;//设为真,正在加载中,不能够继续加载
swiper.allowTouchMove = false;//禁止触摸
swiper.setTransition(swiper.params.speed);//回弹
swiper.setTranslate(-(totalHeight + PULL_UP_HEIGHT - swiper.height));//回弹
swiper.params.virtualTranslate=true;//定住不给回弹
this.$refs.pullUpLoading.setText(PULL_UP_TEXT_ING);
this.$emit('pull-up',this.pullUpEnd);//pullUpEnd是吧之前设置的值还原一下,这样才能进行下一次的下拉加载更多
}
}
},
pullDownEnd(){//加载完后
const swiper = this.$refs.swiper.swiper;
this.pulling = false;
this.$refs.pullDownLoading.setText(PULL_DOWN_TEXT_END);//可以回弹
swiper.params.virtualTranslate=false;//可以触摸
swiper.allowTouchMove=true;
swiper.setTransition(swiper.params.speed);
swiper.setTranslate(0);
},
pullUpEnd(){
const swiper = this.$refs.swiper.swiper;
this.pulling = false;
this.$refs.pullUpLoading.setText(PULL_UP_TEXT_END);
swiper.params.virtualTranslate=false;
swiper.allowTouchMove = true;
}
}
};
</script>
<style lang="scss" scoped>
.swiper-container{
overflow:hidden;
width: 100%;
height:100%;
}
.swiper-slide{
height:auto;
}
.mine-scroll.pull-up,
.mine-scroll-pull-down{
position: absolute;
left: 0;
width: 100%;
}
.mine-scroll-pull-down{
bottom:100%;
height:80px;
}
.mine-scroll.pull-up{
top:100%;
height:30px;
}
</style>
好帮手慕慕子
2019-09-02
同学你好, 老师在源码中测试你粘贴的这部分代码, 下拉是可以更新幻灯片的, 所以说不是这个文件的问题, 建议: 同学对比检查一下scroll/index.vue文件哦
如果还有疑惑, 可以将你的scroll下的index.vue文件也粘贴过来, 便于老师高效的为你解决问题
如果帮助到了你, 欢迎采纳!
祝学习愉快~~~
相似问题