# Cascader 级联选择
级联选择器适用于有清晰层级结构的数据集合,用户可以通过逐级查看并选择。
组件实现参考了 TDesign (opens new window)。
# 引入
import PressCascader from 'press-ui/press-cascader/press-cascader';
export default {
components: {
PressCascader,
}
}
# 代码演示
# 基础用法
级联选择组件可以搭配 Field 和 PopupPlus 组件使用,示例如下:
<press-field
:value="fieldValue"
is-link
readonly
label="地区"
placeholder="请选择所在地区"
@click="onClick"
/>
<press-popup-plus :show="show" round position="bottom">
<press-cascader
v-if="show"
:value="cascaderValue"
title="请选择所在地区"
:options="options"
@close="onClose"
@finish="onFinish"
/>
</press-popup-plus>
const options = [
{
text: '浙江省',
value: '330000',
children: [{ text: '杭州市', value: '330100' }],
},
{
text: '江苏省',
value: '320000',
children: [{ text: '南京市', value: '320100' }],
},
];
export default {
data() {
return {
show: false,
options,
fieldValue: '',
cascaderValue: '',
}
},
methods: {
onClick() {
this.show = true;
},
onClose() {
this.show = false;
},
onFinish(detail) {
const { selectedOptions, value } = detail;
const fieldValue = selectedOptions
.map((option) => option.text || option.name)
.join('/');
this.fieldValue = fieldValue;
this.cascaderValue = value;
}
},
};
# 中国省市区数据
Cascader 组件常用于选择省市区,Press UI 提供了一份中国省市区数据,可以参照下面方法使用。
<press-popup-plus :show="show" round position="bottom">
<press-cascader
v-if="show"
:value="cascaderValue"
title="请选择所在地区"
:options="chinaArea"
@close="onClose"
@finish="onFinish"
/>
</press-popup-plus>
import { fetchCascaderAreaData } from 'press-ui/press-cascader/helper';
export default {
data() {
return {
chinaArea: [],
}
},
mounted() {
this.getChinaArea();
},
methods: {
getChinaArea() {
fetchCascaderAreaData().then((res) => {
this.chinaArea = res;
});
},
}
}
# 自定义颜色
通过 active-color
属性来设置选中状态的高亮颜色。
<press-cascader
:value="cascaderValue"
title="请选择所在地区"
:options="options"
active-color="#ee0a24"
@close="onClose"
@finish="onFinish"
/>
# 异步加载选项
可以监听 change
事件并动态设置 options
,实现异步加载选项。
<press-popup-plus :show="show" round position="bottom">
<press-cascader
v-if="show"
:value="cascaderValue"
title="请选择所在地区"
:options="options"
@close="onClose"
@change="onChange"
@finish="onFinish"
/>
</press-popup-plus>
export default {
data() {
return {
options: [
{
text: '浙江省',
value: '330000',
children: [],
}
];
}
},
methods: {
onChange(detail) {
const { value } = detail;
if (value === this.options[0].value) {
setTimeout(() => {
const children = [
{ text: '杭州市', value: '330100' },
{ text: '宁波市', value: '330200' },
];
this.options[0].children = children;
}, 500);
}
}
},
};
# 自定义字段名
通过 field-names
属性可以自定义 options
里的字段名称。
<press-cascader
:value="code"
title="请选择所在地区"
:options="options"
:field-names="fieldNames"
/>
export default {
data() {
return {
code: '',
fieldNames: {
text: 'name',
value: 'code',
children: 'items',
},
options: [
{
name: '浙江省',
code: '330000',
items: [{ name: '杭州市', code: '330100' }],
},
{
name: '江苏省',
code: '320000',
items: [{ name: '南京市', code: '320100' }],
},
],
}
},
};
# API
# Props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 顶部标题 | string | - |
value | 选中项的值 | string | number | - |
options | 可选项数据源 | CascaderOption[] | - |
placeholder | 未选中时的提示文案 | string | 请选择 |
active-color | 选中状态的高亮颜色 | string | #1989fa |
swipeable | 是否开启手势左右滑动切换 | boolean | false |
closeable | 是否显示关闭图标 | boolean | true |
ellipsis | 是否省略过长的标题文字, 关闭后文字过长会出现横向滚动 | boolean | true |
show-header | 是否展示标题栏 | boolean | true |
close-icon | 关闭图标名称或图片链接,等同于 Icon 组件的 name 属性 | string | cross |
field-names | 自定义 options 结构中的字段 | CascaderFieldNames | { text: 'text', value: 'value', children: 'children' } |
use-title-slot | 是否使用自定义标题的插槽 | boolean | false |
# CascaderOption 数据结构
options
属性是一个由对象构成的数组,数组中的每个对象配置一个可选项,对象可以包含以下值:
键名 | 说明 | 类型 |
---|---|---|
text | 选项文字(必填) | string |
value | 选项对应的值(必填) | string | number |
color | 选项文字颜色 | string |
children | 子选项列表 | CascaderOption[] |
disabled | 是否禁用选项 | boolean |
className | 为对应列添加额外的 class | string | Array | object |
# Events
事件 | 说明 | 回调参数 |
---|---|---|
change | 选中项变化时触发 | event.detail:{ value: string | number, selectedOptions: CascaderOption[], tabIndex: number } |
finish | 全部选项选择完成后触发 | event.detail:{ value: string | number, selectedOptions: CascaderOption[], tabIndex: number } |
close | 点击关闭图标时触发 | - |
click-tab | 点击标签时触发 | event.detail:{ tabIndex: number, title: string } |
# Slots
名称 | 说明 | 参数 |
---|---|---|
title | 自定义顶部标题 | - |