sard-uniapp
Version:
sard-uniapp 是一套基于 Uniapp + Vue3 框架开发的兼容多端的 UI 组件库
196 lines (135 loc) • 8.02 kB
Markdown
nav: 组件
title: Cascader
subtitle: 级联选择
group: 表单组件
## 介绍
用于在多层级数据中进行选择,常用于省市区、组织架构选择。
## 引入
```ts
import Cascader from 'sard-uniapp/components/cascader/cascader.vue'
```
## 代码演示
### 基础使用
通过 `v-model` 绑定当前值,通过 `options` 配置选项数据。
@code('${DEMO_PATH}/cascader/demo/Basic.vue')
### 选择即改变
设置 `change-on-select` 属性,允许只选中父级选项。
@code('${DEMO_PATH}/cascader/demo/ChangeOnSelect.vue')
### 异步加载(已废弃,建议使用“懒加载”)
通过监听 `@select` 事件,获取当前选中的选项,将异步获取的数据作为 `children` 属性值, 再把组件的 `options` 更新一下,使组件重新渲染。如果选项的 `children` 是需要用户点击时再通过接口获取的, 此选项的 `children` 需初始化为**空数组**。
@code('${DEMO_PATH}/cascader/demo/Async.vue')
### 懒加载 <sup>1.25.5+</sup>
设置 `lazy` 属性标识为懒加载,设置 `load` 属性用于获取数据,会在点击节点时调用,当获取的数据为空时,会将点击的节点标识为叶子节点。当然,你也可以提前设置节点是否为叶子节点,以避免为叶子节点时还要请求一次接口。
首次加载失败可点击提示重新加载,“无数据”状态也可点击重新加载;点击节点加载失败回退到 `idle` 状态,可再次点击进行加载。
@code('${DEMO_PATH}/cascader/demo/Lazy.vue')
### 自定义面板上方内容
使用 `top` 插槽可以在面板顶部展示当前面板的一些信息。
@code('${DEMO_PATH}/cascader/demo/OptionTop.vue')
### 禁选选项
禁用的选项不可点击。
@code('${DEMO_PATH}/cascader/demo/Disabled.vue')
### 绑定所有级别的值 <sup>1.23+</sup>
如果要绑定所有级别的值,即绑定数组值,而不单单是最后一级,可以使用 `all-levels` 属性。
@code('${DEMO_PATH}/cascader/demo/AllLevels.vue')
### 多选 <sup>1.25.5+</sup>
设置 `multiple` 属性可在每个选项前面显示复选框,点击复选框可选择多个;如果是最后一级,点击选项也可以选中复选框。
@code('${DEMO_PATH}/cascader/demo/Multiple.vue')
### 多选-绑定所有级别的值 <sup>1.25.5+</sup>
`all-levels` 属性也可以作用于多选,当设置此属性,绑定的值会是一个二维数组。
@code('${DEMO_PATH}/cascader/demo/MultipleAllLevels.vue')
### 多选-选择任意级别 <sup>1.25.5+</sup>
在单选模式下,你只能选择叶子节点;而在多选模式下,勾选父节点真正选中的都是叶子节点。 启用该功能后,可让父子节点取消关联,选择任意一级选项。
可通过设置 `check-strictly` 来取消父子节点选中关联,从而达到选择任意一级选项的目的。
@code('${DEMO_PATH}/cascader/demo/CheckStrictly.vue')
### 多选-选择任意级别-绑定所有级别 <sup>1.25.5+</sup>
下面综合演示多选的使用。
@code('${DEMO_PATH}/cascader/demo/CheckStrictlyAllLevels.vue')
## API
### CascaderProps
| 属性 | 描述 | 类型 | 默认值 |
| --------------------------------- | --------------------------------------------- | --------------------------------------------------------------------------- | ---------------- |
| root-class | 组件根元素类名 | string | - |
| root-style | 组件根元素样式 | StyleValue | - |
| model-value (v-model) | 选中项的值 | CascaderValue | - |
| options | 可选项数据源 | CascaderOption[] | [] |
| field-keys | 自定义 `options` 中的字段 | CascaderFieldKeys | defaultFieldKeys |
| hint-text | 未选中时的提示文案 | string | '请选择' |
| label-render | 自定义可选项渲染 | (option: CascaderOption) => string | - |
| change-on-select <sup>1.14+</sup> | 点击每级选项都会触发变化 | boolean | false |
| all-levels <sup>1.23+</sup> | 是否绑定所有级别的值,而不单单是最后一级 | boolean | false |
| multiple <sup>1.25.5+</sup> | 是否多选 | boolean | false |
| check-strictly <sup>1.25.5+</sup> | 是否严格的遵守父子节点不互相关联(用于多选) | boolean | false |
| lazy <sup>1.25.5+</sup> | 是否懒加载子节点,需与 load 方法结合使用 | boolean | false |
| load <sup>1.25.5+</sup> | 加载子节点的方法,仅当 lazy 属性为true 时生效 | (node?: CascaderStateNode) => Promise<CascaderOption[]> \| CascaderOption[] | - |
### CascaderSlots
| 插槽 | 描述 | 属性 |
| ---- | ------------------ | -------------------- |
| top | 自定义面板上方内容 | { tabIndex: number } |
### CascaderEmits
| 事件 | 描述 | 类型 |
| ------------------------ | ---------------------- | ----------------------------------------------------------------- |
| update:model-value | 全部选项选择完成后触发 | (value: CascaderValue, selectedOptions: CascaderOption[]) => void |
| change <sup>1.9.2+</sup> | 全部选项选择完成后触发 | (value: CascaderValue, selectedOptions: CascaderOption[]) => void |
| select | 选中某一项时触发 | (option: CascaderOption, tabIndex: number) => void |
### CascaderValue
```ts
type CascaderValue =
| string
| number
| (string | number)[]
| (string | number)[][]
```
### CascaderOption
```ts
interface CascaderOption {
label?: string
value?: string | number
disabled?: boolean
children?: CascaderOption[]
isLeaf?: boolean
[key: PropertyKey]: any
}
```
### CascaderFieldKeys
```ts
interface CascaderFieldKeys {
label?: string
value?: string
disabled?: string
children?: string
isLeaf?: string
}
```
### defaultFieldKeys
```ts
const defaultFieldKeys: CascaderFieldKeys = {
label: 'label',
value: 'value',
disabled: 'disabled',
children: 'children',
isLeaf: 'isLeaf',
}
```
### CascaderStateNode
```ts
interface CascaderStateNode {
label: string
value: string | number
key: string | number
disabled: boolean
children?: CascaderStateNode[]
parent: CascaderStateNode | null
isLeaf: boolean
loadStatus: 'idle' | 'loading' | 'loaded'
depth: number
indeterminate: boolean
checked: boolean
selected: boolean
option: CascaderOption
}
```
## 主题定制
### CSS 变量
@code('./variables.scss#variables')