Cascader 级联选择器

当一个数据集合有清晰的层级结构时,可通过级联选择器逐级查看并选择。

基础用法

有两种触发子菜单的方式

只需为 Cascader 的options属性指定选项数组即可渲染出一个级联选择器。 通过props.expandTrigger可以定义展开子级菜单的触发方式。

Cascader 级联选择器 - 图1

  1. <template>
  2. <div class="example-block">
  3. <span class="example-demonstration"
  4. >Child options expand when clicked (default)</span
  5. >
  6. <el-cascader v-model="value" :options="options" @change="handleChange" />
  7. </div>
  8. <div class="example-block">
  9. <span class="example-demonstration">Child options expand when hovered</span>
  10. <el-cascader
  11. v-model="value"
  12. :options="options"
  13. :props="props"
  14. @change="handleChange"
  15. />
  16. </div>
  17. </template>
  18. <script lang="ts" setup>
  19. import { ref } from 'vue'
  20. const value = ref([])
  21. const props = {
  22. expandTrigger: 'hover',
  23. }
  24. const handleChange = (value) => {
  25. console.log(value)
  26. }
  27. const options = [
  28. {
  29. value: 'guide',
  30. label: 'Guide',
  31. children: [
  32. {
  33. value: 'disciplines',
  34. label: 'Disciplines',
  35. children: [
  36. {
  37. value: 'consistency',
  38. label: 'Consistency',
  39. },
  40. {
  41. value: 'feedback',
  42. label: 'Feedback',
  43. },
  44. {
  45. value: 'efficiency',
  46. label: 'Efficiency',
  47. },
  48. {
  49. value: 'controllability',
  50. label: 'Controllability',
  51. },
  52. ],
  53. },
  54. {
  55. value: 'navigation',
  56. label: 'Navigation',
  57. children: [
  58. {
  59. value: 'side nav',
  60. label: 'Side Navigation',
  61. },
  62. {
  63. value: 'top nav',
  64. label: 'Top Navigation',
  65. },
  66. ],
  67. },
  68. ],
  69. },
  70. {
  71. value: 'component',
  72. label: 'Component',
  73. children: [
  74. {
  75. value: 'basic',
  76. label: 'Basic',
  77. children: [
  78. {
  79. value: 'layout',
  80. label: 'Layout',
  81. },
  82. {
  83. value: 'color',
  84. label: 'Color',
  85. },
  86. {
  87. value: 'typography',
  88. label: 'Typography',
  89. },
  90. {
  91. value: 'icon',
  92. label: 'Icon',
  93. },
  94. {
  95. value: 'button',
  96. label: 'Button',
  97. },
  98. ],
  99. },
  100. {
  101. value: 'form',
  102. label: 'Form',
  103. children: [
  104. {
  105. value: 'radio',
  106. label: 'Radio',
  107. },
  108. {
  109. value: 'checkbox',
  110. label: 'Checkbox',
  111. },
  112. {
  113. value: 'input',
  114. label: 'Input',
  115. },
  116. {
  117. value: 'input-number',
  118. label: 'InputNumber',
  119. },
  120. {
  121. value: 'select',
  122. label: 'Select',
  123. },
  124. {
  125. value: 'cascader',
  126. label: 'Cascader',
  127. },
  128. {
  129. value: 'switch',
  130. label: 'Switch',
  131. },
  132. {
  133. value: 'slider',
  134. label: 'Slider',
  135. },
  136. {
  137. value: 'time-picker',
  138. label: 'TimePicker',
  139. },
  140. {
  141. value: 'date-picker',
  142. label: 'DatePicker',
  143. },
  144. {
  145. value: 'datetime-picker',
  146. label: 'DateTimePicker',
  147. },
  148. {
  149. value: 'upload',
  150. label: 'Upload',
  151. },
  152. {
  153. value: 'rate',
  154. label: 'Rate',
  155. },
  156. {
  157. value: 'form',
  158. label: 'Form',
  159. },
  160. ],
  161. },
  162. {
  163. value: 'data',
  164. label: 'Data',
  165. children: [
  166. {
  167. value: 'table',
  168. label: 'Table',
  169. },
  170. {
  171. value: 'tag',
  172. label: 'Tag',
  173. },
  174. {
  175. value: 'progress',
  176. label: 'Progress',
  177. },
  178. {
  179. value: 'tree',
  180. label: 'Tree',
  181. },
  182. {
  183. value: 'pagination',
  184. label: 'Pagination',
  185. },
  186. {
  187. value: 'badge',
  188. label: 'Badge',
  189. },
  190. ],
  191. },
  192. {
  193. value: 'notice',
  194. label: 'Notice',
  195. children: [
  196. {
  197. value: 'alert',
  198. label: 'Alert',
  199. },
  200. {
  201. value: 'loading',
  202. label: 'Loading',
  203. },
  204. {
  205. value: 'message',
  206. label: 'Message',
  207. },
  208. {
  209. value: 'message-box',
  210. label: 'MessageBox',
  211. },
  212. {
  213. value: 'notification',
  214. label: 'Notification',
  215. },
  216. ],
  217. },
  218. {
  219. value: 'navigation',
  220. label: 'Navigation',
  221. children: [
  222. {
  223. value: 'menu',
  224. label: 'Menu',
  225. },
  226. {
  227. value: 'tabs',
  228. label: 'Tabs',
  229. },
  230. {
  231. value: 'breadcrumb',
  232. label: 'Breadcrumb',
  233. },
  234. {
  235. value: 'dropdown',
  236. label: 'Dropdown',
  237. },
  238. {
  239. value: 'steps',
  240. label: 'Steps',
  241. },
  242. ],
  243. },
  244. {
  245. value: 'others',
  246. label: 'Others',
  247. children: [
  248. {
  249. value: 'dialog',
  250. label: 'Dialog',
  251. },
  252. {
  253. value: 'tooltip',
  254. label: 'Tooltip',
  255. },
  256. {
  257. value: 'popover',
  258. label: 'Popover',
  259. },
  260. {
  261. value: 'card',
  262. label: 'Card',
  263. },
  264. {
  265. value: 'carousel',
  266. label: 'Carousel',
  267. },
  268. {
  269. value: 'collapse',
  270. label: 'Collapse',
  271. },
  272. ],
  273. },
  274. ],
  275. },
  276. {
  277. value: 'resource',
  278. label: 'Resource',
  279. children: [
  280. {
  281. value: 'axure',
  282. label: 'Axure Components',
  283. },
  284. {
  285. value: 'sketch',
  286. label: 'Sketch Templates',
  287. },
  288. {
  289. value: 'docs',
  290. label: 'Design Documentation',
  291. },
  292. ],
  293. },
  294. ]
  295. </script>
  296. <style scoped>
  297. .example-block {
  298. margin: 1rem;
  299. }
  300. .example-demonstration {
  301. margin: 1rem;
  302. }
  303. </style>

有禁用选项

通过在数据源中设置 disabled 字段来声明该选项是禁用的

本例中,options指定的数组中的第一个元素含有disabled: true键值对,因此是禁用的。 在默认情况下,Cascader 会检查数据中每一项的disabled字段是否为true,如果你的数据中表示禁用含义的字段名不为disabled,可以通过props.disabled属性来指定(详见下方 API 表格)。 当然,valuelabelchildren这三个字段名也可以通过同样的方式指定。

Cascader 级联选择器 - 图2

  1. <template>
  2. <el-cascader :options="options" />
  3. </template>
  4. <script lang="ts" setup>
  5. const options = [
  6. {
  7. value: 'guide',
  8. label: 'Guide',
  9. disabled: true,
  10. children: [
  11. {
  12. value: 'disciplines',
  13. label: 'Disciplines',
  14. children: [
  15. {
  16. value: 'consistency',
  17. label: 'Consistency',
  18. },
  19. {
  20. value: 'feedback',
  21. label: 'Feedback',
  22. },
  23. {
  24. value: 'efficiency',
  25. label: 'Efficiency',
  26. },
  27. {
  28. value: 'controllability',
  29. label: 'Controllability',
  30. },
  31. ],
  32. },
  33. {
  34. value: 'navigation',
  35. label: 'Navigation',
  36. children: [
  37. {
  38. value: 'side nav',
  39. label: 'Side Navigation',
  40. },
  41. {
  42. value: 'top nav',
  43. label: 'Top Navigation',
  44. },
  45. ],
  46. },
  47. ],
  48. },
  49. {
  50. value: 'component',
  51. label: 'Component',
  52. children: [
  53. {
  54. value: 'basic',
  55. label: 'Basic',
  56. children: [
  57. {
  58. value: 'layout',
  59. label: 'Layout',
  60. },
  61. {
  62. value: 'color',
  63. label: 'Color',
  64. },
  65. {
  66. value: 'typography',
  67. label: 'Typography',
  68. },
  69. {
  70. value: 'icon',
  71. label: 'Icon',
  72. },
  73. {
  74. value: 'button',
  75. label: 'Button',
  76. },
  77. ],
  78. },
  79. {
  80. value: 'form',
  81. label: 'Form',
  82. children: [
  83. {
  84. value: 'radio',
  85. label: 'Radio',
  86. },
  87. {
  88. value: 'checkbox',
  89. label: 'Checkbox',
  90. },
  91. {
  92. value: 'input',
  93. label: 'Input',
  94. },
  95. {
  96. value: 'input-number',
  97. label: 'InputNumber',
  98. },
  99. {
  100. value: 'select',
  101. label: 'Select',
  102. },
  103. {
  104. value: 'cascader',
  105. label: 'Cascader',
  106. },
  107. {
  108. value: 'switch',
  109. label: 'Switch',
  110. },
  111. {
  112. value: 'slider',
  113. label: 'Slider',
  114. },
  115. {
  116. value: 'time-picker',
  117. label: 'TimePicker',
  118. },
  119. {
  120. value: 'date-picker',
  121. label: 'DatePicker',
  122. },
  123. {
  124. value: 'datetime-picker',
  125. label: 'DateTimePicker',
  126. },
  127. {
  128. value: 'upload',
  129. label: 'Upload',
  130. },
  131. {
  132. value: 'rate',
  133. label: 'Rate',
  134. },
  135. {
  136. value: 'form',
  137. label: 'Form',
  138. },
  139. ],
  140. },
  141. {
  142. value: 'data',
  143. label: 'Data',
  144. children: [
  145. {
  146. value: 'table',
  147. label: 'Table',
  148. },
  149. {
  150. value: 'tag',
  151. label: 'Tag',
  152. },
  153. {
  154. value: 'progress',
  155. label: 'Progress',
  156. },
  157. {
  158. value: 'tree',
  159. label: 'Tree',
  160. },
  161. {
  162. value: 'pagination',
  163. label: 'Pagination',
  164. },
  165. {
  166. value: 'badge',
  167. label: 'Badge',
  168. },
  169. ],
  170. },
  171. {
  172. value: 'notice',
  173. label: 'Notice',
  174. children: [
  175. {
  176. value: 'alert',
  177. label: 'Alert',
  178. },
  179. {
  180. value: 'loading',
  181. label: 'Loading',
  182. },
  183. {
  184. value: 'message',
  185. label: 'Message',
  186. },
  187. {
  188. value: 'message-box',
  189. label: 'MessageBox',
  190. },
  191. {
  192. value: 'notification',
  193. label: 'Notification',
  194. },
  195. ],
  196. },
  197. {
  198. value: 'navigation',
  199. label: 'Navigation',
  200. children: [
  201. {
  202. value: 'menu',
  203. label: 'Menu',
  204. },
  205. {
  206. value: 'tabs',
  207. label: 'Tabs',
  208. },
  209. {
  210. value: 'breadcrumb',
  211. label: 'Breadcrumb',
  212. },
  213. {
  214. value: 'dropdown',
  215. label: 'Dropdown',
  216. },
  217. {
  218. value: 'steps',
  219. label: 'Steps',
  220. },
  221. ],
  222. },
  223. {
  224. value: 'others',
  225. label: 'Others',
  226. children: [
  227. {
  228. value: 'dialog',
  229. label: 'Dialog',
  230. },
  231. {
  232. value: 'tooltip',
  233. label: 'Tooltip',
  234. },
  235. {
  236. value: 'popover',
  237. label: 'Popover',
  238. },
  239. {
  240. value: 'card',
  241. label: 'Card',
  242. },
  243. {
  244. value: 'carousel',
  245. label: 'Carousel',
  246. },
  247. {
  248. value: 'collapse',
  249. label: 'Collapse',
  250. },
  251. ],
  252. },
  253. ],
  254. },
  255. {
  256. value: 'resource',
  257. label: 'Resource',
  258. children: [
  259. {
  260. value: 'axure',
  261. label: 'Axure Components',
  262. },
  263. {
  264. value: 'sketch',
  265. label: 'Sketch Templates',
  266. },
  267. {
  268. value: 'docs',
  269. label: 'Design Documentation',
  270. },
  271. ],
  272. },
  273. ]
  274. </script>

可清空

通过 clearable 设置输入框可清空

Cascader 级联选择器 - 图3

  1. <template>
  2. <el-cascader :options="options" clearable />
  3. </template>
  4. <script lang="ts" setup>
  5. const options = [
  6. {
  7. value: 'guide',
  8. label: 'Guide',
  9. children: [
  10. {
  11. value: 'disciplines',
  12. label: 'Disciplines',
  13. children: [
  14. {
  15. value: 'consistency',
  16. label: 'Consistency',
  17. },
  18. {
  19. value: 'feedback',
  20. label: 'Feedback',
  21. },
  22. {
  23. value: 'efficiency',
  24. label: 'Efficiency',
  25. },
  26. {
  27. value: 'controllability',
  28. label: 'Controllability',
  29. },
  30. ],
  31. },
  32. {
  33. value: 'navigation',
  34. label: 'Navigation',
  35. children: [
  36. {
  37. value: 'side nav',
  38. label: 'Side Navigation',
  39. },
  40. {
  41. value: 'top nav',
  42. label: 'Top Navigation',
  43. },
  44. ],
  45. },
  46. ],
  47. },
  48. {
  49. value: 'component',
  50. label: 'Component',
  51. children: [
  52. {
  53. value: 'basic',
  54. label: 'Basic',
  55. children: [
  56. {
  57. value: 'layout',
  58. label: 'Layout',
  59. },
  60. {
  61. value: 'color',
  62. label: 'Color',
  63. },
  64. {
  65. value: 'typography',
  66. label: 'Typography',
  67. },
  68. {
  69. value: 'icon',
  70. label: 'Icon',
  71. },
  72. {
  73. value: 'button',
  74. label: 'Button',
  75. },
  76. ],
  77. },
  78. {
  79. value: 'form',
  80. label: 'Form',
  81. children: [
  82. {
  83. value: 'radio',
  84. label: 'Radio',
  85. },
  86. {
  87. value: 'checkbox',
  88. label: 'Checkbox',
  89. },
  90. {
  91. value: 'input',
  92. label: 'Input',
  93. },
  94. {
  95. value: 'input-number',
  96. label: 'InputNumber',
  97. },
  98. {
  99. value: 'select',
  100. label: 'Select',
  101. },
  102. {
  103. value: 'cascader',
  104. label: 'Cascader',
  105. },
  106. {
  107. value: 'switch',
  108. label: 'Switch',
  109. },
  110. {
  111. value: 'slider',
  112. label: 'Slider',
  113. },
  114. {
  115. value: 'time-picker',
  116. label: 'TimePicker',
  117. },
  118. {
  119. value: 'date-picker',
  120. label: 'DatePicker',
  121. },
  122. {
  123. value: 'datetime-picker',
  124. label: 'DateTimePicker',
  125. },
  126. {
  127. value: 'upload',
  128. label: 'Upload',
  129. },
  130. {
  131. value: 'rate',
  132. label: 'Rate',
  133. },
  134. {
  135. value: 'form',
  136. label: 'Form',
  137. },
  138. ],
  139. },
  140. {
  141. value: 'data',
  142. label: 'Data',
  143. children: [
  144. {
  145. value: 'table',
  146. label: 'Table',
  147. },
  148. {
  149. value: 'tag',
  150. label: 'Tag',
  151. },
  152. {
  153. value: 'progress',
  154. label: 'Progress',
  155. },
  156. {
  157. value: 'tree',
  158. label: 'Tree',
  159. },
  160. {
  161. value: 'pagination',
  162. label: 'Pagination',
  163. },
  164. {
  165. value: 'badge',
  166. label: 'Badge',
  167. },
  168. ],
  169. },
  170. {
  171. value: 'notice',
  172. label: 'Notice',
  173. children: [
  174. {
  175. value: 'alert',
  176. label: 'Alert',
  177. },
  178. {
  179. value: 'loading',
  180. label: 'Loading',
  181. },
  182. {
  183. value: 'message',
  184. label: 'Message',
  185. },
  186. {
  187. value: 'message-box',
  188. label: 'MessageBox',
  189. },
  190. {
  191. value: 'notification',
  192. label: 'Notification',
  193. },
  194. ],
  195. },
  196. {
  197. value: 'navigation',
  198. label: 'Navigation',
  199. children: [
  200. {
  201. value: 'menu',
  202. label: 'Menu',
  203. },
  204. {
  205. value: 'tabs',
  206. label: 'Tabs',
  207. },
  208. {
  209. value: 'breadcrumb',
  210. label: 'Breadcrumb',
  211. },
  212. {
  213. value: 'dropdown',
  214. label: 'Dropdown',
  215. },
  216. {
  217. value: 'steps',
  218. label: 'Steps',
  219. },
  220. ],
  221. },
  222. {
  223. value: 'others',
  224. label: 'Others',
  225. children: [
  226. {
  227. value: 'dialog',
  228. label: 'Dialog',
  229. },
  230. {
  231. value: 'tooltip',
  232. label: 'Tooltip',
  233. },
  234. {
  235. value: 'popover',
  236. label: 'Popover',
  237. },
  238. {
  239. value: 'card',
  240. label: 'Card',
  241. },
  242. {
  243. value: 'carousel',
  244. label: 'Carousel',
  245. },
  246. {
  247. value: 'collapse',
  248. label: 'Collapse',
  249. },
  250. ],
  251. },
  252. ],
  253. },
  254. {
  255. value: 'resource',
  256. label: 'Resource',
  257. children: [
  258. {
  259. value: 'axure',
  260. label: 'Axure Components',
  261. },
  262. {
  263. value: 'sketch',
  264. label: 'Sketch Templates',
  265. },
  266. {
  267. value: 'docs',
  268. label: 'Design Documentation',
  269. },
  270. ],
  271. },
  272. ]
  273. </script>

仅显示最后一级

可以仅在输入框中显示选中项最后一级的标签,而不是选中项所在的完整路径。

属性show-all-levels定义了是否显示完整的路径, 将其赋值为 false 则仅显示最后一级。

Cascader 级联选择器 - 图4

  1. <template>
  2. <el-cascader :options="options" :show-all-levels="false" />
  3. </template>
  4. <script lang="ts" setup>
  5. const options = [
  6. {
  7. value: 'guide',
  8. label: 'Guide',
  9. children: [
  10. {
  11. value: 'disciplines',
  12. label: 'Disciplines',
  13. children: [
  14. {
  15. value: 'consistency',
  16. label: 'Consistency',
  17. },
  18. {
  19. value: 'feedback',
  20. label: 'Feedback',
  21. },
  22. {
  23. value: 'efficiency',
  24. label: 'Efficiency',
  25. },
  26. {
  27. value: 'controllability',
  28. label: 'Controllability',
  29. },
  30. ],
  31. },
  32. {
  33. value: 'navigation',
  34. label: 'Navigation',
  35. children: [
  36. {
  37. value: 'side nav',
  38. label: 'Side Navigation',
  39. },
  40. {
  41. value: 'top nav',
  42. label: 'Top Navigation',
  43. },
  44. ],
  45. },
  46. ],
  47. },
  48. {
  49. value: 'component',
  50. label: 'Component',
  51. children: [
  52. {
  53. value: 'basic',
  54. label: 'Basic',
  55. children: [
  56. {
  57. value: 'layout',
  58. label: 'Layout',
  59. },
  60. {
  61. value: 'color',
  62. label: 'Color',
  63. },
  64. {
  65. value: 'typography',
  66. label: 'Typography',
  67. },
  68. {
  69. value: 'icon',
  70. label: 'Icon',
  71. },
  72. {
  73. value: 'button',
  74. label: 'Button',
  75. },
  76. ],
  77. },
  78. {
  79. value: 'form',
  80. label: 'Form',
  81. children: [
  82. {
  83. value: 'radio',
  84. label: 'Radio',
  85. },
  86. {
  87. value: 'checkbox',
  88. label: 'Checkbox',
  89. },
  90. {
  91. value: 'input',
  92. label: 'Input',
  93. },
  94. {
  95. value: 'input-number',
  96. label: 'InputNumber',
  97. },
  98. {
  99. value: 'select',
  100. label: 'Select',
  101. },
  102. {
  103. value: 'cascader',
  104. label: 'Cascader',
  105. },
  106. {
  107. value: 'switch',
  108. label: 'Switch',
  109. },
  110. {
  111. value: 'slider',
  112. label: 'Slider',
  113. },
  114. {
  115. value: 'time-picker',
  116. label: 'TimePicker',
  117. },
  118. {
  119. value: 'date-picker',
  120. label: 'DatePicker',
  121. },
  122. {
  123. value: 'datetime-picker',
  124. label: 'DateTimePicker',
  125. },
  126. {
  127. value: 'upload',
  128. label: 'Upload',
  129. },
  130. {
  131. value: 'rate',
  132. label: 'Rate',
  133. },
  134. {
  135. value: 'form',
  136. label: 'Form',
  137. },
  138. ],
  139. },
  140. {
  141. value: 'data',
  142. label: 'Data',
  143. children: [
  144. {
  145. value: 'table',
  146. label: 'Table',
  147. },
  148. {
  149. value: 'tag',
  150. label: 'Tag',
  151. },
  152. {
  153. value: 'progress',
  154. label: 'Progress',
  155. },
  156. {
  157. value: 'tree',
  158. label: 'Tree',
  159. },
  160. {
  161. value: 'pagination',
  162. label: 'Pagination',
  163. },
  164. {
  165. value: 'badge',
  166. label: 'Badge',
  167. },
  168. ],
  169. },
  170. {
  171. value: 'notice',
  172. label: 'Notice',
  173. children: [
  174. {
  175. value: 'alert',
  176. label: 'Alert',
  177. },
  178. {
  179. value: 'loading',
  180. label: 'Loading',
  181. },
  182. {
  183. value: 'message',
  184. label: 'Message',
  185. },
  186. {
  187. value: 'message-box',
  188. label: 'MessageBox',
  189. },
  190. {
  191. value: 'notification',
  192. label: 'Notification',
  193. },
  194. ],
  195. },
  196. {
  197. value: 'navigation',
  198. label: 'Navigation',
  199. children: [
  200. {
  201. value: 'menu',
  202. label: 'Menu',
  203. },
  204. {
  205. value: 'tabs',
  206. label: 'Tabs',
  207. },
  208. {
  209. value: 'breadcrumb',
  210. label: 'Breadcrumb',
  211. },
  212. {
  213. value: 'dropdown',
  214. label: 'Dropdown',
  215. },
  216. {
  217. value: 'steps',
  218. label: 'Steps',
  219. },
  220. ],
  221. },
  222. {
  223. value: 'others',
  224. label: 'Others',
  225. children: [
  226. {
  227. value: 'dialog',
  228. label: 'Dialog',
  229. },
  230. {
  231. value: 'tooltip',
  232. label: 'Tooltip',
  233. },
  234. {
  235. value: 'popover',
  236. label: 'Popover',
  237. },
  238. {
  239. value: 'card',
  240. label: 'Card',
  241. },
  242. {
  243. value: 'carousel',
  244. label: 'Carousel',
  245. },
  246. {
  247. value: 'collapse',
  248. label: 'Collapse',
  249. },
  250. ],
  251. },
  252. ],
  253. },
  254. {
  255. value: 'resource',
  256. label: 'Resource',
  257. children: [
  258. {
  259. value: 'axure',
  260. label: 'Axure Components',
  261. },
  262. {
  263. value: 'sketch',
  264. label: 'Sketch Templates',
  265. },
  266. {
  267. value: 'docs',
  268. label: 'Design Documentation',
  269. },
  270. ],
  271. },
  272. ]
  273. </script>

多选

在标签中添加 :props="props" 并设置 props = { multiple: true } 来开启多选模式。

正确用法:

  1. <template>
  2. <el-cascader :props="props" />
  3. </template>
  4. <script lang="ts">
  5. export default {
  6. setup() {
  7. return {
  8. props: {
  9. // props.
  10. multiple: true,
  11. },
  12. }
  13. },
  14. }
  15. </script>

错误用法:

  1. <template>
  2. <!-- Object literal binging here is invalid syntax for cascader -->
  3. <el-cascader :props="{ multiple: true }" />
  4. </template>

使用多选时,所有选中的标签将默认显示。 您可以设置 collapse = true 将选中的标签折叠。 当鼠标悬停折叠文字时,您可以使用 collapse-tags-tooltip 属性来查看它们。

Cascader 级联选择器 - 图5

  1. <template>
  2. <div class="example-block">
  3. <span class="example-demonstration">Display all tags (default)</span>
  4. <el-cascader :options="options" :props="props" clearable />
  5. </div>
  6. <div class="example-block">
  7. <span class="example-demonstration">Collapse tags</span>
  8. <el-cascader :options="options" :props="props" collapse-tags clearable />
  9. </div>
  10. <div class="example-block">
  11. <span class="example-demonstration">Collapse tags tooltip</span>
  12. <el-cascader
  13. :options="options"
  14. :props="props"
  15. collapse-tags
  16. collapse-tags-tooltip
  17. clearable
  18. />
  19. </div>
  20. </template>
  21. <script lang="ts" setup>
  22. const props = { multiple: true }
  23. const options = [
  24. {
  25. value: 1,
  26. label: 'Asia',
  27. children: [
  28. {
  29. value: 2,
  30. label: 'China',
  31. children: [
  32. { value: 3, label: 'Beijing' },
  33. { value: 4, label: 'Shanghai' },
  34. { value: 5, label: 'Hangzhou' },
  35. ],
  36. },
  37. {
  38. value: 6,
  39. label: 'Japan',
  40. children: [
  41. { value: 7, label: 'Tokyo' },
  42. { value: 8, label: 'Osaka' },
  43. { value: 9, label: 'Kyoto' },
  44. ],
  45. },
  46. {
  47. value: 10,
  48. label: 'Korea',
  49. children: [
  50. { value: 11, label: 'Seoul' },
  51. { value: 12, label: 'Busan' },
  52. { value: 13, label: 'Taegu' },
  53. ],
  54. },
  55. ],
  56. },
  57. {
  58. value: 14,
  59. label: 'Europe',
  60. children: [
  61. {
  62. value: 15,
  63. label: 'France',
  64. children: [
  65. { value: 16, label: 'Paris' },
  66. { value: 17, label: 'Marseille' },
  67. { value: 18, label: 'Lyon' },
  68. ],
  69. },
  70. {
  71. value: 19,
  72. label: 'UK',
  73. children: [
  74. { value: 20, label: 'London' },
  75. { value: 21, label: 'Birmingham' },
  76. { value: 22, label: 'Manchester' },
  77. ],
  78. },
  79. ],
  80. },
  81. {
  82. value: 23,
  83. label: 'North America',
  84. children: [
  85. {
  86. value: 24,
  87. label: 'US',
  88. children: [
  89. { value: 25, label: 'New York' },
  90. { value: 26, label: 'Los Angeles' },
  91. { value: 27, label: 'Washington' },
  92. ],
  93. },
  94. {
  95. value: 28,
  96. label: 'Canada',
  97. children: [
  98. { value: 29, label: 'Toronto' },
  99. { value: 30, label: 'Montreal' },
  100. { value: 31, label: 'Ottawa' },
  101. ],
  102. },
  103. ],
  104. },
  105. ]
  106. </script>
  107. <style scoped>
  108. .example-block {
  109. margin: 1rem;
  110. }
  111. .example-demonstration {
  112. margin: 1rem;
  113. }
  114. </style>

选择任意一级选项

在单选模式下,你只能选择叶子节点;而在多选模式下,勾选父节点真正选中的都是叶子节点。 启用该功能后,可让父子节点取消关联,选择任意一级选项。

可通过 props.checkStrictly = true 来设置父子节点取消选中关联,从而达到选择任意一级选项的目的。

Cascader 级联选择器 - 图6

  1. <template>
  2. <div class="example-block">
  3. <span class="example-demonstration"
  4. >Select any level of options (Single selection)</span
  5. >
  6. <el-cascader :options="options" :props="props1" clearable />
  7. </div>
  8. <div class="example-block">
  9. <span class="example-demonstration"
  10. >Select any level of options (Multiple selection)</span
  11. >
  12. <el-cascader :options="options" :props="props2" clearable />
  13. </div>
  14. </template>
  15. <script lang="ts" setup>
  16. const props1 = {
  17. checkStrictly: true,
  18. }
  19. const props2 = {
  20. multiple: true,
  21. checkStrictly: true,
  22. }
  23. const options = [
  24. {
  25. value: 'guide',
  26. label: 'Guide',
  27. children: [
  28. {
  29. value: 'disciplines',
  30. label: 'Disciplines',
  31. children: [
  32. {
  33. value: 'consistency',
  34. label: 'Consistency',
  35. },
  36. {
  37. value: 'feedback',
  38. label: 'Feedback',
  39. },
  40. {
  41. value: 'efficiency',
  42. label: 'Efficiency',
  43. },
  44. {
  45. value: 'controllability',
  46. label: 'Controllability',
  47. },
  48. ],
  49. },
  50. {
  51. value: 'navigation',
  52. label: 'Navigation',
  53. children: [
  54. {
  55. value: 'side nav',
  56. label: 'Side Navigation',
  57. },
  58. {
  59. value: 'top nav',
  60. label: 'Top Navigation',
  61. },
  62. ],
  63. },
  64. ],
  65. },
  66. {
  67. value: 'component',
  68. label: 'Component',
  69. children: [
  70. {
  71. value: 'basic',
  72. label: 'Basic',
  73. children: [
  74. {
  75. value: 'layout',
  76. label: 'Layout',
  77. },
  78. {
  79. value: 'color',
  80. label: 'Color',
  81. },
  82. {
  83. value: 'typography',
  84. label: 'Typography',
  85. },
  86. {
  87. value: 'icon',
  88. label: 'Icon',
  89. },
  90. {
  91. value: 'button',
  92. label: 'Button',
  93. },
  94. ],
  95. },
  96. {
  97. value: 'form',
  98. label: 'Form',
  99. children: [
  100. {
  101. value: 'radio',
  102. label: 'Radio',
  103. },
  104. {
  105. value: 'checkbox',
  106. label: 'Checkbox',
  107. },
  108. {
  109. value: 'input',
  110. label: 'Input',
  111. },
  112. {
  113. value: 'input-number',
  114. label: 'InputNumber',
  115. },
  116. {
  117. value: 'select',
  118. label: 'Select',
  119. },
  120. {
  121. value: 'cascader',
  122. label: 'Cascader',
  123. },
  124. {
  125. value: 'switch',
  126. label: 'Switch',
  127. },
  128. {
  129. value: 'slider',
  130. label: 'Slider',
  131. },
  132. {
  133. value: 'time-picker',
  134. label: 'TimePicker',
  135. },
  136. {
  137. value: 'date-picker',
  138. label: 'DatePicker',
  139. },
  140. {
  141. value: 'datetime-picker',
  142. label: 'DateTimePicker',
  143. },
  144. {
  145. value: 'upload',
  146. label: 'Upload',
  147. },
  148. {
  149. value: 'rate',
  150. label: 'Rate',
  151. },
  152. {
  153. value: 'form',
  154. label: 'Form',
  155. },
  156. ],
  157. },
  158. {
  159. value: 'data',
  160. label: 'Data',
  161. children: [
  162. {
  163. value: 'table',
  164. label: 'Table',
  165. },
  166. {
  167. value: 'tag',
  168. label: 'Tag',
  169. },
  170. {
  171. value: 'progress',
  172. label: 'Progress',
  173. },
  174. {
  175. value: 'tree',
  176. label: 'Tree',
  177. },
  178. {
  179. value: 'pagination',
  180. label: 'Pagination',
  181. },
  182. {
  183. value: 'badge',
  184. label: 'Badge',
  185. },
  186. ],
  187. },
  188. {
  189. value: 'notice',
  190. label: 'Notice',
  191. children: [
  192. {
  193. value: 'alert',
  194. label: 'Alert',
  195. },
  196. {
  197. value: 'loading',
  198. label: 'Loading',
  199. },
  200. {
  201. value: 'message',
  202. label: 'Message',
  203. },
  204. {
  205. value: 'message-box',
  206. label: 'MessageBox',
  207. },
  208. {
  209. value: 'notification',
  210. label: 'Notification',
  211. },
  212. ],
  213. },
  214. {
  215. value: 'navigation',
  216. label: 'Navigation',
  217. children: [
  218. {
  219. value: 'menu',
  220. label: 'Menu',
  221. },
  222. {
  223. value: 'tabs',
  224. label: 'Tabs',
  225. },
  226. {
  227. value: 'breadcrumb',
  228. label: 'Breadcrumb',
  229. },
  230. {
  231. value: 'dropdown',
  232. label: 'Dropdown',
  233. },
  234. {
  235. value: 'steps',
  236. label: 'Steps',
  237. },
  238. ],
  239. },
  240. {
  241. value: 'others',
  242. label: 'Others',
  243. children: [
  244. {
  245. value: 'dialog',
  246. label: 'Dialog',
  247. },
  248. {
  249. value: 'tooltip',
  250. label: 'Tooltip',
  251. },
  252. {
  253. value: 'popover',
  254. label: 'Popover',
  255. },
  256. {
  257. value: 'card',
  258. label: 'Card',
  259. },
  260. {
  261. value: 'carousel',
  262. label: 'Carousel',
  263. },
  264. {
  265. value: 'collapse',
  266. label: 'Collapse',
  267. },
  268. ],
  269. },
  270. ],
  271. },
  272. {
  273. value: 'resource',
  274. label: 'Resource',
  275. children: [
  276. {
  277. value: 'axure',
  278. label: 'Axure Components',
  279. },
  280. {
  281. value: 'sketch',
  282. label: 'Sketch Templates',
  283. },
  284. {
  285. value: 'docs',
  286. label: 'Design Documentation',
  287. },
  288. ],
  289. },
  290. ]
  291. </script>
  292. <style scoped>
  293. .example-block {
  294. margin: 1rem;
  295. }
  296. .example-demonstration {
  297. margin: 1rem;
  298. }
  299. </style>

动态加载

当选中某一级时,动态加载该级下的选项。

通过lazy开启动态加载,并通过lazyload来设置加载数据源的方法。 lazyload方法有两个参数,第一个参数node为当前点击的节点,第二个resolve为数据加载完成的回调(必须调用)。 为了更准确的显示节点的状态,还可以对节点数据添加是否为叶子节点的标志位 (默认字段为leaf,可通过props.leaf修改)。 否则,将以有无子节点来判断其是否为叶子节点。

Cascader 级联选择器 - 图7

  1. <template>
  2. <el-cascader :props="props" />
  3. </template>
  4. <script lang="ts" setup>
  5. let id = 0
  6. const props = {
  7. lazy: true,
  8. lazyLoad(node, resolve) {
  9. const { level } = node
  10. setTimeout(() => {
  11. const nodes = Array.from({ length: level + 1 }).map((item) => ({
  12. value: ++id,
  13. label: `Option - ${id}`,
  14. leaf: level >= 2,
  15. }))
  16. // Invoke `resolve` callback to return the child nodes data and indicate the loading is finished.
  17. resolve(nodes)
  18. }, 1000)
  19. },
  20. }
  21. </script>

可搜索

可以快捷地搜索选项并选择。

通过添加filterable来启用过滤。 Cascader 会匹配所有节点的标签和它们的亲节点的标签,是否包含有输入的关键字。 你也可以用filter-method自定义搜索逻辑,接受一个函数,第一个参数是节点node,第二个参数是搜索关键词keyword,通过返回布尔值表示是否命中。

Cascader 级联选择器 - 图8

  1. <template>
  2. <div class="example-block">
  3. <span class="example-demonstration">Filterable (Single selection)</span>
  4. <el-cascader
  5. placeholder="Try searchingL Guide"
  6. :options="options"
  7. filterable
  8. />
  9. </div>
  10. <div class="example-block">
  11. <span class="example-demonstration">Filterable (Multiple selection)</span>
  12. <el-cascader
  13. placeholder="Try searchingL Guide"
  14. :options="options"
  15. :props="props"
  16. filterable
  17. />
  18. </div>
  19. </template>
  20. <script lang="ts" setup>
  21. const props = {
  22. multiple: true,
  23. }
  24. const options = [
  25. {
  26. value: 'guide',
  27. label: 'Guide',
  28. children: [
  29. {
  30. value: 'disciplines',
  31. label: 'Disciplines',
  32. children: [
  33. {
  34. value: 'consistency',
  35. label: 'Consistency',
  36. },
  37. {
  38. value: 'feedback',
  39. label: 'Feedback',
  40. },
  41. {
  42. value: 'efficiency',
  43. label: 'Efficiency',
  44. },
  45. {
  46. value: 'controllability',
  47. label: 'Controllability',
  48. },
  49. ],
  50. },
  51. {
  52. value: 'navigation',
  53. label: 'Navigation',
  54. children: [
  55. {
  56. value: 'side nav',
  57. label: 'Side Navigation',
  58. },
  59. {
  60. value: 'top nav',
  61. label: 'Top Navigation',
  62. },
  63. ],
  64. },
  65. ],
  66. },
  67. {
  68. value: 'component',
  69. label: 'Component',
  70. children: [
  71. {
  72. value: 'basic',
  73. label: 'Basic',
  74. children: [
  75. {
  76. value: 'layout',
  77. label: 'Layout',
  78. },
  79. {
  80. value: 'color',
  81. label: 'Color',
  82. },
  83. {
  84. value: 'typography',
  85. label: 'Typography',
  86. },
  87. {
  88. value: 'icon',
  89. label: 'Icon',
  90. },
  91. {
  92. value: 'button',
  93. label: 'Button',
  94. },
  95. ],
  96. },
  97. {
  98. value: 'form',
  99. label: 'Form',
  100. children: [
  101. {
  102. value: 'radio',
  103. label: 'Radio',
  104. },
  105. {
  106. value: 'checkbox',
  107. label: 'Checkbox',
  108. },
  109. {
  110. value: 'input',
  111. label: 'Input',
  112. },
  113. {
  114. value: 'input-number',
  115. label: 'InputNumber',
  116. },
  117. {
  118. value: 'select',
  119. label: 'Select',
  120. },
  121. {
  122. value: 'cascader',
  123. label: 'Cascader',
  124. },
  125. {
  126. value: 'switch',
  127. label: 'Switch',
  128. },
  129. {
  130. value: 'slider',
  131. label: 'Slider',
  132. },
  133. {
  134. value: 'time-picker',
  135. label: 'TimePicker',
  136. },
  137. {
  138. value: 'date-picker',
  139. label: 'DatePicker',
  140. },
  141. {
  142. value: 'datetime-picker',
  143. label: 'DateTimePicker',
  144. },
  145. {
  146. value: 'upload',
  147. label: 'Upload',
  148. },
  149. {
  150. value: 'rate',
  151. label: 'Rate',
  152. },
  153. {
  154. value: 'form',
  155. label: 'Form',
  156. },
  157. ],
  158. },
  159. {
  160. value: 'data',
  161. label: 'Data',
  162. children: [
  163. {
  164. value: 'table',
  165. label: 'Table',
  166. },
  167. {
  168. value: 'tag',
  169. label: 'Tag',
  170. },
  171. {
  172. value: 'progress',
  173. label: 'Progress',
  174. },
  175. {
  176. value: 'tree',
  177. label: 'Tree',
  178. },
  179. {
  180. value: 'pagination',
  181. label: 'Pagination',
  182. },
  183. {
  184. value: 'badge',
  185. label: 'Badge',
  186. },
  187. ],
  188. },
  189. {
  190. value: 'notice',
  191. label: 'Notice',
  192. children: [
  193. {
  194. value: 'alert',
  195. label: 'Alert',
  196. },
  197. {
  198. value: 'loading',
  199. label: 'Loading',
  200. },
  201. {
  202. value: 'message',
  203. label: 'Message',
  204. },
  205. {
  206. value: 'message-box',
  207. label: 'MessageBox',
  208. },
  209. {
  210. value: 'notification',
  211. label: 'Notification',
  212. },
  213. ],
  214. },
  215. {
  216. value: 'navigation',
  217. label: 'Navigation',
  218. children: [
  219. {
  220. value: 'menu',
  221. label: 'Menu',
  222. },
  223. {
  224. value: 'tabs',
  225. label: 'Tabs',
  226. },
  227. {
  228. value: 'breadcrumb',
  229. label: 'Breadcrumb',
  230. },
  231. {
  232. value: 'dropdown',
  233. label: 'Dropdown',
  234. },
  235. {
  236. value: 'steps',
  237. label: 'Steps',
  238. },
  239. ],
  240. },
  241. {
  242. value: 'others',
  243. label: 'Others',
  244. children: [
  245. {
  246. value: 'dialog',
  247. label: 'Dialog',
  248. },
  249. {
  250. value: 'tooltip',
  251. label: 'Tooltip',
  252. },
  253. {
  254. value: 'popover',
  255. label: 'Popover',
  256. },
  257. {
  258. value: 'card',
  259. label: 'Card',
  260. },
  261. {
  262. value: 'carousel',
  263. label: 'Carousel',
  264. },
  265. {
  266. value: 'collapse',
  267. label: 'Collapse',
  268. },
  269. ],
  270. },
  271. ],
  272. },
  273. {
  274. value: 'resource',
  275. label: 'Resource',
  276. children: [
  277. {
  278. value: 'axure',
  279. label: 'Axure Components',
  280. },
  281. {
  282. value: 'sketch',
  283. label: 'Sketch Templates',
  284. },
  285. {
  286. value: 'docs',
  287. label: 'Design Documentation',
  288. },
  289. ],
  290. },
  291. ]
  292. </script>
  293. <style scoped>
  294. .example-block {
  295. margin: 1rem;
  296. }
  297. .example-demonstration {
  298. margin: 1rem;
  299. }
  300. </style>

自定义节点内容

可以自定义备选项的节点内容

你可以通过 scoped slot 自定义节点的内容。 您可以访问 scope 中的 nodedata 属性,分别表示当前节点的 Node 对象和当前节点的数据。

Cascader 级联选择器 - 图9

  1. <template>
  2. <el-cascader :options="options">
  3. <template #default="{ node, data }">
  4. <span>{{ data.label }}</span>
  5. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  6. </template>
  7. </el-cascader>
  8. </template>
  9. <script lang="ts" setup>
  10. const options = [
  11. {
  12. value: 'guide',
  13. label: 'Guide',
  14. children: [
  15. {
  16. value: 'disciplines',
  17. label: 'Disciplines',
  18. children: [
  19. {
  20. value: 'consistency',
  21. label: 'Consistency',
  22. },
  23. {
  24. value: 'feedback',
  25. label: 'Feedback',
  26. },
  27. {
  28. value: 'efficiency',
  29. label: 'Efficiency',
  30. },
  31. {
  32. value: 'controllability',
  33. label: 'Controllability',
  34. },
  35. ],
  36. },
  37. {
  38. value: 'navigation',
  39. label: 'Navigation',
  40. children: [
  41. {
  42. value: 'side nav',
  43. label: 'Side Navigation',
  44. },
  45. {
  46. value: 'top nav',
  47. label: 'Top Navigation',
  48. },
  49. ],
  50. },
  51. ],
  52. },
  53. {
  54. value: 'component',
  55. label: 'Component',
  56. children: [
  57. {
  58. value: 'basic',
  59. label: 'Basic',
  60. children: [
  61. {
  62. value: 'layout',
  63. label: 'Layout',
  64. },
  65. {
  66. value: 'color',
  67. label: 'Color',
  68. },
  69. {
  70. value: 'typography',
  71. label: 'Typography',
  72. },
  73. {
  74. value: 'icon',
  75. label: 'Icon',
  76. },
  77. {
  78. value: 'button',
  79. label: 'Button',
  80. },
  81. ],
  82. },
  83. {
  84. value: 'form',
  85. label: 'Form',
  86. children: [
  87. {
  88. value: 'radio',
  89. label: 'Radio',
  90. },
  91. {
  92. value: 'checkbox',
  93. label: 'Checkbox',
  94. },
  95. {
  96. value: 'input',
  97. label: 'Input',
  98. },
  99. {
  100. value: 'input-number',
  101. label: 'InputNumber',
  102. },
  103. {
  104. value: 'select',
  105. label: 'Select',
  106. },
  107. {
  108. value: 'cascader',
  109. label: 'Cascader',
  110. },
  111. {
  112. value: 'switch',
  113. label: 'Switch',
  114. },
  115. {
  116. value: 'slider',
  117. label: 'Slider',
  118. },
  119. {
  120. value: 'time-picker',
  121. label: 'TimePicker',
  122. },
  123. {
  124. value: 'date-picker',
  125. label: 'DatePicker',
  126. },
  127. {
  128. value: 'datetime-picker',
  129. label: 'DateTimePicker',
  130. },
  131. {
  132. value: 'upload',
  133. label: 'Upload',
  134. },
  135. {
  136. value: 'rate',
  137. label: 'Rate',
  138. },
  139. {
  140. value: 'form',
  141. label: 'Form',
  142. },
  143. ],
  144. },
  145. {
  146. value: 'data',
  147. label: 'Data',
  148. children: [
  149. {
  150. value: 'table',
  151. label: 'Table',
  152. },
  153. {
  154. value: 'tag',
  155. label: 'Tag',
  156. },
  157. {
  158. value: 'progress',
  159. label: 'Progress',
  160. },
  161. {
  162. value: 'tree',
  163. label: 'Tree',
  164. },
  165. {
  166. value: 'pagination',
  167. label: 'Pagination',
  168. },
  169. {
  170. value: 'badge',
  171. label: 'Badge',
  172. },
  173. ],
  174. },
  175. {
  176. value: 'notice',
  177. label: 'Notice',
  178. children: [
  179. {
  180. value: 'alert',
  181. label: 'Alert',
  182. },
  183. {
  184. value: 'loading',
  185. label: 'Loading',
  186. },
  187. {
  188. value: 'message',
  189. label: 'Message',
  190. },
  191. {
  192. value: 'message-box',
  193. label: 'MessageBox',
  194. },
  195. {
  196. value: 'notification',
  197. label: 'Notification',
  198. },
  199. ],
  200. },
  201. {
  202. value: 'navigation',
  203. label: 'Navigation',
  204. children: [
  205. {
  206. value: 'menu',
  207. label: 'Menu',
  208. },
  209. {
  210. value: 'tabs',
  211. label: 'Tabs',
  212. },
  213. {
  214. value: 'breadcrumb',
  215. label: 'Breadcrumb',
  216. },
  217. {
  218. value: 'dropdown',
  219. label: 'Dropdown',
  220. },
  221. {
  222. value: 'steps',
  223. label: 'Steps',
  224. },
  225. ],
  226. },
  227. {
  228. value: 'others',
  229. label: 'Others',
  230. children: [
  231. {
  232. value: 'dialog',
  233. label: 'Dialog',
  234. },
  235. {
  236. value: 'tooltip',
  237. label: 'Tooltip',
  238. },
  239. {
  240. value: 'popover',
  241. label: 'Popover',
  242. },
  243. {
  244. value: 'card',
  245. label: 'Card',
  246. },
  247. {
  248. value: 'carousel',
  249. label: 'Carousel',
  250. },
  251. {
  252. value: 'collapse',
  253. label: 'Collapse',
  254. },
  255. ],
  256. },
  257. ],
  258. },
  259. {
  260. value: 'resource',
  261. label: 'Resource',
  262. children: [
  263. {
  264. value: 'axure',
  265. label: 'Axure Components',
  266. },
  267. {
  268. value: 'sketch',
  269. label: 'Sketch Templates',
  270. },
  271. {
  272. value: 'docs',
  273. label: 'Design Documentation',
  274. },
  275. ],
  276. },
  277. ]
  278. </script>

级联面板

级联面板是级联选择器的核心组件,与级联选择器一样,有单选、多选、动态加载等多种功能。

和级联选择器一样,通过options来指定选项,也可通过props来设置多选、动态加载等功能,具体详情见下方API表格。

Cascader 级联选择器 - 图10

  1. <template>
  2. <el-cascader-panel :options="options" />
  3. </template>
  4. <script lang="ts" setup>
  5. const options = [
  6. {
  7. value: 'guide',
  8. label: 'Guide',
  9. children: [
  10. {
  11. value: 'disciplines',
  12. label: 'Disciplines',
  13. children: [
  14. {
  15. value: 'consistency',
  16. label: 'Consistency',
  17. },
  18. {
  19. value: 'feedback',
  20. label: 'Feedback',
  21. },
  22. {
  23. value: 'efficiency',
  24. label: 'Efficiency',
  25. },
  26. {
  27. value: 'controllability',
  28. label: 'Controllability',
  29. },
  30. ],
  31. },
  32. {
  33. value: 'navigation',
  34. label: 'Navigation',
  35. children: [
  36. {
  37. value: 'side nav',
  38. label: 'Side Navigation',
  39. },
  40. {
  41. value: 'top nav',
  42. label: 'Top Navigation',
  43. },
  44. ],
  45. },
  46. ],
  47. },
  48. {
  49. value: 'component',
  50. label: 'Component',
  51. children: [
  52. {
  53. value: 'basic',
  54. label: 'Basic',
  55. children: [
  56. {
  57. value: 'layout',
  58. label: 'Layout',
  59. },
  60. {
  61. value: 'color',
  62. label: 'Color',
  63. },
  64. {
  65. value: 'typography',
  66. label: 'Typography',
  67. },
  68. {
  69. value: 'icon',
  70. label: 'Icon',
  71. },
  72. {
  73. value: 'button',
  74. label: 'Button',
  75. },
  76. ],
  77. },
  78. {
  79. value: 'form',
  80. label: 'Form',
  81. children: [
  82. {
  83. value: 'radio',
  84. label: 'Radio',
  85. },
  86. {
  87. value: 'checkbox',
  88. label: 'Checkbox',
  89. },
  90. {
  91. value: 'input',
  92. label: 'Input',
  93. },
  94. {
  95. value: 'input-number',
  96. label: 'InputNumber',
  97. },
  98. {
  99. value: 'select',
  100. label: 'Select',
  101. },
  102. {
  103. value: 'cascader',
  104. label: 'Cascader',
  105. },
  106. {
  107. value: 'switch',
  108. label: 'Switch',
  109. },
  110. {
  111. value: 'slider',
  112. label: 'Slider',
  113. },
  114. {
  115. value: 'time-picker',
  116. label: 'TimePicker',
  117. },
  118. {
  119. value: 'date-picker',
  120. label: 'DatePicker',
  121. },
  122. {
  123. value: 'datetime-picker',
  124. label: 'DateTimePicker',
  125. },
  126. {
  127. value: 'upload',
  128. label: 'Upload',
  129. },
  130. {
  131. value: 'rate',
  132. label: 'Rate',
  133. },
  134. {
  135. value: 'form',
  136. label: 'Form',
  137. },
  138. ],
  139. },
  140. {
  141. value: 'data',
  142. label: 'Data',
  143. children: [
  144. {
  145. value: 'table',
  146. label: 'Table',
  147. },
  148. {
  149. value: 'tag',
  150. label: 'Tag',
  151. },
  152. {
  153. value: 'progress',
  154. label: 'Progress',
  155. },
  156. {
  157. value: 'tree',
  158. label: 'Tree',
  159. },
  160. {
  161. value: 'pagination',
  162. label: 'Pagination',
  163. },
  164. {
  165. value: 'badge',
  166. label: 'Badge',
  167. },
  168. ],
  169. },
  170. {
  171. value: 'notice',
  172. label: 'Notice',
  173. children: [
  174. {
  175. value: 'alert',
  176. label: 'Alert',
  177. },
  178. {
  179. value: 'loading',
  180. label: 'Loading',
  181. },
  182. {
  183. value: 'message',
  184. label: 'Message',
  185. },
  186. {
  187. value: 'message-box',
  188. label: 'MessageBox',
  189. },
  190. {
  191. value: 'notification',
  192. label: 'Notification',
  193. },
  194. ],
  195. },
  196. {
  197. value: 'navigation',
  198. label: 'Navigation',
  199. children: [
  200. {
  201. value: 'menu',
  202. label: 'Menu',
  203. },
  204. {
  205. value: 'tabs',
  206. label: 'Tabs',
  207. },
  208. {
  209. value: 'breadcrumb',
  210. label: 'Breadcrumb',
  211. },
  212. {
  213. value: 'dropdown',
  214. label: 'Dropdown',
  215. },
  216. {
  217. value: 'steps',
  218. label: 'Steps',
  219. },
  220. ],
  221. },
  222. {
  223. value: 'others',
  224. label: 'Others',
  225. children: [
  226. {
  227. value: 'dialog',
  228. label: 'Dialog',
  229. },
  230. {
  231. value: 'tooltip',
  232. label: 'Tooltip',
  233. },
  234. {
  235. value: 'popover',
  236. label: 'Popover',
  237. },
  238. {
  239. value: 'card',
  240. label: 'Card',
  241. },
  242. {
  243. value: 'carousel',
  244. label: 'Carousel',
  245. },
  246. {
  247. value: 'collapse',
  248. label: 'Collapse',
  249. },
  250. ],
  251. },
  252. ],
  253. },
  254. {
  255. value: 'resource',
  256. label: 'Resource',
  257. children: [
  258. {
  259. value: 'axure',
  260. label: 'Axure Components',
  261. },
  262. {
  263. value: 'sketch',
  264. label: 'Sketch Templates',
  265. },
  266. {
  267. value: 'docs',
  268. label: 'Design Documentation',
  269. },
  270. ],
  271. },
  272. ]
  273. </script>

Cascader 属性

属性说明类型可选值默认值
model-value / v-model选中项绑定值-
options可选项数据源,键名可通过 Props 属性配置array
props配置选项,具体见下表object
size尺寸stringlarge / default / small
placeholder输入框占位文本stringSelect
disabled是否禁用booleanfalse
clearable是否支持清空选项booleanfalse
show-all-levels输入框中是否显示选中值的完整路径booleantrue
collapse-tags多选模式下是否折叠Tagboolean-false
collapse-tags-tooltip当鼠标悬停于折叠标签的文本时,是否显示所有选中的标签。 要使用此属性,collapse-tags属性必须设定为 trueboolean-false
separator用于分隔选项的字符string‘ / ‘
filterable该选项是否可以被搜索boolean
filter-method自定义搜索逻辑,第一个参数是node,第二个参数是keyword,返回的布尔值表示是否保留该选项function(node, keyword)--
debounce搜索关键词正在输入时的去抖延迟,单位为毫秒number300
before-filter过滤函数调用前欲被调用的钩子函数,该函数接受一个参数。 如果该函数的返回值是 false 或者是一个被拒绝的 Promise,那么接下来的过滤逻辑便不会执行。function(value)
popper-class弹出内容的自定义类名string
teleported弹层是否使用 teleportbooleantrue / falsetrue
popper-append-to-body(弃用)是否将弹出的内容直接插入到 body 元素。 在弹出内容的边框定位出现问题时,可将该属性设置为 falseboolean-true
tag-type标签类型stringsuccess/info/warning/dangerinfo
validate-event输入时是否触发表单的校验boolean-true

Cascader 事件

事件名说明回调参数
change当绑定值变化时触发的事件value
expand-change当展开节点发生变化时触发各父级选项值组成的数组
blur当失去焦点时触发(event: Event)
focus当获得焦点时触发(event: Event)
visible-change下拉框出现/隐藏时触发出现则为 true,隐藏则为 false
remove-tag在多选模式下,移除Tag时触发移除的Tag对应的节点的值

Cascader 方法

方法名说明参数
getCheckedNodes获取选中的节点(leafOnly) 是否只是叶子节点,默认值为 false

Cascader 插槽

插槽名说明
-自定义备选项的节点内容,参数为 { node, data },分别为当前节点的 Node 对象和数据
empty无匹配选项时的内容

CascaderPanel 属性

属性说明类型可选值默认值
model-value / v-model选中项绑定值-
options可选项数据源,键名可通过 Props 属性配置array
props配置选项,具体见下表object

CascaderPanel 事件

事件名称说明回调参数
change当选中节点变化时触发value
expand-change当展开节点发生变化时触发各父级选项值组成的数组

CascaderPanel 方法

方法名说明参数
getCheckedNodes获取选中的节点数组(leafOnly) 是否只是叶子节点,默认值为 false
clearCheckedNodes清空选中的节点-

CascaderPanel 插槽

插槽名说明
-自定义备选项的节点内容,参数为 { node, data },分别为当前节点的 Node 对象和数据

Props

属性说明类型可选值默认值
expandTrigger次级菜单的展开方式stringclick / hover‘click’
multiple是否多选boolean-false
checkStrictly是否严格的遵守父子节点不互相关联boolean-false
emitPath在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false,则只返回该节点的值boolean-true
lazy是否动态加载子节点,需与 lazyLoad 方法结合使用boolean-false
lazyLoad加载动态数据的方法,仅在 lazy 为 true 时有效function(node, resolve),node为当前点击的节点,resolve为数据加载完成的回调(必须调用)--
value指定选项的值为选项对象的某个属性值string‘value’
label指定选项标签为选项对象的某个属性值string‘label’
children指定选项的子选项为选项对象的某个属性值string‘children’
disabled指定选项的禁用为选项对象的某个属性值string‘disabled’
leaf指定选项的叶子节点的标志位为选项对象的某个属性值string‘leaf’

源代码

组件 Cascader 级联选择器 - 图11 文档 Cascader 级联选择器 - 图12

贡献者

Cascader 级联选择器 - 图13 三咲智子

Cascader 级联选择器 - 图14 云游君

Cascader 级联选择器 - 图15 JeremyWuuuuu

Cascader 级联选择器 - 图16 btea

Cascader 级联选择器 - 图17 Alan Wang

Cascader 级联选择器 - 图18 C.Y.Kun

Cascader 级联选择器 - 图19 啝裳

Cascader 级联选择器 - 图20 Simona

Cascader 级联选择器 - 图21 류한경

Cascader 级联选择器 - 图22 gjfei

Cascader 级联选择器 - 图23 Delyan Haralanov

Cascader 级联选择器 - 图24 msidolphin

Cascader 级联选择器 - 图25 sechi

Cascader 级联选择器 - 图26 zz

Cascader 级联选择器 - 图27 Xc

Cascader 级联选择器 - 图28 Hefty

Cascader 级联选择器 - 图29 Carter Li

Cascader 级联选择器 - 图30 opengraphica

Cascader 级联选择器 - 图31 张奎安

Cascader 级联选择器 - 图32 Herrington Darkholme

Cascader 级联选择器 - 图33 SongWuKong

Cascader 级联选择器 - 图34 renovate[bot]

Cascader 级联选择器 - 图35 Aex

Cascader 级联选择器 - 图36 bchen1029

Cascader 级联选择器 - 图37 Zhongxiang Wang

Cascader 级联选择器 - 图38 Yuyao Nie

Cascader 级联选择器 - 图39 on the field of hope

Cascader 级联选择器 - 图40 Hades-li