fenlei.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <view>
  3. <!--pages/fenlei/fenlei.wxml-->
  4. <scroll-view scroll-y="true" class="left" :style="'bottom:' + (bottomBlankHeignt + 115) + 'rpx'">
  5. <block v-for="(item, index) in categorys" :key="index">
  6. <view :class="'li ' + (current == index ? 'active' : '')" :data-index="index" @tap="toScrollView" :data-id="item.id">{{item.title}}</view>
  7. </block>
  8. </scroll-view>
  9. <scroll-view scroll-y="true" class="right" :style="'height:' + scrollHeight + 'px;'" :scroll-into-view="toView" scroll-top="0" @scroll="scrollTo" scroll-with-animation="true">
  10. <view class="rcon">
  11. <view v-for="(cats, idx) in categorys" :key="idx" :id="'position' + idx">
  12. <view class="tit">{{cats.title}}</view>
  13. <view class="list dflex">
  14. <view v-for="(item, index) in cats.nodes" :key="index" class="li" @tap="goUrl" :data-url="'product/list/list?id=' + item.id + '&title=' + item.title">
  15. <image :src="item.icon"></image>
  16. {{item.title}}
  17. </view>
  18. </view>
  19. </view>
  20. </view>
  21. </scroll-view>
  22. <foot channel="sort"></foot>
  23. </view>
  24. </template>
  25. <script>
  26. // pages/fenlei/fenlei.js
  27. const app = getApp();
  28. const req = require("../../utils/request.js");
  29. let scrollDdirection = 0; // 用来计算滚动的方向
  30. import foot from "../../components/nav-bar/index";
  31. export default {
  32. data() {
  33. return {
  34. bottomBlankHeignt: app.globalData.isIPhoneX ? 68 : 0,
  35. categorys: [],
  36. //产品一级分类列表
  37. current: 0,
  38. scrollTop: 0,
  39. scrollHeight: 0,
  40. // 滚动视图的高度
  41. toView: 'position0',
  42. // 滚动视图跳转的位置
  43. scrollInfo: [],
  44. isload: false,
  45. _key: ""
  46. };
  47. },
  48. components: {
  49. foot
  50. },
  51. props: {},
  52. onLoad: function (options) {
  53. this.category();
  54. uni.getSystemInfo({
  55. success: res => {
  56. this.setData({
  57. scrollHeight: res.windowHeight - 136 * res.windowWidth / 750
  58. });
  59. }
  60. });
  61. },
  62. methods: {
  63. category() {
  64. //产品分类
  65. let that = this;
  66. req.getRequest('/api/category/list', {
  67. page: 1,
  68. size: 1000
  69. }, res => {
  70. if (res) {
  71. let array = [];
  72. res.map(item => {
  73. if (item.pid == 0) {
  74. array.push(item);
  75. }
  76. });
  77. /*右边数据*/
  78. array.forEach(elm => {
  79. var twoArray = [];
  80. res.forEach(function (elm2, idx) {
  81. if (elm2.pid == elm.id) {
  82. twoArray.push(elm2);
  83. }
  84. });
  85. elm.nodes = twoArray;
  86. });
  87. that.setData({
  88. categorys: array
  89. });
  90. setTimeout(() => {
  91. that.lisenerScroll();
  92. }, 100);
  93. }
  94. });
  95. },
  96. goUrl(e) {
  97. app.globalData.openPage(e.currentTarget.dataset.url);
  98. },
  99. toScrollView(e) {
  100. const {
  101. index
  102. } = e.currentTarget.dataset;
  103. this.setData({
  104. current: index,
  105. toView: `position${index}`
  106. });
  107. },
  108. /**
  109. * 获取右边每个分类的头部偏移量
  110. */
  111. lisenerScroll() {
  112. // var _ts=this;
  113. /* setTimeout(() => {
  114. _ts.setHeight(0);
  115. }, 10000);*/
  116. // 获取各分类容器距离顶部的距离
  117. new Promise(resolve => {
  118. let query = uni.createSelectorQuery();
  119. var clength = this.categorys.length;
  120. for (var k = 0; k < clength; k++) {
  121. query.select(`#position${k}`).boundingClientRect();
  122. }
  123. query.exec(function (res) {
  124. resolve(res);
  125. });
  126. }).then(res => {
  127. var categorys = this.categorys;
  128. if (res.length == categorys.length) {
  129. categorys.forEach((item, index) => {
  130. item.offsetTop = res[index].top;
  131. });
  132. this.setData({
  133. scrollInfo: res,
  134. categorys: categorys
  135. });
  136. }
  137. });
  138. },
  139. setHeight(k) {
  140. var _ts = this;
  141. if (_ts.isload) {
  142. return;
  143. }
  144. _ts.isload = false;
  145. let query = uni.createSelectorQuery();
  146. query.select(`#position${k}`).boundingClientRect();
  147. query.exec(function (res) {
  148. // console.log(res);
  149. var _key = "categorys[" + k + "].offsetTop";
  150. _ts.setData({
  151. [_key]: res[0].top
  152. });
  153. _ts.isload = true;
  154. });
  155. },
  156. /**
  157. * 监听滚动条滚动事件
  158. */
  159. scrollTo(e) {
  160. const scrollTop = e.detail.scrollTop; //滚动的Y轴
  161. const {
  162. current,
  163. categorys
  164. } = this;
  165. if (scrollDdirection < scrollTop) {
  166. // 向上滑动
  167. scrollDdirection = scrollTop; // 计算偏移位置
  168. // console.log(current, scrollTop,categorys[current + 1].offsetTop);
  169. if (current < categorys.length - 1 && scrollTop >= categorys[current + 1].offsetTop) {
  170. // console.log("chua");
  171. this.setData({
  172. current: current + 1
  173. });
  174. }
  175. } else {
  176. // 向下滑动
  177. scrollDdirection = scrollTop; // 计算偏移位置
  178. if (current > 0 && scrollTop < categorys[current].offsetTop && scrollTop > 0) {
  179. this.setData({
  180. current: current - 1
  181. });
  182. }
  183. }
  184. }
  185. }
  186. };
  187. </script>
  188. <style>
  189. @import "./fenlei.css";
  190. </style>