tm-grouplist.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template>
  2. <view>
  3. <view class="tm-grouplist overflow "
  4. :class="['ma-' + margin, ' round-' + round, 'shadow-' + shadow, black_tmeme ? 'bk' : '']">
  5. <view v-if="title&&title!='true'" class="px-32 py-16 text-weight-b " :class="[`text-size-${fontSize}`,titleTheme, black_tmeme ? 'bk' : '']">
  6. <slot name="title" :title="title">{{ title }}</slot>
  7. </view>
  8. <view v-show="chuliWsok==true">
  9. <slot></slot>
  10. </view>
  11. </view>
  12. </view>
  13. </template>
  14. <script>
  15. /**
  16. * 列表组
  17. * @description (可嵌套使用)需要配合tm-listitem使用
  18. * @property {Boolean} black = [true|false] 默认:null,暗黑模式
  19. * @property {Number} margin = [] 默认:32,单位upx,外间距。
  20. * @property {Number} shadow = [] 默认:10,单位upx,投影
  21. * @property {Number} round = [] 默认:4,单位upx, 外部圆角
  22. * @property {String} title = [] 默认:'',标题。
  23. * @property {String} font-size = [xxs|xs|s|n|g|lg|xl] 默认:'n',标题大小,注意是css库中的xxs,xs,s,n,g,lg,xl
  24. * @property {Boolean} border-bottom = [] 默认:true ,是否显示底边线。
  25. * @property {String} title-theme = [] 默认:primary,标题的主题色彩名。
  26. * @property {Function} change 点击了列表那一个元素。并返回Index
  27. * @example <tm-grouplist title="配置">
  28. <tm-listitem title="应用栏" v-for="(item,index) in 4" :key="index"></tm-listitem>
  29. </tm-grouplist>
  30. */
  31. export default {
  32. name: 'tm-grouplist',
  33. props: {
  34. black: {
  35. type: String | Boolean,
  36. default: null
  37. },
  38. borderBottom: {
  39. type: String | Boolean,
  40. default: true
  41. },
  42. // 单位upx
  43. margin: {
  44. type: String | Number,
  45. default: 32
  46. },
  47. // 外部圆角
  48. round: {
  49. type: String | Number,
  50. default: 3
  51. },
  52. // 投影
  53. shadow: {
  54. type: String | Number,
  55. default: 4
  56. },
  57. // 组标题。
  58. title: {
  59. type: String,
  60. default: ''
  61. },
  62. // 标题的主题色彩名。
  63. titleTheme: {
  64. type: String,
  65. default: 'primary'
  66. },
  67. fontSize:{
  68. type:String,
  69. default:'n'
  70. }
  71. },
  72. computed:{
  73. black_tmeme:function(){
  74. if(this.black!==null) return this.black;
  75. return this.$tm.vx.state().tmVuetify.black;
  76. }
  77. },
  78. data() {
  79. return {
  80. targ:'tm-grouplist',
  81. chuliWsok:false,//处理完宽度计算信息再进行显示内部内容。
  82. };
  83. },
  84. created() {
  85. // #ifdef H5
  86. this.chuliWsok = true;
  87. // #endif
  88. },
  89. mounted() {
  90. this.inits();
  91. },
  92. watch:{
  93. },
  94. updated(){
  95. this.inits();
  96. },
  97. methods: {
  98. inits(){
  99. let t = this;
  100. this.$nextTick(function () {
  101. let ch = this.$children;
  102. // #ifdef H5
  103. ch = [];
  104. let cld = this.$children[0].$children
  105. while(cld){
  106. if(cld[0].$children.length>0){
  107. let ods = cld[0].$children;
  108. ch =ods[ods.length-1].$children;
  109. break;
  110. }else{
  111. cld = cld[0]?.$children
  112. }
  113. }
  114. // #endif
  115. ch.forEach((item,index)=>{
  116. if(item.$options.name==="tm-listitem"){
  117. item.setConfig({
  118. margin: [0,0],
  119. padding: [32,24],
  120. shadow: 0,
  121. round: 0,
  122. borderBottom: index===ch.length-1?false:t.borderBottom
  123. })
  124. }
  125. })
  126. // #ifndef H5
  127. setTimeout(function() {
  128. t.chuliWsok = true;
  129. }, 30);
  130. // #endif
  131. })
  132. },
  133. // 事件一定是子项目tm-listitem为group模式时,才会触发。
  134. change(vue_uid) {
  135. // 具体点了哪一个项目,并展开了。
  136. let t = this;
  137. let ch = this.$children;
  138. // #ifdef H5
  139. ch = this.$children[0].$children[0].$children;
  140. ch = ch[1].$children;
  141. // #endif
  142. // 在H5下无法找到$children。因此始终是-1
  143. let index = ch.findIndex(item => {
  144. return vue_uid == item._uid;
  145. });
  146. this.$emit('change', index);
  147. }
  148. }
  149. };
  150. </script>
  151. <style lang="scss" >
  152. </style>