• Cascader 级联选择
    • 概述
    • 代码示例
    • API
      • Cascader props
      • Cascader events

    Cascader 级联选择

    概述

    从一组相关联的数据集合中进行选择,常用于省市区、公司级层、事务分类等。

    相比 Select 组件,可以一次性完成选择,体验更好。

    代码示例

    Cascader 级联选择 - 图1

    基础用法

    级联选择对数据有较严格要求,请参照示例的格式使用data,每项数据至少包含 valuelabel 两项,子集为 children,以此类推。

    value 为当前选择的数据的 value 值的数组,比如 ['beijing', 'gugong'] ,按照级联顺序依次排序,使用 v-model 进行双向绑定。

    1. <template>
    2. <Cascader :data="data" v-model="value1"></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. value1: [],
    9. data: [{
    10. value: 'beijing',
    11. label: '北京',
    12. children: [
    13. {
    14. value: 'gugong',
    15. label: '故宫'
    16. },
    17. {
    18. value: 'tiantan',
    19. label: '天坛'
    20. },
    21. {
    22. value: 'wangfujing',
    23. label: '王府井'
    24. }
    25. ]
    26. }, {
    27. value: 'jiangsu',
    28. label: '江苏',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: '南京',
    33. children: [
    34. {
    35. value: 'fuzimiao',
    36. label: '夫子庙',
    37. }
    38. ]
    39. },
    40. {
    41. value: 'suzhou',
    42. label: '苏州',
    43. children: [
    44. {
    45. value: 'zhuozhengyuan',
    46. label: '拙政园',
    47. },
    48. {
    49. value: 'shizilin',
    50. label: '狮子林',
    51. }
    52. ]
    53. }
    54. ],
    55. }]
    56. }
    57. }
    58. }
    59. </script>

    Cascader 级联选择 - 图2

    默认值

    指定 value 默认值,组件会在初始化时选定数据。

    1. <template>
    2. <Cascader :data="data" v-model="value2"></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. value2: ['jiangsu', 'suzhou', 'zhuozhengyuan'],
    9. data: [{
    10. value: 'beijing',
    11. label: '北京',
    12. children: [
    13. {
    14. value: 'gugong',
    15. label: '故宫'
    16. },
    17. {
    18. value: 'tiantan',
    19. label: '天坛'
    20. },
    21. {
    22. value: 'wangfujing',
    23. label: '王府井'
    24. }
    25. ]
    26. }, {
    27. value: 'jiangsu',
    28. label: '江苏',
    29. children: [
    30. {
    31. value: 'nanjing',
    32. label: '南京',
    33. children: [
    34. {
    35. value: 'fuzimiao',
    36. label: '夫子庙',
    37. }
    38. ]
    39. },
    40. {
    41. value: 'suzhou',
    42. label: '苏州',
    43. children: [
    44. {
    45. value: 'zhuozhengyuan',
    46. label: '拙政园',
    47. },
    48. {
    49. value: 'shizilin',
    50. label: '狮子林',
    51. }
    52. ]
    53. }
    54. ],
    55. }]
    56. }
    57. }
    58. }
    59. </script>

    Cascader 级联选择 - 图3

    移入展开

    设置属性 triggerhover,当鼠标悬停时就会展开子集。

    1. <template>
    2. <Cascader :data="data" trigger="hover"></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. data: [{
    9. value: 'beijing',
    10. label: '北京',
    11. children: [
    12. {
    13. value: 'gugong',
    14. label: '故宫'
    15. },
    16. {
    17. value: 'tiantan',
    18. label: '天坛'
    19. },
    20. {
    21. value: 'wangfujing',
    22. label: '王府井'
    23. }
    24. ]
    25. }, {
    26. value: 'jiangsu',
    27. label: '江苏',
    28. children: [
    29. {
    30. value: 'nanjing',
    31. label: '南京',
    32. children: [
    33. {
    34. value: 'fuzimiao',
    35. label: '夫子庙',
    36. }
    37. ]
    38. },
    39. {
    40. value: 'suzhou',
    41. label: '苏州',
    42. children: [
    43. {
    44. value: 'zhuozhengyuan',
    45. label: '拙政园',
    46. },
    47. {
    48. value: 'shizilin',
    49. label: '狮子林',
    50. }
    51. ]
    52. }
    53. ],
    54. }]
    55. }
    56. }
    57. }
    58. </script>

    Cascader 级联选择 - 图4

    自定义显示

    通过设置 slot 可以自定义显示内容,不局限于输入框。

    1. <template>
    2. {{ text }}
    3. <Cascader :data="data" @on-change="handleChange">
    4. <a href="javascript:void(0)">选择</a>
    5. </Cascader>
    6. </template>
    7. <script>
    8. export default {
    9. data () {
    10. return {
    11. text: '未选择',
    12. data: [{
    13. value: 'beijing',
    14. label: '北京',
    15. children: [
    16. {
    17. value: 'gugong',
    18. label: '故宫'
    19. },
    20. {
    21. value: 'tiantan',
    22. label: '天坛'
    23. },
    24. {
    25. value: 'wangfujing',
    26. label: '王府井'
    27. }
    28. ]
    29. }, {
    30. value: 'jiangsu',
    31. label: '江苏',
    32. children: [
    33. {
    34. value: 'nanjing',
    35. label: '南京',
    36. children: [
    37. {
    38. value: 'fuzimiao',
    39. label: '夫子庙',
    40. }
    41. ]
    42. },
    43. {
    44. value: 'suzhou',
    45. label: '苏州',
    46. children: [
    47. {
    48. value: 'zhuozhengyuan',
    49. label: '拙政园',
    50. },
    51. {
    52. value: 'shizilin',
    53. label: '狮子林',
    54. }
    55. ]
    56. }
    57. ],
    58. }]
    59. }
    60. },
    61. methods: {
    62. handleChange (value, selectedData) {
    63. this.text = selectedData.map(o => o.label).join(', ');
    64. }
    65. }
    66. }
    67. </script>

    Cascader 级联选择 - 图5

    禁用

    设置属性 disabled 可以禁用组件。

    给某项数据设置 disabled: true 可以禁用某一项。

    1. <template>
    2. <Cascader :data="data2" disabled></Cascader>
    3. <Cascader :data="data2"></Cascader>
    4. </template>
    5. <script>
    6. export default {
    7. data () {
    8. return {
    9. data2: [{
    10. value: 'zhejiang',
    11. label: '浙江',
    12. children: [{
    13. value: 'hangzhou',
    14. label: '杭州',
    15. children: [{
    16. value: 'xihu',
    17. label: '西湖'
    18. }]
    19. }]
    20. }, {
    21. value: 'jiangsu',
    22. label: '江苏',
    23. disabled: true,
    24. children: [{
    25. value: 'nanjing',
    26. label: '南京',
    27. children: [{
    28. value: 'zhonghuamen',
    29. label: '中华门'
    30. }]
    31. }]
    32. }]
    33. }
    34. }
    35. }
    36. </script>

    Cascader 级联选择 - 图6

    选择即改变

    设置属性 change-on-select 点任何一级都可以选择。

    1. <template>
    2. <Cascader :data="data" change-on-select></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. data: [{
    9. value: 'beijing',
    10. label: '北京',
    11. children: [
    12. {
    13. value: 'gugong',
    14. label: '故宫'
    15. },
    16. {
    17. value: 'tiantan',
    18. label: '天坛'
    19. },
    20. {
    21. value: 'wangfujing',
    22. label: '王府井'
    23. }
    24. ]
    25. }, {
    26. value: 'jiangsu',
    27. label: '江苏',
    28. children: [
    29. {
    30. value: 'nanjing',
    31. label: '南京',
    32. children: [
    33. {
    34. value: 'fuzimiao',
    35. label: '夫子庙',
    36. }
    37. ]
    38. },
    39. {
    40. value: 'suzhou',
    41. label: '苏州',
    42. children: [
    43. {
    44. value: 'zhuozhengyuan',
    45. label: '拙政园',
    46. },
    47. {
    48. value: 'shizilin',
    49. label: '狮子林',
    50. }
    51. ]
    52. }
    53. ],
    54. }]
    55. }
    56. }
    57. }
    58. </script>

    Cascader 级联选择 - 图7

    自定义已选项

    对于显示的结果,可以通过 render-format 接收一个函数来自定义。

    其中第一个参数 labels 是当前选择的label的集合,第二个参数 selectedData 是当前选择的数据集合,可以利用它们组合出你想要显示的内容。

    1. <template>
    2. <Cascader :data="data3" :render-format="format"></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. data3: [{
    9. value: 'zhejiang',
    10. label: '浙江',
    11. children: [{
    12. value: 'hangzhou',
    13. label: '杭州',
    14. children: [{
    15. value: 'xihu',
    16. label: '西湖',
    17. code: 310000
    18. }]
    19. }]
    20. }, {
    21. value: 'jiangsu',
    22. label: '江苏',
    23. children: [{
    24. value: 'nanjing',
    25. label: '南京',
    26. children: [{
    27. value: 'zhonghuamen',
    28. label: '中华门',
    29. code: 210000
    30. }]
    31. }]
    32. }]
    33. }
    34. },
    35. methods: {
    36. format (labels, selectedData) {
    37. const index = labels.length - 1;
    38. const data = selectedData[index] || false;
    39. if (data && data.code) {
    40. return labels[index] + ' - ' + data.code;
    41. }
    42. return labels[index];
    43. }
    44. }
    45. }
    46. </script>

    Cascader 级联选择 - 图8

    尺寸

    通过设置size属性为largesmall将输入框设置为大和小尺寸,不设置为默认(中)尺寸。

    1. <template>
    2. <Cascader :data="data" size="large"></Cascader>
    3. <br>
    4. <Cascader :data="data"></Cascader>
    5. <br>
    6. <Cascader :data="data" size="small"></Cascader>
    7. </template>
    8. <script>
    9. export default {
    10. data () {
    11. return {
    12. data: [{
    13. value: 'beijing',
    14. label: '北京',
    15. children: [
    16. {
    17. value: 'gugong',
    18. label: '故宫'
    19. },
    20. {
    21. value: 'tiantan',
    22. label: '天坛'
    23. },
    24. {
    25. value: 'wangfujing',
    26. label: '王府井'
    27. }
    28. ]
    29. }, {
    30. value: 'jiangsu',
    31. label: '江苏',
    32. children: [
    33. {
    34. value: 'nanjing',
    35. label: '南京',
    36. children: [
    37. {
    38. value: 'fuzimiao',
    39. label: '夫子庙',
    40. }
    41. ]
    42. },
    43. {
    44. value: 'suzhou',
    45. label: '苏州',
    46. children: [
    47. {
    48. value: 'zhuozhengyuan',
    49. label: '拙政园',
    50. },
    51. {
    52. value: 'shizilin',
    53. label: '狮子林',
    54. }
    55. ]
    56. }
    57. ],
    58. }]
    59. }
    60. }
    61. }
    62. </script>

    Cascader 级联选择 - 图9

    动态加载选项

    使用 load-data 属性可以异步加载子选项,需要给数据增加 loading 来标识当前是否在加载中。

    load-data 的第二个参数为回调,如果执行,则会自动展开当前项的子列表。

    1. <template>
    2. <Cascader :data="data4" :load-data="loadData"></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. data4: [
    9. {
    10. value: 'beijing',
    11. label: '北京',
    12. children: [],
    13. loading: false
    14. },
    15. {
    16. value: 'hangzhou',
    17. label: '杭州',
    18. children: [],
    19. loading:false
    20. }
    21. ]
    22. }
    23. },
    24. methods: {
    25. loadData (item, callback) {
    26. item.loading = true;
    27. setTimeout(() => {
    28. if (item.value === 'beijing') {
    29. item.children = [
    30. {
    31. value: 'talkingdata',
    32. label: 'TalkingData'
    33. },
    34. {
    35. value: 'baidu',
    36. label: '百度'
    37. },
    38. {
    39. value: 'sina',
    40. label: '新浪'
    41. }
    42. ];
    43. } else if (item.value === 'hangzhou') {
    44. item.children = [
    45. {
    46. value: 'ali',
    47. label: '阿里巴巴'
    48. },
    49. {
    50. value: '163',
    51. label: '网易'
    52. }
    53. ];
    54. }
    55. item.loading = false;
    56. callback();
    57. }, 1000);
    58. }
    59. }
    60. }
    61. </script>

    Cascader 级联选择 - 图10

    搜索

    使用属性 filterable 可直接搜索选项并选择。

    暂不支持服务端搜索。

    1. <template>
    2. <Cascader v-model="value3" :data="data" filterable></Cascader>
    3. </template>
    4. <script>
    5. export default {
    6. data () {
    7. return {
    8. data: [{
    9. value: 'beijing',
    10. label: '北京',
    11. children: [
    12. {
    13. value: 'gugong',
    14. label: '故宫'
    15. },
    16. {
    17. value: 'tiantan',
    18. label: '天坛'
    19. },
    20. {
    21. value: 'wangfujing',
    22. label: '王府井'
    23. }
    24. ]
    25. }, {
    26. value: 'jiangsu',
    27. label: '江苏',
    28. children: [
    29. {
    30. value: 'nanjing',
    31. label: '南京',
    32. children: [
    33. {
    34. value: 'fuzimiao',
    35. label: '夫子庙',
    36. }
    37. ]
    38. },
    39. {
    40. value: 'suzhou',
    41. label: '苏州',
    42. children: [
    43. {
    44. value: 'zhuozhengyuan',
    45. label: '拙政园',
    46. },
    47. {
    48. value: 'shizilin',
    49. label: '狮子林',
    50. }
    51. ]
    52. }
    53. ],
    54. }],
    55. value3: []
    56. }
    57. }
    58. }
    59. </script>

    API

    Cascader props

    属性说明类型默认值
    data可选项的数据源,格式参照示例说明Array[]
    value当前已选项的数据,格式参照示例说明Array[]
    render-format选择后展示的函数,用于自定义显示格式Functionlabel => label.join(' / ')
    disabled是否禁用选择器Booleanfalse
    clearable是否支持清除Booleantrue
    placeholder输入框占位符String请选择
    trigger次级菜单展开方式,可选值为 clickhoverStringclick
    change-on-select当此项为 true 时,点选每级菜单选项值都会发生变化,具体见上面的示例Booleanfalse
    size输入框大小,可选值为largesmall或者不填String-
    load-data动态获取数据,数据源需标识 loadingFunction-
    filterable是否支持搜索Booleanfalse
    not-found-text当搜索列表为空时显示的内容String无匹配数据
    transfer是否将弹层放置于 body 内,在 Tabs、带有 fixed 的 Table 列内使用时,建议添加此属性,它将不受父级样式影响,从而达到更好的效果Booleanfalse
    element-id给表单元素设置 id,详见 Form 用法。String-

    Cascader events

    事件名说明返回值
    on-change选择完成后的回调,返回值 value 即已选值 value,selectedData 为已选项的具体数据value, selectedData
    on-visible-change展开和关闭弹窗时触发显示状态,Boolean