reply.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <template>
  2. <view class="container">
  3. <view class="reply_btn flex_item">
  4. <view class="btn" v-for="(item, index) in navList" :key="index" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index)">
  5. {{ item.text }}({{ item.number}})
  6. </view>
  7. </view>
  8. <swiper :current="tabCurrentIndex" class="swiper-box" duration="300" @change="changeTab">
  9. <swiper-item class="tab-content" v-for="(tabItem, tabIndex) in navList" :key="tabIndex">
  10. <scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadDate">
  11. <!-- 评论列表 -->
  12. <view v-for="(item, index) in tabItem.orderList" :key="index" class="eva-box">
  13. <view class="flex_item">
  14. <image class="portrait" :src="item.avatar" mode="aspectFill"></image>
  15. <view class="right">
  16. <view class="flex">
  17. <view class="name">{{ item.nickname }}</view>
  18. <view class="time">{{ item.add_time }}</view>
  19. </view>
  20. <view class="Rate"><uniRate activeColor="#F10F3C" disabled="false" text="1" size="10" margin="0" :value="item.star"></uniRate></view>
  21. </view>
  22. </view>
  23. <view class="content-box">
  24. <text class="con">{{ item.comment }}</text>
  25. <view class="con_box">
  26. <view class="con_image" v-for="ls in item.pics"><image @click.stop="imgInfo(ls)" :src="ls"></image></view>
  27. </view>
  28. </view>
  29. </view>
  30. <uni-load-more :status="tabItem.loadingType"></uni-load-more>
  31. </scroll-view>
  32. </swiper-item>
  33. </swiper>
  34. </view>
  35. </template>
  36. <script>
  37. import { reply_config, reply_list } from '@/api/reply.js';
  38. import uniRate from '@/components/uni-rate/uni-rate.vue';
  39. export default {
  40. components: {
  41. uniRate
  42. },
  43. watch: {},
  44. data() {
  45. return {
  46. id: '', //商品id
  47. list: '', //评论列表
  48. reply: '', //评论配置
  49. tabCurrentIndex: 0,
  50. navList: [
  51. {
  52. state: 0,
  53. text: '全部',
  54. loadingType: 'more',
  55. number: 0,
  56. orderList: [],
  57. page: 1, //当前页数
  58. limit: 5 //每次信息条数
  59. },
  60. {
  61. state: 1,
  62. text: '好评',
  63. loadingType: 'more',
  64. number: 0,
  65. orderList: [],
  66. page: 1, //当前页数
  67. limit: 5 //每次信息条数
  68. },
  69. {
  70. state: 3,
  71. text: '差评',
  72. loadingType: 'more',
  73. number: 0,
  74. orderList: [],
  75. page: 1, //当前页数
  76. limit:5 //每次信息条数
  77. },
  78. {
  79. state: 2,
  80. text: '中评',
  81. loadingType: 'more',
  82. number: 0,
  83. orderList: [],
  84. page: 1, //当前页数
  85. limit: 5 //每次信息条数
  86. }
  87. ]
  88. };
  89. },
  90. computed: {},
  91. onLoad(option) {
  92. this.id = option.id;
  93. },
  94. //下拉刷新
  95. onPullDownRefresh() {
  96. let obj = this;
  97. //监听下拉刷新动作的执行方法,每次手动下拉刷新都会执行一次
  98. setTimeout(function() {
  99. obj.loadDate();
  100. uni.stopPullDownRefresh(); //停止下拉刷新动画
  101. }, 1000);
  102. },
  103. onShow() {
  104. let obj = this;
  105. reply_config({}, this.id).then(function({ data }) {
  106. obj.reply = data;
  107. obj.navList[0].number = obj.reply.sum_count;
  108. obj.navList[1].number = obj.reply.good_count;
  109. obj.navList[2].number = obj.reply.poor_count;
  110. obj.navList[3].number = obj.reply.in_count;
  111. console.log(obj.navList,55)
  112. });
  113. this.loadDate();
  114. },
  115. methods: {
  116. async loadDate(source) {
  117. //这里是将订单挂载到tab列表下
  118. let index = this.tabCurrentIndex;
  119. let navItem = this.navList[index];
  120. let state = navItem.state;
  121. if (source === 'tabChange' && navItem.loaded === true) {
  122. //tab切换只有第一次需要加载数据
  123. return;
  124. }
  125. if (navItem.loadingType === 'loading') {
  126. //防止重复加载
  127. return;
  128. }
  129. if (navItem.loadingType === 'noMore') {
  130. //防止重复加载
  131. return;
  132. }
  133. // 修改当前对象状态为加载中
  134. navItem.loadingType = 'loading';
  135. reply_list(
  136. {
  137. type: state,
  138. page: navItem.page,
  139. limit: navItem.limit
  140. },
  141. this.id
  142. )
  143. .then(({ data }) => {
  144. let arr = data;
  145. navItem.orderList = navItem.orderList.concat(arr);
  146. console.log(navItem.orderList,55)
  147. navItem.page++;
  148. if (navItem.limit == data.length) {
  149. //判断是否还有数据, 有改为 more, 没有改为noMore
  150. navItem.loadingType = 'more';
  151. return;
  152. } else {
  153. //判断是否还有数据, 有改为 more, 没有改为noMore
  154. navItem.loadingType = 'noMore';
  155. }
  156. this.$set(navItem, 'loaded', true);
  157. })
  158. .catch(e => {
  159. console.log(e);
  160. });
  161. },
  162. //点击图片显示大图
  163. imgInfo(i) {
  164. let tempList = [];
  165. tempList.push(i);
  166. console.log(tempList);
  167. //显示图片
  168. uni.previewImage({
  169. current: i,
  170. loop: false,
  171. urls: tempList,
  172. indicator: 'default'
  173. });
  174. },
  175. // async GetList(){
  176. // let obj = this;
  177. // reply_list({}, obj.id).then(function({ data }) {
  178. // // console.log(data)
  179. // obj.list = data;
  180. // });
  181. // },
  182. //跳转接口
  183. navTo(url) {
  184. uni.navigateTo({
  185. url
  186. });
  187. },
  188. //swiper 切换
  189. changeTab(e) {
  190. this.tabCurrentIndex = e.target.current;
  191. this.loadDate('tabChange');
  192. },
  193. //顶部tab点击
  194. tabClick(index) {
  195. this.tabCurrentIndex = index;
  196. }
  197. }
  198. };
  199. </script>
  200. <style lang="scss">
  201. page {
  202. background: #ffffff;
  203. height: 100%;
  204. .container {
  205. height: 100%;
  206. padding: 25rpx 25rpx;
  207. .swiper-box {
  208. height: 100%;
  209. padding-top: 90rpx;
  210. .list-scroll-content {
  211. height: 100%;
  212. }
  213. }
  214. }
  215. }
  216. .reply_btn {
  217. padding: 15rpx 0rpx;
  218. position: fixed;
  219. // top: 50px;
  220. .btn {
  221. padding: 10rpx 25rpx;
  222. font-size: 24rpx;
  223. background: #f4f4f4;
  224. margin-right: 25rpx;
  225. }
  226. .current {
  227. background-color: #e93323 !important;
  228. color: #ffffff !important;
  229. }
  230. }
  231. .eva-box {
  232. padding: 30rpx 0;
  233. .portrait {
  234. flex-shrink: 0;
  235. width: 80rpx;
  236. height: 80rpx;
  237. border-radius: 100px;
  238. }
  239. .right {
  240. flex: 1;
  241. display: flex;
  242. flex-direction: column;
  243. font-size: $font-base;
  244. color: $font-color-base;
  245. padding-left: 26rpx;
  246. }
  247. .Rate{
  248. padding-top: 25rpx;
  249. }
  250. }
  251. .content-box{
  252. padding: 20rpx 0;
  253. .con {
  254. font-size: $font-base;
  255. color: $font-color-dark;
  256. }
  257. .bot {
  258. display: flex;
  259. justify-content: space-between;
  260. font-size: $font-sm;
  261. color: $font-color-light;
  262. }
  263. }
  264. .con_image {
  265. width: 130rpx;
  266. height: 130rpx;
  267. display: inline-block;
  268. padding: 15rpx;
  269. image {
  270. width: 100%;
  271. height: 100%;
  272. }
  273. }
  274. </style>