Cascader 级联选择

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

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

    基础用法

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

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

    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. }
    37. ]
    38. },
    39. {
    40. value: 'suzhou',
    41. children: [
    42. {
    43. value: 'zhuozhengyuan',
    44. label: '拙政园',
    45. },
    46. {
    47. value: 'shizilin',
    48. label: '狮子林',
    49. }
    50. ]
    51. }
    52. ],
    53. }]
    54. }
    55. }
    56. }
    57. </script>

    移入展开

    设置属性 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. },
    19. {
    20. value: 'wangfujing',
    21. label: '王府井'
    22. }
    23. ]
    24. }, {
    25. value: 'jiangsu',
    26. label: '江苏',
    27. children: [
    28. {
    29. label: '南京',
    30. children: [
    31. {
    32. value: 'fuzimiao',
    33. label: '夫子庙',
    34. }
    35. ]
    36. },
    37. {
    38. value: 'suzhou',
    39. label: '苏州',
    40. children: [
    41. {
    42. value: 'zhuozhengyuan',
    43. label: '拙政园',
    44. },
    45. {
    46. value: 'shizilin',
    47. label: '狮子林',
    48. }
    49. ]
    50. }
    51. ],
    52. }]
    53. }
    54. }
    55. }
    56. </script>

    自定义显示

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

    Cascader 级联选择 - 图5

    禁用

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

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

    <template>
        <Cascader :data="data2" disabled></Cascader>
        <Cascader :data="data2"></Cascader>
    </template>
    <script>
        export default {
            data () {
                return {
                    data2: [{
                        value: 'zhejiang',
                        label: '浙江',
                        children: [{
                            value: 'hangzhou',
                            label: '杭州',
                            children: [{
                                value: 'xihu',
                                label: '西湖'
                            }]
                        }]
                    }, {
                        value: 'jiangsu',
                        label: '江苏',
                        disabled: true,
                        children: [{
                            value: 'nanjing',
                            label: '南京',
                            children: [{
                                value: 'zhonghuamen',
                                label: '中华门'
                            }]
                        }]
                    }]
                }
            }
        }
    </script>
    

    选择即改变

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

    <template>
        <Cascader :data="data" change-on-select></Cascader>
    </template>
    <script>
        export default {
            data () {
                return {
                    data: [{
                        value: 'beijing',
                        label: '北京',
                        children: [
                            {
                                value: 'gugong',
                                label: '故宫'
                            },
                            {
                                value: 'tiantan',
                                label: '天坛'
                            },
                            {
                                value: 'wangfujing',
                                label: '王府井'
                            }
                        ]
                    }, {
                        value: 'jiangsu',
                        label: '江苏',
                        children: [
                            {
                                value: 'nanjing',
                                label: '南京',
                                children: [
                                    {
                                        value: 'fuzimiao',
                                        label: '夫子庙',
                                    }
                                ]
                            },
                            {
                                value: 'suzhou',
                                label: '苏州',
                                children: [
                                    {
                                        value: 'zhuozhengyuan',
                                        label: '拙政园',
                                    },
                                    {
                                        value: 'shizilin',
                                        label: '狮子林',
                                    }
                                ]
                            }
                        ],
                    }]
                }
            }
        }
    </script>
    

    Cascader 级联选择 - 图7

    自定义已选项

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

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

    尺寸

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

    <template>
        <Cascader :data="data" size="large"></Cascader>
        <br>
        <Cascader :data="data"></Cascader>
        <br>
        <Cascader :data="data" size="small"></Cascader>
    </template>
    <script>
        export default {
            data () {
                return {
                    data: [{
                        value: 'beijing',
                        label: '北京',
                        children: [
                            {
                                value: 'gugong',
                                label: '故宫'
                            },
                            {
                                value: 'tiantan',
                                label: '天坛'
                            },
                            {
                                value: 'wangfujing',
                                label: '王府井'
                            }
                        ]
                    }, {
                        value: 'jiangsu',
                        label: '江苏',
                        children: [
                            {
                                value: 'nanjing',
                                label: '南京',
                                children: [
                                    {
                                        value: 'fuzimiao',
                                        label: '夫子庙',
                                    }
                                ]
                            },
                            {
                                value: 'suzhou',
                                label: '苏州',
                                children: [
                                    {
                                        value: 'zhuozhengyuan',
                                        label: '拙政园',
                                    },
                                    {
                                        value: 'shizilin',
                                        label: '狮子林',
                                    }
                                ]
                            }
                        ],
                    }]
                }
            }
        }
    </script>
    

    动态加载选项

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

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

    <template>
        <Cascader :data="data4" :load-data="loadData"></Cascader>
    </template>
    <script>
        export default {
            data () {
                return {
                    data4: [
                        {
                            value: 'beijing',
                            label: '北京',
                            children: [],
                            loading: false
                        },
                        {
                            value: 'hangzhou',
                            label: '杭州',
                            children: [],
                            loading:false
                        }
                    ]
                }
            },
            methods: {
                loadData (item, callback) {
                    item.loading = true;
                    setTimeout(() => {
                        if (item.value === 'beijing') {
                            item.children = [
                                {
                                    value: 'talkingdata',
                                    label: 'TalkingData'
                                },
                                {
                                    value: 'baidu',
                                    label: '百度'
                                },
                                {
                                    value: 'sina',
                                    label: '新浪'
                                }
                            ];
                        } else if (item.value === 'hangzhou') {
                            item.children = [
                                {
                                    value: 'ali',
                                    label: '阿里巴巴'
                                },
                                {
                                    value: '163',
                                    label: '网易'
                                }
                            ];
                        }
                        item.loading = false;
                        callback();
                    }, 1000);
                }
            }
        }
    </script>
    

    Cascader 级联选择 - 图10

    搜索

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

    暂不支持服务端搜索。

    Cascader events

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