notice.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <view>
  3. <view class="cu-load padding-top-10" :class="ajax.loading?'loading':''" @tap="getHistoryMsg"></view>
  4. <view class="cart-view-box" v-for="(item,index) in msgList" :key="index" :id="`msg-${item.id}`">
  5. <view class="text-gray text-center">{{item.createTime}}</view>
  6. <view @click="goDetail(item)" class="bg-white margin-top radius card-view">
  7. <view class="content-view">
  8. <view class="text-black text-bold text-lg text-cut">{{item.title}}</view>
  9. <view class="text-sm text-cut-2 subtitle" style="height: 200rpx;">
  10. <u-parse :html="item.notice"></u-parse>
  11. </view>
  12. <view class="flex justify-between padding-top-20" style=" border-top: 1rpx solid #f2f2f2;box-sizing: border-box;">
  13. <view class="text-df text-black">
  14. <text>查看详情</text>
  15. </view>
  16. <view style="padding-top: 8rpx;">
  17. <text class=" cuIcon-right"></text>
  18. </view>
  19. </view>
  20. <!-- <view class="flex justify-between text-bold" style="box-sizing: border-box;">
  21. <view class="text-df text-black">
  22. <text>{{item.title}}</text>
  23. </view>
  24. <view style="padding-top: 8rpx;">
  25. <text class=" cuIcon-right"></text>
  26. </view>
  27. </view> -->
  28. </view>
  29. </view>
  30. </view>
  31. </view>
  32. </template>
  33. <script>
  34. import DtCustomBar from '@/comps/dt_custom_bar.vue'
  35. var app=getApp()
  36. export default {
  37. components:{
  38. DtCustomBar
  39. },
  40. data() {
  41. return {
  42. msgList:[],
  43. ajax:{
  44. rows:10, //每页数量
  45. page:1, //页码
  46. flag:true, // 请求开关
  47. loading:true, // 加载中
  48. },
  49. content:'',
  50. }
  51. },
  52. mounted() {
  53. this.$nextTick(()=>{
  54. this.getHistoryMsg();
  55. });
  56. },
  57. onPageScroll(e){
  58. if(e.scrollTop<5){
  59. this.getHistoryMsg();
  60. }
  61. },
  62. onLoad() {
  63. },
  64. methods: {
  65. goDetail(item){
  66. app.globalData.noticeDetail=item
  67. uni.navigateTo({
  68. url:"./detail"
  69. })
  70. },
  71. // 获取历史消息
  72. getHistoryMsg(){
  73. if(!this.ajax.flag){
  74. return; //
  75. }
  76. // 此处用到 ES7 的 async/await 知识,为使代码更加优美。不懂的请自行学习。
  77. let get = async ()=>{
  78. this.hideLoadTips();
  79. this.ajax.flag = false;
  80. let data = await this.joinHistoryMsg();
  81. console.log(data); // 查看请求返回的数据结构
  82. // 获取待滚动元素选择器,解决插入数据后,滚动条定位时使用
  83. let selector = '';
  84. if(this.ajax.page>1){
  85. // 非第一页,则取历史消息数据的第一条信息元素
  86. selector = `#msg-${this.msgList[0].id}`;
  87. }else{
  88. // 第一页,则取当前消息数据的最后一条信息元素
  89. selector = `#msg-${data[data.length-1].id}`;
  90. }
  91. // 将获取到的消息数据合并到消息数组中
  92. this.msgList = [...data,...this.msgList];
  93. // 数据挂载后执行,不懂的请自行阅读 Vue.js 文档对 Vue.nextTick 函数说明。
  94. this.$nextTick(()=>{
  95. // 设置当前滚动的位置
  96. this.setPageScrollTo(selector);
  97. this.hideLoadTips(true);
  98. if(data.length < this.ajax.rows){
  99. // 当前消息数据条数小于请求要求条数时,则无更多消息,不再允许请求。
  100. // 可在此处编写无更多消息数据时的逻辑
  101. }else{
  102. this.ajax.page ++;
  103. // 延迟 200ms ,以保证设置窗口滚动已完成
  104. setTimeout(()=>{
  105. this.ajax.flag = true;
  106. },200)
  107. }
  108. })
  109. }
  110. get();
  111. },
  112. // 拼接历史记录消息,正式项目可替换为请求历史记录接口
  113. joinHistoryMsg(){
  114. console.log(this.ajax.page);
  115. console.log(this.ajax.rows);
  116. // let join = ()=>{
  117. // let arr = [];
  118. // //通过当前页码及页数,模拟数据内容
  119. // let startIndex = (this.ajax.page-1) * this.ajax.rows;
  120. // let endIndex = startIndex + this.ajax.rows;
  121. // for(let i = startIndex; i < endIndex; i++){
  122. // arr.push({
  123. // "id":i, // 消息的ID
  124. // "time":'2020年11月18日 11:00:18',
  125. // "title":`${i+1}放假通知`, // 消息内容
  126. // "subtitle":'2020年10月1日-2020年10月8日,中秋 国庆节放假,假期间需注意,祝国庆节玩的开心。' ,
  127. // })
  128. // }
  129. // arr.reverse();
  130. // return arr;
  131. // }
  132. // 此处用到 ES6 的 Promise 知识,不懂的请自行学习。
  133. return new Promise((done,fail)=>{
  134. // 无数据请求接口,由 setTimeout 模拟,正式项目替换为 ajax 即可。
  135. setTimeout(()=>{
  136. let that=this
  137. // let operation='notice/noticeList'
  138. let params={}
  139. params.residentialId = uni.getStorageSync("residentialId");
  140. that.$http.getNoticeList(params).then (res=>{
  141. //获取成功
  142. done(res.data.noticeList);
  143. });
  144. },800);
  145. })
  146. },
  147. // 设置页面滚动位置
  148. setPageScrollTo(selector){
  149. let view = uni.createSelectorQuery().in(this).select(selector);
  150. view.boundingClientRect((res) => {
  151. uni.pageScrollTo({
  152. scrollTop:res.top - 30, // -30 为多显示出大半个消息的高度,示意上面还有信息。
  153. duration: 0
  154. });
  155. }).exec();
  156. },
  157. // 隐藏加载提示
  158. hideLoadTips(flag){
  159. if(flag){
  160. console.log("333");
  161. setTimeout(()=>{
  162. this.ajax.loading = false;
  163. },300);
  164. }else{
  165. this.ajax.loading = true;
  166. }
  167. },
  168. },
  169. }
  170. </script>
  171. <style lang="scss">
  172. page{
  173. background-color: #F3F3F3;
  174. font-size: 28rpx;
  175. }
  176. .subtitle{
  177. color: #7e7e7e;
  178. font-size: 28rpx;
  179. margin: 50rpx 0 10rpx 0;
  180. line-height: 52rpx;
  181. }
  182. .cart-view-box {
  183. padding: 36.36rpx 27.27rpx;
  184. .card-view {
  185. background-color: #FFFFFF;
  186. position: relative;
  187. border-radius: 10rpx;
  188. .head-img {
  189. width: 100%;
  190. height: 236.36rpx;
  191. border-radius: 9.09rpx 9.09rpx 0 0;
  192. }
  193. .content-view {
  194. padding: 27.27rpx;
  195. }
  196. }
  197. }
  198. </style>