radio-select-group.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <view class="radio-slect-group">
  3. <template v-for="(item, i) in list">
  4. <view class="radio-slect-item" :key="i">
  5. <view class="p-view" @click="changeOpenKey(i)">
  6. <image class="icon"
  7. :src="`/static/${isOpen(i) ? 'up-icon' : 'down-icon'}.png`"></image>
  8. <text>{{ item[setting.pName] }}</text>
  9. </view>
  10. <template v-if="isOpen(i)">
  11. <view class="child-radio-group">
  12. <child-radio-group
  13. :pIndex="i"
  14. :list="item[setting.child] || []"
  15. :defaultValue="defaultValue"
  16. :label="label"
  17. :setting="setting"
  18. @change="toggleSelect"
  19. />
  20. </view>
  21. </template>
  22. </view>
  23. </template>
  24. </view>
  25. </template>
  26. <script>
  27. /**
  28. * 下拉式单选列表组合
  29. * 芦荟
  30. * 2021.2.3
  31. * props:属性说明看tm-radio-gruop.vue
  32. */
  33. import childRadioGroup from './radio-group.vue'
  34. export default {
  35. props: ['list', 'defaultValue', 'label', 'setting', 'openkeys'],
  36. created() {
  37. },
  38. methods: {
  39. /**
  40. * 选中变化调用
  41. * @param {Object} selectData 当前选中的对象
  42. * @param {Object} index 当前选中下标
  43. */
  44. toggleSelect(selectVal, selectData, index, pIndex){
  45. this.$emit('change', selectVal, selectData, index, ((pIndex || pIndex == 0) ? this.list[pIndex] : {}));
  46. },
  47. changeOpenKey(key) {
  48. let openKey = this.openkeys.find(openKey => openKey === key);
  49. this.$emit('changeOpenPKey', (openKey || openKey === 0 ? 'close' : 'open'), key)
  50. },
  51. isOpen(key) {
  52. let openKey = this.openkeys.find(openKey => openKey === key);
  53. return openKey || openKey === 0
  54. }
  55. },
  56. components: {
  57. childRadioGroup
  58. }
  59. }
  60. </script>
  61. <style lang="less">
  62. .radio-slect-group {
  63. background: #ffffff;
  64. .radio-slect-item {
  65. .p-view {
  66. display: flex;
  67. align-items: center;
  68. height: 75rpx;
  69. padding-left: 25rpx;
  70. .icon {
  71. margin-right: 15rpx;
  72. width: 21.25rpx;
  73. height: 12.5rpx;
  74. }
  75. >text {
  76. font-size: 22.5rpx;
  77. color: #292C33;
  78. }
  79. }
  80. }
  81. .child-radio-group {
  82. padding-left: 62.5rpx;
  83. }
  84. }
  85. </style>