123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- <!-- 在这个文件对每个tab对应的列表进行渲染 -->
- <template>
- <view class="content">
- <!-- 这里设置了z-paging加载时禁止自动调用reload方法,自行控制何时reload(懒加载)-->
- <z-paging
- ref="paging"
- v-model="dataList"
- @query="queryList"
- use-page-scroll
- :hide-empty-view="hideEmptyView"
- :refresher-enabled="false"
- @contentHeightChanged="contentHeightChanged"
- :loading-full-fixed="true"
- :auto="false"
- :auto-clean-list-when-reload="false"
- >
- <!-- 如果希望其他view跟着页面滚动,可以放在z-paging标签内 -->
- <view class="item" v-for="(item, index) in dataList" :key="index" @click="toDetail(item.id)">
- <view class="itemTitle">
- {{ formatTitle(item.title) }}
- <text v-if="item.title.length > 90" class="allContent">全文</text>
- </view>
- <view class="resources" v-if="item.clueInfoList.length <= 1">
- <view
- class="resourcesItem resourcesItemOne"
- v-for="items in item.clueInfoList"
- :key="items.id"
- >
- <image v-if="items.type == '1'" class="logo" :src="items.localUrl"></image>
- <image v-if="items.type == '2'" class="logo" src="../../static/image/video.png"></image>
- <image v-if="items.type == '3'" class="logo" src="../../static/image/music.png"></image>
- <image
- v-if="items.type == 2 || items.type == 3"
- src="../../static/image/playBtn.png"
- class="playBtn"
- ></image>
- </view>
- </view>
- <view class="resources" v-else>
- <view
- class="resourcesItem resourcesItems"
- v-for="items in item.clueInfoList"
- :key="items.id"
- >
- <image v-if="items.type == '1'" class="logo" :src="items.localUrl"></image>
- <image v-if="items.type == '2'" class="logo" src="../../static/image/video.png"></image>
- <image v-if="items.type == '3'" class="logo" src="../../static/image/music.png"></image>
- <image
- v-if="items.type == 2 || items.type == 3"
- src="../../static/image/playBtn.png"
- class="playBtn"
- ></image>
- </view>
- <view
- class="resourcesItem resourcesItems"
- v-if="item.clueInfoList.length % 3 == 2"
- ></view>
- </view>
- <view class="bottomBox">
- <view class="timeBox">{{ item.modifyTime }}</view>
- </view>
- <view class="seat"></view>
- </view>
- </z-paging>
- </view>
- </template>
- <script>
- import { findPage } from '../../network/api.js';
- export default {
- data() {
- return {
- //v-model绑定的这个变量不要在分页请求结束中自己赋值!!!
- dataList: [],
- height: 0,
- hideEmptyView: true,
- completeFunc: null
- };
- },
- props: {
- //当前组件的index,也就是当前组件是swiper中的第几个
- tabIndex: {
- type: Number,
- default: function() {
- return 0;
- }
- },
- //当前swiper切换到第几个index
- currentIndex: {
- type: Number,
- default: function() {
- return 0;
- }
- },
- phone: {
- type: String,
- default: function() {
- return '';
- }
- }
- },
- watch: {
- currentIndex: {
- handler(newVal) {
- if (newVal === this.tabIndex) {
- //懒加载,当滑动到当前的item时,才去加载
- setTimeout(() => {
- this.$refs.paging.reload();
- }, 100);
- }
- },
- immediate: true
- }
- },
- methods: {
- toDetail(id) {
- uni.navigateTo({
- url: `../../pages/newsDetail/newsDetail?id=${id}`
- });
- },
- formatTitle(title) {
- return title.length > 105 ? title.substring(0, 104) + '...' : title;
- },
- queryList(pageNo, pageSize) {
- //组件加载时会自动触发此方法,因此默认页面加载时会自动触发,无需手动调用
- //这里的pageNo和pageSize会自动计算好,直接传给服务器即可
- //模拟请求服务器获取分页数据,请替换成自己的网络请求
- let statusType = [1, 0];
- const params = {
- pageNumber: pageNo,
- pageSize: pageSize,
- ascription: 1,
- status: statusType[this.tabIndex],
- phone: this.phone
- };
- findPage(params).then(
- res => {
- if (res.data.state == 200) {
- let data = res.data.data.pageRecords.map(item => {
- item.clueInfoList = item.clueInfoList.filter(i => {
- return i.type !== 0;
- });
- return item;
- });
- console.log(data);
- this.$refs.paging.complete(data);
- } else {
- this.$refs.paging.complete([]);
- }
- this.hideEmptyView = false;
- //请求结束,调用父组件的下拉刷新结束回调函数,使得父组件中的z-paging下拉刷新结束
- if (this.completeFunc) {
- this.completeFunc();
- }
- },
- error => {
- this.$refs.paging.complete(false);
- if (this.completeFunc) {
- this.completeFunc();
- }
- }
- );
- },
- //页面通知当前子组件刷新列表
- reload(completeFunc) {
- //先把父组件下拉刷新的回调函数存起来
- this.completeFunc = completeFunc;
- //调用z-paging的reload方法
- this.$refs.paging.reload();
- },
- //当列表高度改变时,通知页面的swiper同步更改高度
- contentHeightChanged(height) {
- const finalHeight = this.dataList.length ? height : 0;
- this.$emit('heightChanged', finalHeight);
- },
- //页面通知当前子组件加载更多数据
- doLoadMore() {
- this.$refs.paging.doLoadMore();
- },
- //页面通知当前子组件清除数据
- clear() {
- this.$refs.paging.clear();
- this.hideEmptyView = true;
- }
- }
- };
- </script>
- <style scoped lang="scss">
- /* 注意,1、父节点需要固定高度,z-paging的height:100%才会生效 */
- /* 注意,2、请确保z-paging与同级的其他view的总高度不得超过屏幕宽度,以避免超出屏幕高度时页面的滚动与z-paging内部的滚动冲突 */
- .content {
- height: 100%;
- }
- .item {
- .seat {
- height: 8px;
- width: 100%;
- background-color: #f7f7f9;
- }
- position: relative;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- padding: 0rpx 30rpx;
- margin-top: 16px;
- .itemTitle {
- font-size: 14px;
- position: relative;
- .allContent {
- position: absolute;
- bottom: 0;
- right: 0;
- color: #2468f2;
- z-index: 10;
- background-color: #ffffff;
- }
- }
- .resources {
- display: flex;
- flex-wrap: wrap;
- margin-top: 8px;
- justify-content: space-between;
- .resourcesItem {
- border-radius: 5px;
- overflow: hidden;
- position: relative;
- margin-bottom: 5px;
- .logo {
- width: 100%;
- height: 100%;
- }
- .playBtn {
- width: 26rpx;
- height: 26rpx;
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- }
- }
- .resourcesItemOne {
- width: 686rpx;
- height: 386rpx;
- }
- .resourcesItems {
- width: 218rpx;
- height: 218rpx;
- }
- }
- .bottomBox {
- margin: 16px 0;
- display: flex;
- align-items: center;
- font-size: 12px;
- color: #5c5f66;
- }
- }
- .item-detail {
- padding: 5rpx 15rpx;
- border-radius: 10rpx;
- font-size: 28rpx;
- color: white;
- background-color: #007aff;
- }
- .item-line {
- position: absolute;
- bottom: 0rpx;
- left: 0rpx;
- height: 1px;
- width: 100%;
- background-color: #eeeeee;
- }
- </style>
|