index.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <up-picker :show="show" :defaultIndex="pickValue.indexs" ref="uPickerRef" valueKey="id" @cancel="cancel" :columns="columns" @confirm="confirm" @change="changeHandler"></up-picker>
  3. </template>
  4. <script setup>
  5. import { ref, reactive, computed } from 'vue';
  6. const props = defineProps({
  7. columnData: {
  8. type: Array,
  9. default: []
  10. }
  11. });
  12. const emit = defineEmits(['submit']);
  13. const show = ref(false);
  14. const pickValue = ref({
  15. indexs: [0, 0, 0],
  16. });
  17. /**
  18. *
  19. * 根据下标获取显示数据
  20. */
  21. function getDataByKeys(array, keys) {
  22. const result = [];
  23. let currentLevel = array;
  24. for (let i = 0; i < keys.length; i++) {
  25. const key = keys[i];
  26. const currentItems = currentLevel.map(item => item.businessName);
  27. result.push(currentItems);
  28. if (currentLevel[key] && currentLevel[key].children) {
  29. currentLevel = currentLevel[key].children;
  30. } else {
  31. // 如果没有 children,则在结果中添加一个空数组
  32. result.push([]);
  33. break;
  34. }
  35. }
  36. if (result.length > keys.length) {
  37. result.pop();
  38. }
  39. return result;
  40. }
  41. const columns = computed(() => {
  42. const data = props.columnData;
  43. const { indexs } = pickValue.value
  44. const result = getDataByKeys(data, indexs);
  45. console.log('=====>', result);
  46. console.log('data', data);
  47. return result;
  48. });
  49. const uPickerRef = ref(null)
  50. const changeHandler = (e) => {
  51. console.log('e', e);
  52. pickValue.value = e;
  53. };
  54. /**
  55. *
  56. * 根据下标获取id
  57. */
  58. function getid(keys) {
  59. let currentLevel = props.columnData;
  60. for (let i = 0; i < keys.length; i++) {
  61. const key = keys[i];
  62. if (currentLevel[key] && currentLevel[key].children) {
  63. currentLevel = currentLevel[key].children;
  64. } else {
  65. if (currentLevel[key]) {
  66. return currentLevel[key].id;
  67. }
  68. break;
  69. }
  70. }
  71. return null; // 如果没有找到对应的项,返回 null
  72. }
  73. const confirm = (e) => {
  74. console.log(e);
  75. const id = getid(e.indexs);
  76. emit('submit', {key: e.value.join('/'),value: id });
  77. show.value = false;
  78. };
  79. //根据id获取下标
  80. function idToIndexs(array, targetId, path = []) {
  81. for (let i = 0; i < array.length; i++) {
  82. const item = array[i];
  83. const currentPath = path.concat(i);
  84. if (item.id === targetId) {
  85. return currentPath
  86. }
  87. if (item.children) {
  88. const result = idToIndexs(item.children, targetId, currentPath);
  89. if (result) {
  90. return result;
  91. }
  92. }
  93. }
  94. return null; // 如果没有找到对应的项,返回 null
  95. }
  96. function indexsToNames(indexs){
  97. let currentLevel = props.columnData;
  98. const names = [];
  99. for (let i = 0; i < indexs.length; i++) {
  100. const key = indexs[i];
  101. if (currentLevel[key]) {
  102. names.push(currentLevel[key].businessName);
  103. if (currentLevel[key].children) {
  104. currentLevel = currentLevel[key].children;
  105. }
  106. } else {
  107. break;
  108. }
  109. }
  110. return names;
  111. }
  112. const piceInit = (id) => {
  113. try {
  114. console.log('piceInit-id',props.columnData,id);
  115. const indexs = idToIndexs(props.columnData,id)
  116. console.log('piceInit-indexs',indexs);
  117. const names = indexsToNames(indexs)
  118. pickValue.value.indexs = indexs;
  119. return names.join('/')
  120. } catch (error) {
  121. console.log('piceInit-error',error);
  122. }
  123. }
  124. const cancel = () => {
  125. show.value = false;
  126. };
  127. defineExpose({
  128. show() {
  129. show.value = true;
  130. },
  131. piceInit
  132. });
  133. </script>