van_radio_group.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  2. <div>
  3. <van-radio-group v-model="select" :direction="localItem.attr.direction">
  4. <div
  5. v-for="(v, i) in localItem.child_list || []"
  6. @close="close"
  7. :key="i"
  8. class="leftTag"
  9. >
  10. <div class="closeCss">
  11. <el-icon @click="() => editEle(v, i)"><Edit /></el-icon>
  12. <el-icon @click="() => close(v, i)"><Close /></el-icon>
  13. </div>
  14. <h5-van-radio :item="v"></h5-van-radio>
  15. </div>
  16. </van-radio-group>
  17. <div style="padding-top: 1em">
  18. <el-icon
  19. v-if="!showEle"
  20. color="#409eff"
  21. :size="30"
  22. @click="() => editEle()"
  23. ><FolderAdd
  24. /></el-icon>
  25. <el-form class="formEle" :model="form" v-if="showEle">
  26. <el-form-item label="文案">
  27. <el-input v-model="form.name" />
  28. </el-form-item>
  29. <el-form-item>
  30. <el-button type="primary" @click="onSubmit">保存</el-button>
  31. <el-button @click="cancel">取消</el-button>
  32. </el-form-item>
  33. </el-form>
  34. </div>
  35. </div>
  36. </template>
  37. <script setup>
  38. import { defineProps, ref, defineEmits } from 'vue';
  39. import H5VanRadio from './van_radio.vue';
  40. const props = defineProps({
  41. item: Object,
  42. index: String,
  43. });
  44. const localItem = ref(JSON.parse(JSON.stringify(props.item)));
  45. const select = ref(
  46. localItem.value.child_list ? localItem.value.child_list[0].attr.name : ''
  47. );
  48. const showEle = ref(false);
  49. const emit = defineEmits(['change']);
  50. const form = ref({
  51. name: '',
  52. });
  53. console.log(localItem.value);
  54. const editEle = (v, i) => {
  55. showEle.value = true;
  56. form.value.isEdit = !!v;
  57. if (v) {
  58. form.value.index = i;
  59. form.value.name = v.attr.label;
  60. }
  61. };
  62. const close = (v, i) => {
  63. const li = JSON.parse(JSON.stringify(localItem.value.child_list));
  64. li.splice(i, 1);
  65. localItem.value.child_list = li;
  66. emit('change', localItem.value, props.index);
  67. };
  68. const onSubmit = () => {
  69. if (!form.value.name) return;
  70. showEle.value = false;
  71. if (form.value.isEdit) {
  72. localItem.value.child_list[form.value.index].attr.name = form.value.name;
  73. } else {
  74. localItem.value.child_list.push({
  75. attr: {
  76. label: form.value.name,
  77. name: form.value.name,
  78. },
  79. type: 'van-radio',
  80. });
  81. }
  82. form.value.name = '';
  83. emit('change', localItem.value, props.index);
  84. };
  85. const cancel = () => {
  86. showEle.value = false;
  87. };
  88. </script>
  89. <style scoped>
  90. .leftTag {
  91. padding: 5px 35px 5px 5px;
  92. position: relative;
  93. margin-right: 4px;
  94. min-width: 4em;
  95. }
  96. .closeCss {
  97. position: absolute;
  98. top: 7px;
  99. right: 3px;
  100. }
  101. </style>