| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- <template>
- <view>
- <view class="cu-load padding-top-10" :class="ajax.loading?'loading':''" @tap="getHistoryMsg"></view>
- <view class="cart-view-box" v-for="(item,index) in msgList" :key="index" :id="`msg-${item.id}`">
- <view class="text-gray text-center">{{item.createDate}}</view>
- <view @click="goDetail(item)" class="bg-white margin-top radius card-view">
- <view class="content-view">
- <view class="text-black text-bold text-lg text-cut">{{item.title}}</view>
- <view class=" text-sm text-cut-2 subtitle">{{item.content}}</view>
- <view class="flex justify-between padding-top-20" style=" border-top: 1rpx solid #f2f2f2;box-sizing: border-box;">
- <view class="text-df text-black">
- <text>查看详情</text>
- </view>
- <view style="padding-top: 8rpx;">
- <text class=" cuIcon-right"></text>
- </view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </template>
- <script>
- import DtCustomBar from '@/comps/dt_custom_bar.vue'
- var app=getApp()
- export default {
- components:{
- DtCustomBar
- },
- data() {
- return {
- msgList:[],
- ajax:{
- rows:10, //每页数量
- page:1, //页码
- flag:true, // 请求开关
- loading:true, // 加载中
- },
- content:''
- }
- },
- mounted() {
- this.$nextTick(()=>{
- this.getHistoryMsg();
- });
- },
- onPageScroll(e){
- if(e.scrollTop<5){
- this.getHistoryMsg();
- }
- },
- onLoad() {
- },
- methods: {
- goDetail(item){
- app.globalData.noticeDetail=item
- uni.navigateTo({
- url:"./detail"
- })
- },
- // 获取历史消息
- getHistoryMsg(){
- if(!this.ajax.flag){
- return; //
- }
- // 此处用到 ES7 的 async/await 知识,为使代码更加优美。不懂的请自行学习。
- let get = async ()=>{
- this.hideLoadTips();
- this.ajax.flag = false;
- let data = await this.joinHistoryMsg();
-
- console.log(data); // 查看请求返回的数据结构
-
- // 获取待滚动元素选择器,解决插入数据后,滚动条定位时使用
- let selector = '';
-
- if(this.ajax.page>1){
- // 非第一页,则取历史消息数据的第一条信息元素
- selector = `#msg-${this.msgList[0].id}`;
- }else{
-
- // 第一页,则取当前消息数据的最后一条信息元素
- selector = `#msg-${data[data.length-1].id}`;
- }
-
- // 将获取到的消息数据合并到消息数组中
- this.msgList = [...data,...this.msgList];
-
- // 数据挂载后执行,不懂的请自行阅读 Vue.js 文档对 Vue.nextTick 函数说明。
- this.$nextTick(()=>{
- // 设置当前滚动的位置
- this.setPageScrollTo(selector);
-
- this.hideLoadTips(true);
-
- if(data.length < this.ajax.rows){
- // 当前消息数据条数小于请求要求条数时,则无更多消息,不再允许请求。
- // 可在此处编写无更多消息数据时的逻辑
- }else{
- this.ajax.page ++;
-
- // 延迟 200ms ,以保证设置窗口滚动已完成
- setTimeout(()=>{
- this.ajax.flag = true;
- },200)
- }
-
- })
- }
- get();
- },
- // 拼接历史记录消息,正式项目可替换为请求历史记录接口
- joinHistoryMsg(){
- console.log(this.ajax.page);
- console.log(this.ajax.rows);
- // let join = ()=>{
- // let arr = [];
- // //通过当前页码及页数,模拟数据内容
- // let startIndex = (this.ajax.page-1) * this.ajax.rows;
- // let endIndex = startIndex + this.ajax.rows;
- // for(let i = startIndex; i < endIndex; i++){
- // arr.push({
- // "id":i, // 消息的ID
- // "time":'2020年11月18日 11:00:18',
- // "title":`${i+1}放假通知`, // 消息内容
- // "subtitle":'2020年10月1日-2020年10月8日,中秋 国庆节放假,假期间需注意,祝国庆节玩的开心。' ,
- // })
- // }
- // arr.reverse();
- // return arr;
- // }
- // 此处用到 ES6 的 Promise 知识,不懂的请自行学习。
- return new Promise((done,fail)=>{
- // 无数据请求接口,由 setTimeout 模拟,正式项目替换为 ajax 即可。
-
- setTimeout(()=>{
- let that=this
- let operation='notice/noticeList'
- let params={}
- app.globalData.postRequest(params, operation, function (res) {
- //获取成功
- done(res.data.noticeList);
- });
-
- },800);
- })
- },
- // 设置页面滚动位置
- setPageScrollTo(selector){
- let view = uni.createSelectorQuery().in(this).select(selector);
- view.boundingClientRect((res) => {
- uni.pageScrollTo({
- scrollTop:res.top - 30, // -30 为多显示出大半个消息的高度,示意上面还有信息。
- duration: 0
- });
- }).exec();
- },
- // 隐藏加载提示
- hideLoadTips(flag){
- if(flag){
- console.log("333");
- setTimeout(()=>{
- this.ajax.loading = false;
- },300);
- }else{
- this.ajax.loading = true;
- }
- },
- },
-
- }
- </script>
- <style lang="scss">
- page{
- background-color: #F3F3F3;
- font-size: 28rpx;
- }
- .subtitle{
- color: #7e7e7e;
- font-size: 28rpx;
- margin: 50rpx 0 10rpx 0;
- line-height: 52rpx;
- }
- .cart-view-box {
- padding: 36.36rpx 27.27rpx;
- .card-view {
- background-color: #FFFFFF;
- position: relative;
- border-radius: 10rpx;
- .head-img {
- width: 100%;
- height: 236.36rpx;
- border-radius: 9.09rpx 9.09rpx 0 0;
- }
- .content-view {
- padding: 27.27rpx;
- }
- }
- }
- </style>
|