为什么刷新可以更新幻灯片,下拉就不可以,我找不到哪里有错误

来源: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

同学你好, 如下所示, 应该先判断是否开启上拉, 如果开启上拉,就不执行后面的语句了, 建议修改:

http://img.mukewang.com/climg/5d6cae5b000144b803500141.jpg

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~~

0

宗桦

提问者

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>


0

好帮手慕慕子

2019-09-02

同学你好, 老师在源码中测试你粘贴的这部分代码, 下拉是可以更新幻灯片的, 所以说不是这个文件的问题, 建议: 同学对比检查一下scroll/index.vue文件哦

如果还有疑惑, 可以将你的scroll下的index.vue文件也粘贴过来, 便于老师高效的为你解决问题

如果帮助到了你, 欢迎采纳!

祝学习愉快~~~

0

0 学习 · 3299 问题

查看课程