ant-treeSelect.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { TreeSelect } from "@pureadmin/components";
  4. defineOptions({
  5. name: "AntTreeSelect"
  6. });
  7. const value1 = ref<string>("");
  8. const treeData1 = ref([
  9. {
  10. title: "parent 1",
  11. value: "parent 1",
  12. children: [
  13. {
  14. title: "parent 1-0",
  15. value: "parent 1-0",
  16. children: [
  17. {
  18. title: "my leaf",
  19. value: "leaf1"
  20. },
  21. {
  22. title: "your leaf",
  23. value: "leaf2"
  24. }
  25. ]
  26. },
  27. {
  28. title: "parent 1-1",
  29. value: "parent 1-1"
  30. }
  31. ]
  32. }
  33. ]);
  34. const SHOW_PARENT = TreeSelect.SHOW_PARENT;
  35. function dig(path = "0", level = 3) {
  36. const list = [];
  37. for (let i = 0; i < 10; i += 1) {
  38. const value = `${path}-${i}`;
  39. const treeNode = {
  40. title: value,
  41. value
  42. };
  43. if (level > 0) {
  44. // @ts-expect-error
  45. treeNode.children = dig(value, level - 1);
  46. }
  47. list.push(treeNode);
  48. }
  49. return list;
  50. }
  51. const checkedKeys = ref<string[]>(["0-0-0", "0-0-1"]);
  52. const value2 = ref<string[]>(["0-0-0"]);
  53. const treeData2 = [
  54. {
  55. title: "Node1",
  56. value: "0-0",
  57. children: [
  58. {
  59. title: "Child Node1",
  60. value: "0-0-0"
  61. }
  62. ]
  63. },
  64. {
  65. title: "Node2",
  66. value: "0-1",
  67. children: [
  68. {
  69. title: "Child Node3",
  70. value: "0-1-0",
  71. disabled: true
  72. },
  73. {
  74. title: "Child Node4",
  75. value: "0-1-1"
  76. },
  77. {
  78. title: "Child Node5",
  79. value: "0-1-2"
  80. }
  81. ]
  82. }
  83. ];
  84. const value3 = ref<string>();
  85. const treeData3 = ref([
  86. { id: 1, pId: 0, value: "1", title: "Expand to load" },
  87. { id: 2, pId: 0, value: "2", title: "Expand to load" },
  88. { id: 3, pId: 0, value: "3", title: "Tree Node", isLeaf: true }
  89. ]);
  90. const genTreeNode = (parentId: number, isLeaf = false) => {
  91. const random = Math.random().toString(36).substring(2, 6);
  92. return {
  93. id: random,
  94. pId: parentId,
  95. value: random,
  96. title: isLeaf ? "Tree Node" : "Expand to load",
  97. isLeaf
  98. };
  99. };
  100. const onLoadData = treeNode => {
  101. return new Promise(resolve => {
  102. const { id } = treeNode.dataRef;
  103. setTimeout(() => {
  104. // @ts-expect-error
  105. treeData3.value = treeData3.value.concat([
  106. genTreeNode(id, false),
  107. genTreeNode(id, true)
  108. ]);
  109. resolve(true);
  110. }, 300);
  111. });
  112. };
  113. </script>
  114. <template>
  115. <el-card>
  116. <template #header>
  117. <div class="card-header">
  118. <span class="font-medium">
  119. 仿antdv树选择,采用
  120. <el-link
  121. href="https://www.npmjs.com/package/@pureadmin/components"
  122. target="_blank"
  123. style="font-size: 16px; margin: 0 4px 5px"
  124. >
  125. @pureadmin/components
  126. </el-link>
  127. ,完全兼容antdv的
  128. <el-link
  129. href="https://next.antdv.com/components/tree-select-cn"
  130. target="_blank"
  131. style="font-size: 16px; margin: 0 4px 5px"
  132. >
  133. TreeSelect
  134. </el-link>
  135. 写法
  136. </span>
  137. </div>
  138. </template>
  139. <div class="flex justify-around flex-wrap">
  140. <div>
  141. <span>线性样式:</span>
  142. <TreeSelect
  143. class="w-200px"
  144. v-model:value="value1"
  145. show-search
  146. :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
  147. placeholder="Please select"
  148. allow-clear
  149. :tree-line="true"
  150. tree-default-expand-all
  151. :tree-data="treeData1"
  152. >
  153. <template #title="{ value: val, title }">
  154. <b v-if="val === 'parent 1-1'" style="color: #08c">sss</b>
  155. <template v-else>{{ title }}</template>
  156. </template>
  157. </TreeSelect>
  158. </div>
  159. <div>
  160. <span>虚拟滚动:</span>
  161. <TreeSelect
  162. class="w-200px mt-6"
  163. v-model:value="checkedKeys"
  164. tree-checkable
  165. tree-default-expand-all
  166. :show-checked-strategy="SHOW_PARENT"
  167. :height="233"
  168. :tree-data="dig()"
  169. :max-tag-count="10"
  170. >
  171. <template #title="{ title, value }">
  172. <span v-if="value === '0-0-1-0'" style="color: #1890ff">
  173. {{ title }}
  174. </span>
  175. <template v-else>{{ title }}</template>
  176. </template>
  177. </TreeSelect>
  178. </div>
  179. <div>
  180. <span>可勾选:</span>
  181. <TreeSelect
  182. class="w-200px"
  183. v-model:value="value2"
  184. :tree-data="treeData2"
  185. tree-checkable
  186. allow-clear
  187. :show-checked-strategy="SHOW_PARENT"
  188. placeholder="Please select"
  189. />
  190. </div>
  191. <div>
  192. <span>异步加载:</span>
  193. <TreeSelect
  194. class="w-200px"
  195. v-model:value="value3"
  196. tree-data-simple-mode
  197. :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
  198. :tree-data="treeData3"
  199. placeholder="Please select"
  200. :load-data="onLoadData"
  201. />
  202. </div>
  203. </div>
  204. </el-card>
  205. </template>