talbclass.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <view class="talbbox">
  3. <!-- 左侧 -->
  4. <view>
  5. <scroll-view :scroll-top="scrollTop" class="cate-left" scroll-y="true" show-scrollbar="false">
  6. <view class="cate-item" :class="{act:current==index}" v-for="(item,index) in cateList"
  7. @click="menuTab(index)" :key="item.id">
  8. {{item.label}}
  9. </view>
  10. </scroll-view>
  11. </view>
  12. <!-- 右侧 -->
  13. <view class="cate-right">
  14. <scroll-view :scroll-top="riscrollTop" :scroll-into-view="'cate'+tempCurrent" class="cate-right-scroll" scroll-y="true"
  15. show-scrollbar="false" @scroll="getCurrentHeight">
  16. <view :id="'cate'+index" v-for="(item,index) in cateList" :key="item.id" class="cate-right-item">
  17. <view class="cate-title">{{item.label}}</view>
  18. <view class="cate-right-txt">
  19. <text v-for="(el,index) in item.children" @click="getTabFn(el)" :class="{act:ricurrent==el.id}" :key="el.id">{{el.label}}</text>
  20. </view>
  21. </view>
  22. <view style="height: 30rpx;"></view>
  23. </scroll-view>
  24. </view>
  25. <view class="fwbtns" @click="getSure">确定</view>
  26. </view>
  27. </template>
  28. <script>
  29. import {getCategoryTree} from "@/api/common.js"
  30. export default {
  31. data() {
  32. return {
  33. cateList: [
  34. // {label:'农、林、牧、渔业',id:0,children:[{label:'农业',id:10},{label:'林业',id:11},{label:'畜牧业',id:12},{label:'渔业',id:13},{label:'农、林、牧、渔专业及辅助 性活动',id:14},]},
  35. // {label:'1工业',id:1,children:[{label:'采矿业',id:20},{label:'煤炭开采和洗选业',id:21},{label:'石油和天然气开采业',id:22},{label:'黑色金属矿采选业',id:23},{label:'有色金属矿采选业',id:24},]},
  36. // {label:'2工业',id:1,children:[{label:'采矿业',id:20},{label:'煤炭开采和洗选业',id:21},{label:'石油和天然气开采业',id:22},{label:'黑色金属矿采选业',id:23},{label:'有色金属矿采选业',id:24},]},
  37. // {label:'3工业',id:1,children:[{label:'采矿业',id:20},{label:'煤炭开采和洗选业',id:21},{label:'石油和天然气开采业',id:22},{label:'黑色金属矿采选业',id:23},{label:'有色金属矿采选业',id:24},]},
  38. // {label:'4工业',id:1,children:[{label:'采矿业',id:20},{label:'煤炭开采和洗选业',id:21},{label:'石油和天然气开采业',id:22},{label:'黑色金属矿采选业',id:23},{label:'有色金属矿采选业',id:24},]},
  39. // {label:'5工业',id:1,children:[{label:'采矿业',id:20},{label:'煤炭开采和洗选业',id:21},{label:'石油和天然气开采业',id:22},{label:'黑色金属矿采选业',id:23},{label:'有色金属矿采选业',id:24},]},
  40. ],
  41. current: 0, //当前点击项
  42. rectInfoList: [],
  43. tempCurrent: 0,
  44. ricurrent:'',
  45. categoryName:'',//选择的名字
  46. scrollTop: 0, //左侧导航栏距离顶部的位置
  47. riscrollTop:0,//右侧导航栏距离顶部的位置
  48. tabflag:false,
  49. }
  50. },
  51. onLoad(e) {
  52. if(e.data){
  53. var newobj=JSON.parse(decodeURIComponent(e.data));
  54. this.ricurrent=newobj.id;
  55. this.categoryName=newobj.name
  56. }
  57. this.getCasetalbFn()
  58. },
  59. mounted() {
  60. setTimeout(() => {
  61. this.getRectInfo();
  62. }, 200)
  63. },
  64. methods: {
  65. getCasetalbFn(){
  66. getCategoryTree().then(res=>{
  67. if(res.code==200){
  68. this.cateList=res.data;
  69. }
  70. })
  71. },
  72. menuTab(index){
  73. var that=this;
  74. var idx=Number(index)
  75. var top=this.rectInfoList[idx].top;
  76. this.current = idx;
  77. this.riscrollTop = top;
  78. this.tabflag=true;
  79. setTimeout(function(){
  80. that.tabflag=false;
  81. },500)
  82. },
  83. getTabFn(ite){
  84. this.ricurrent=ite.id;
  85. this.categoryName=ite.label
  86. },
  87. getSure(){
  88. // 带数据返回
  89. var obj={
  90. categoryName:this.categoryName,
  91. categoryId:this.ricurrent,
  92. }
  93. uni.$emit("refreshtalb",obj)
  94. uni.navigateBack({
  95. delta: 1 //返回层数,2则上上页
  96. });
  97. },
  98. // 获取与顶部之间的距离
  99. getRectInfo() {
  100. var that=this;
  101. var top = 0;
  102. var bottom = 0;
  103. var temp = 0;
  104. for (var i = 0; i < this.cateList.length; i++) {
  105. var obj={}
  106. let view = uni.createSelectorQuery().in(this).select("#cate" + i);
  107. view.fields({
  108. size: true,
  109. rect: true
  110. }, data => {
  111. top = temp;
  112. bottom = top + data.height;
  113. temp = bottom;
  114. var obj={
  115. 'top': Number(top),
  116. 'bottom': Number(bottom)
  117. }
  118. that.rectInfoList.push(obj)
  119. // console.log(top, bottom);
  120. }).exec();
  121. }
  122. },
  123. getCurrentHeight(e) {
  124. var currentHeight = e.detail.scrollTop;
  125. this.rectInfoList.forEach((item, index) => {
  126. if (currentHeight >= item.top && currentHeight <= item.bottom&&!this.tabflag) {
  127. // 当前获取的盒子高度大于top小于bottom,判定将索引传至左侧菜单导航
  128. this.current = Number(index);
  129. this.scrollTop = Number(index) * uni.upx2px(100);
  130. }
  131. })
  132. }
  133. }
  134. }
  135. </script>
  136. <style scoped lang="scss">
  137. /deep/::-webkit-scrollbar {
  138. display: none;
  139. width: 0;
  140. height: 0;
  141. }
  142. .talbbox{
  143. display: flex;height: 100vh;padding-bottom: 98rpx;
  144. .cate-left{width: 330rpx;flex: 0 0 auto;height: 100%;background-color: #f5f5f5;
  145. .cate-item{min-height: 110rpx;font-weight: 500;display: flex;align-items: center;justify-content: center;
  146. font-size: 28rpx;color: #666666;padding: 20rpx 46rpx;
  147. &.act{background-color: #ffffff;font-weight: bold;color: $com-cd3;}
  148. }
  149. }
  150. .cate-right{flex: 1;height: 100%;background: #ffffff;
  151. .cate-right-scroll{height: 100%;padding-left:58rpx;padding-right: 52rpx;
  152. .cate-right-item{
  153. .cate-title{font-weight: bold;font-size: 30rpx;color: #222327;min-height: 110rpx;display: flex;align-items: center;padding: 20rpx 0;}
  154. .cate-right-txt{display: flex;flex-wrap: wrap;
  155. text{font-weight: 500;font-size: 26rpx;color: #666666;margin-bottom: 16rpx;padding: 8rpx 0;width: 100%;box-sizing: border-box;display: block;
  156. &.act{color: $com-cd3;}
  157. }
  158. }
  159. }
  160. }
  161. }
  162. }
  163. </style>