151 lines
4.8 KiB
Vue
151 lines
4.8 KiB
Vue
<template>
|
||
<view class="topic">
|
||
<view class="header flex row-between">
|
||
<view class="normal lg bold"># {{ topicName }}</view>
|
||
<view class="flex">
|
||
<image src="/bundle_b/static/icon_see.png"></image>
|
||
<text class="lighter sm m-l-10">{{ click }}</text>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- Menu -->
|
||
<view class="menu flex">
|
||
<view class="menu--item" :class="{'active': sortHot}" @click="handleSortHot">最热</view>
|
||
<view class="menu--item" :class="{'active': sortNew}" @click="handleSortNew">最新</view>
|
||
</view>
|
||
|
||
<view>
|
||
<view v-if="lists.length">
|
||
<u-waterfall ref="uWaterfall" v-model="lists" :add-time="200">
|
||
<template v-slot:left="{leftList}">
|
||
<view style="padding:0 9rpx 0 30rpx">
|
||
<community-list width="336rpx" type="waterfall" :list="leftList"></community-list>
|
||
</view>
|
||
</template>
|
||
<template v-slot:right="{rightList}">
|
||
<view style="padding:0 30rpx 0 9rpx;">
|
||
<community-list width="336rpx" type="waterfall" :list="rightList"></community-list>
|
||
</view>
|
||
</template>
|
||
</u-waterfall>
|
||
</view>
|
||
<view class="p-t-60" v-else>
|
||
<view class="flex row-center m-t-40">
|
||
<u-image width="300" height="300" :src="'/bundle_b/static/works_null.png'"></u-image>
|
||
</view>
|
||
<view class="text-center muted m-t-40">
|
||
暂无话题文章~
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import {
|
||
getCommunityTopicArticle
|
||
} from "@/api/community.js"
|
||
export default {
|
||
data() {
|
||
return {
|
||
topicId: '',
|
||
topicName: '',
|
||
sortHot: true,
|
||
sortNew: false,
|
||
lists: [],
|
||
click: 0, //查看|点击数
|
||
page: 1,
|
||
more: 1,
|
||
pageSize: 10
|
||
}
|
||
},
|
||
onLoad() {
|
||
const options = this.$Route.query;
|
||
this.topicId = options.id || '';
|
||
this.topicName = options.name || '';
|
||
},
|
||
onShow() {
|
||
this.getCommunityTopic()
|
||
},
|
||
// 触底加载
|
||
onReachBottom() {
|
||
console.log('触底')
|
||
if (this.more) {
|
||
this.getCommunityTopic()
|
||
}
|
||
},
|
||
methods: {
|
||
handleSortHot() {
|
||
this.sortHot = !this.sortHot
|
||
this.page = 1;
|
||
this.getCommunityTopic()
|
||
},
|
||
handleSortNew() {
|
||
this.sortNew = !this.sortNew
|
||
this.page = 1;
|
||
this.getCommunityTopic()
|
||
},
|
||
// 获取
|
||
getCommunityTopic() {
|
||
getCommunityTopicArticle({
|
||
topic_id: this.topicId,
|
||
sort_hot: this.sortHot ? 'desc' : 'asc',
|
||
sort_new: this.sortNew ? 'desc' : 'asc',
|
||
page_no: this.page,
|
||
page_size: this.pageSize,
|
||
}).then(res => {
|
||
// 如果是第一页需手动置空列表
|
||
if (this.page == 1) {
|
||
if('uWaterfall' in this.$refs) this.$refs.uWaterfall.clear()
|
||
this.lists = []
|
||
}
|
||
if (res.data.more === 1) {
|
||
this.page += 1
|
||
}
|
||
this.click = res.data.click
|
||
this.more = res.data.lists.more;
|
||
// 异步:让vue能够监听到数据改变过了
|
||
setTimeout(() => {
|
||
this.lists = [...this.lists, ...res.data.lists.list]
|
||
}, 0)
|
||
})
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
page {
|
||
background-color: #FFFFFF;
|
||
}
|
||
|
||
.topic {
|
||
.header {
|
||
padding: 40rpx 40rpx 30rpx 30rpx;
|
||
border-top: 1px solid $-color-body;
|
||
border-bottom: 1px solid $-color-body;
|
||
|
||
image {
|
||
width: 42rpx;
|
||
height: 42rpx;
|
||
}
|
||
}
|
||
|
||
.menu {
|
||
padding: 0 30rpx;
|
||
|
||
&--item {
|
||
margin: 20rpx 0;
|
||
font-size: 28rpx;
|
||
color: $-color-muted;
|
||
margin-right: 50rpx;
|
||
}
|
||
|
||
.active {
|
||
color: $-color-primary;
|
||
font-weight: 500;
|
||
}
|
||
}
|
||
}
|
||
</style>
|