<template> <view :data-theme="theme"> <skeleton :show="showSkeleton" :isNodes="isNodes" ref="skeleton" loading="chiaroscuro" selector="skeleton" bgcolor="#FFF"></skeleton> <view class='newsList skeleton' :style="{visibility: showSkeleton ? 'hidden' : 'visible'}"> <view class='swiper skeleton-rect' v-if="imgUrls.length > 0"> <swiper indicator-dots="true" :autoplay="autoplay" :circular="circular" :interval="interval" :duration="duration" indicator-color="rgba(102,102,102,0.3)" indicator-active-color="#666"> <block v-for="(item,index) in imgUrls" :key="index"> <swiper-item> <navigator :url="'/pages/news_details/index?id='+item.id"> <image :src="item.imageInput" class="slide-image" mode="aspectFill" /> </navigator> </swiper-item> </block> </swiper> </view> <view class='nav'> <scroll-view class="scroll-view_x" scroll-x scroll-with-animation :scroll-left="scrollLeft" style="width:auto;overflow:hidden;"> <block v-for="(item,index) in navList" :key="index"> <view class='item borRadius14 skeleton-rect' :class='active==item.id?"on":""' @click='tabSelect(item.id, index)'> <view>{{item.name}}</view> <view class='line bg_color' v-if="active==item.id"></view> </view> </block> </scroll-view> </view> <view class='list'> <block v-for="(item,index) in articleList" :key="index"> <view class='item acea-row row-between-wrapper' @click="toNewDetail(item.id)"> <view class='text acea-row row-column-between'> <view class='name line2 skeleton-rect'>{{item.title}}</view> <view class="skeleton-rect">{{item.createTime}}</view> </view> <view class='pictrue skeleton-rect'> <image :src='item.imageInput'></image> </view> </view> </block> </view> </view> <view class='noCommodity' v-if="articleList.length == 0 && (page != 1 || active== 0) && isShow"> <view class='pictrue'> <image src='../../static/images/noNews.png'></image> </view> </view> </view> </template> <script> import { getArticleCategoryList, getArticleList, getArticleHotList, getArticleBannerList, } from '@/api/api.js'; import animationType from '@/utils/animationType.js' let app = getApp(); export default { data() { return { showSkeleton: true, //骨架屏显示隐藏 isNodes: 0, //控制什么时候开始抓取元素节点,只要数值改变就重新抓取 imgUrls: [{imageInput:''}], articleList: [{imageInput:'',title: '占位占位',createTime:'占位'}], indicatorDots: false, circular: true, autoplay: true, interval: 3000, duration: 500, navList: [{id:0,name:'占位'},{id:0,name:'占位'},{id:0,name:'占位'}], active: 0, page: 1, limit: 8, status: false, scrollLeft: 0, isShow: false, theme:app.globalData.theme, }; }, onLoad(){ setTimeout(() => { //this.couponsList = [{name:''}] this.isNodes++; // #ifdef H5 this.setShare(); // #endif }, 500); this.getArticleHot(); this.getArticleBanner(); this.getArticleCate(); this.status = false; this.page = 1; //this.articleList = []; this.getCidArticle(); }, /** * 生命周期函数--监听页面显示 */ onShow: function() { // this.getArticleHot(); // this.getArticleBanner(); // this.getArticleCate(); // this.status = false; // this.page = 1; // //this.articleList = []; // this.getCidArticle(); }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { this.getCidArticle(); }, methods: { getArticleHot: function() { let that = this; getArticleHotList().then(res => { that.$set(that, 'articleList', res.data.list); }); }, getArticleBanner: function() { let that = this; getArticleBannerList().then(res => { that.imgUrls = res.data.list; setTimeout(() => { this.showSkeleton = false }, 1000) }); }, getCidArticle: function() { let that = this; if (that.active == 0) return; let limit = that.limit; let page = that.page; let articleList = that.articleList; if (that.status) return; getArticleList(that.active, { page: page, limit: limit }).then(res => { let articleListNew = []; let len = res.data.list.length; articleListNew = articleList.concat(res.data.list); that.page++; that.$set(that, 'articleList', articleListNew); that.status = limit > len; that.page = that.page; that.isShow = true; }); }, getArticleCate: function() { let that = this; getArticleCategoryList().then(res => { let list = res.data.list; list.unshift({id:0,name:'热门'}); that.$set(that, 'navList', list); setTimeout(() => { this.showSkeleton = false }, 1000) }); }, tabSelect(active,e) { this.active = active; this.scrollLeft = e * 60; // this.scrollLeft = (active - 1) * 50; if (this.active == 0) this.getArticleHot(); else { this.$set(this, 'articleList', []); this.page = 1; this.status = false; this.getCidArticle(); } }, // '"/pages/news_details/index?id="+item.id' toNewDetail(id){ uni.navigateTo({ animationType: animationType.type, animationDuration: animationType.duration, url:"/pages/news_details/index?id="+id }) }, setShare: function() { this.$wechat.isWeixin() && this.$wechat.wechatEvevt([ "updateAppMessageShareData", "updateTimelineShareData", "onMenuShareAppMessage", "onMenuShareTimeline" ], { desc: this.articleList[0].title, title: this.articleList[0].title, link: location.href, imgUrl:this.articleList[0].imageInput }).then(res => { }).catch(err => { console.log(err); }); }, } } </script> <style lang="scss"> page { background-color: #fff !important; } .newsList .swiper { width: 100%; position: relative; box-sizing: border-box; padding: 0 30rpx; } .newsList .swiper swiper { width: 100%; height: 365rpx; position: relative; } .newsList .swiper .slide-image { width: 100%; height: 335rpx; border-radius: 14rpx; } // #ifdef MP-WEIXIN .newsList .swiper .wx-swiper-dot { width: 12rpx !important; height: 12rpx !important; border-radius: 0; transform: rotate(-45deg); transform-origin: 0 100%; } .newsList .swiper .wx-swiper-dot~.wx-swiper-dot { margin-left: 5rpx; } .newsList .swiper .wx-swiper-dots.wx-swiper-dots-horizontal { margin-bottom: -15rpx; } // #endif // #ifdef APP-PLUS || H5 .newsList .swiper .uni-swiper-dot { width: 12rpx !important; height: 12rpx !important; border-radius: 0; transform: rotate(-45deg); transform-origin: 0 100%; } .newsList .swiper .uni-swiper-dot~.uni-swiper-dot { margin-left: 5rpx; } .newsList .swiper .uni-swiper-dots.uni-swiper-dots-horizontal { margin-bottom: -15rpx; } // #endif .newsList .nav { padding: 0 24rpx; width: 100%; white-space: nowrap; box-sizing: border-box; margin-top: 43rpx; } .newsList .nav .item { display: inline-block; font-size: 32rpx; color: #999; } .newsList .nav .item.on { color: #282828; } .newsList .nav .item~.item { margin-left: 46rpx; } .newsList .nav .item .line { width: 24rpx; height: 4rpx; border-radius: 2rpx; margin: 10rpx auto 0 auto; @include main_bg_color(theme); } .newsList .list .item { margin: 0 24rpx; border-bottom: 1rpx solid #f0f0f0; padding: 35rpx 0; } .newsList .list .item .pictrue { width: 250rpx; height: 156rpx; } .newsList .list .item .pictrue image { width: 100%; height: 100%; border-radius: 14rpx; } .newsList .list .item .text { width: 420rpx; height: 156rpx; font-size: 24rpx; color: #999; } .newsList .list .item .text .name { font-size: 30rpx; color: #282828; } .newsList .list .item .picList .pictrue { width: 335rpx; height: 210rpx; margin-top: 30rpx; } .newsList .list .item .picList.on .pictrue { width: 217rpx; height: 136rpx; } .newsList .list .item .picList .pictrue image { width: 100%; height: 100%; border-radius: 6rpx; } .newsList .list .item .time { text-align: right; font-size: 24rpx; color: #999; margin-top: 22rpx; } </style>