Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: cascader use select-input #1074

Merged
merged 10 commits into from
Jul 6, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions examples/cascader/cascader.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ clearable | Boolean | false | 是否支持清空选项 | N
collapsedItems | Slot / Function | - | 多选情况下,用于设置折叠项内容,默认为 `+N`。如果需要悬浮就显示其他内容,可以使用 collapsedItems 自定义。TS 类型:`TNode<{ value: CascaderOption[]; collapsedSelectedItems: CascaderOption[]; count: number }>`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
disabled | Boolean | false | 是否禁用组件 | N
empty | String / Slot / Function | - | 无匹配选项时的内容,默认全局配置为 '暂无数据'。TS 类型:`string | TNode`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
filter | Function | - | 自定义过滤方法,用于对现有数据进行搜索过滤,判断是否过滤某一项数据。TS 类型:`(filterWords: string, node: TreeNodeModel) => boolean | Promise<boolean>` | N
filterable | Boolean | false | 是否可搜索 | N
keys | Object | - | 用来定义 value / label / children 在 `options` 中对应的字段别名。TS 类型:`CascaderKeysType` `interface CascaderKeysType { value?: string; label?: string; children?: string }`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts) | N
keys | Object | - | 用来定义 value / label / children 在 `options` 中对应的字段别名。TS 类型:`CascaderKeysType` `interface CascaderKeysType { value?: string; label?: string; children?: string | boolean }`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts)。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts) | N
lazy | Boolean | true | 延迟加载 children 为 true 的子节点,即使 expandAll 被设置为 true,也同样延迟加载 | N
load | Function | - | 加载子树数据的方法(仅当节点 children 为 true 时生效)。TS 类型:`(node: TreeNodeModel<CascaderOption>) => Promise<Array<CascaderOption>>` | N
loading | Boolean | false | 是否为加载状态 | N
Expand All @@ -23,6 +24,9 @@ multiple | Boolean | false | 是否允许多选 | N
options | Array | [] | 可选项数据源。TS 类型:`Array<CascaderOption>` | N
placeholder | String | undefined | 占位符 | N
popupProps | Object | - | 参考 popup 组件 API。TS 类型:`PopupProps`,[Popup API Documents](./popup?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts) | N
popupVisible | Boolean | undefined | 是否显示下拉框 | N
readonly | Boolean | false | 只读状态,值为真会隐藏输入框,且无法打开下拉框 | N
selectInputProps | Object | - | 透传 SelectInput 筛选器输入框组件的全部属性。TS 类型:`SelectInputProps`,[SelectInput API Documents](./select-input?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts) | N
showAllLevels | Boolean | true | 选中值使用完整路径,输入框在单选时也显示完整路径 | N
size | String | medium | 组件尺寸。可选项:large/medium/small。TS 类型:`SizeEnum`。[通用类型定义](https://github.com/Tencent/tdesign-vue/blob/develop/src/common.ts) | N
trigger | String | click | 展开下一层级的方式。可选项:click/hover | N
Expand All @@ -31,15 +35,17 @@ defaultValue | String / Number / Array | [] | 选中项的值。非受控属性
valueMode | String | onlyLeaf | 选中值模式。all 表示父节点和子节点全部会出现在选中值里面;parentFirst 表示当子节点全部选中时,仅父节点在选中值里面;onlyLeaf 表示无论什么情况,选中值仅呈现叶子节点。可选项:onlyLeaf/parentFirst/all | N
valueType | String | single | 用于控制选中值的类型。single 表示输入输出值为 叶子结点值, full 表示输入输出值为全路径。可选项:single/full | N
onBlur | Function | | TS 类型:`(context: { value: CascaderValue<CascaderOption>; e: FocusEvent }) => void`<br/>当输入框失去焦点时触发 | N
onChange | Function | | TS 类型:`(value: CascaderValue<CascaderOption>, context: CascaderChangeContext<CascaderOption>) => void`<br/>选中值发生变化时触发。TreeNodeModel 从树组件中导出。`context.node` 表示触发事件的节点,`context.source` 表示触发事件的来源。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`interface CascaderChangeContext<CascaderOption> { node?: TreeNodeModel<CascaderOption>; source: CascaderChangeSource }`<br/><br/>`import { TreeNodeModel } from '@Tree'`<br/><br/>`type CascaderChangeSource = 'invalid-value' | 'checked' | 'clear' | 'unchecked'`<br/> | N
onChange | Function | | TS 类型:`(value: CascaderValue<CascaderOption>, context: CascaderChangeContext<CascaderOption>) => void`<br/>选中值发生变化时触发。TreeNodeModel 从树组件中导出。`context.node` 表示触发事件的节点,`context.source` 表示触发事件的来源。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`interface CascaderChangeContext<CascaderOption> { node?: TreeNodeModel<CascaderOption>; source: CascaderChangeSource }`<br/><br/>`import { TreeNodeModel } from '@Tree'`<br/><br/>`type CascaderChangeSource = 'invalid-value' | 'check' | 'clear' | 'uncheck'`<br/> | N
onFocus | Function | | TS 类型:`(context: { value: CascaderValue<CascaderOption>; e: FocusEvent }) => void`<br/>获得焦点时触发 | N
onPopupVisibleChange | Function | | TS 类型:`(visible: boolean, context: PopupVisibleChangeContext) => void`<br/>下拉框显示或隐藏时触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`import { PopupVisibleChangeContext } from '@Popup'`<br/> | N
onRemove | Function | | TS 类型:`(context: RemoveContext<CascaderOption>) => void`<br/>多选模式下,选中数据被移除时触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`interface RemoveContext<T> { value: CascaderValue<T>; node: TreeNodeModel<T> }`<br/> | N

### Cascader Events

名称 | 参数 | 描述
-- | -- | --
blur | `(context: { value: CascaderValue<CascaderOption>; e: FocusEvent })` | 当输入框失去焦点时触发
change | `(value: CascaderValue<CascaderOption>, context: CascaderChangeContext<CascaderOption>)` | 选中值发生变化时触发。TreeNodeModel 从树组件中导出。`context.node` 表示触发事件的节点,`context.source` 表示触发事件的来源。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`interface CascaderChangeContext<CascaderOption> { node?: TreeNodeModel<CascaderOption>; source: CascaderChangeSource }`<br/><br/>`import { TreeNodeModel } from '@Tree'`<br/><br/>`type CascaderChangeSource = 'invalid-value' | 'checked' | 'clear' | 'unchecked'`<br/>
change | `(value: CascaderValue<CascaderOption>, context: CascaderChangeContext<CascaderOption>)` | 选中值发生变化时触发。TreeNodeModel 从树组件中导出。`context.node` 表示触发事件的节点,`context.source` 表示触发事件的来源。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`interface CascaderChangeContext<CascaderOption> { node?: TreeNodeModel<CascaderOption>; source: CascaderChangeSource }`<br/><br/>`import { TreeNodeModel } from '@Tree'`<br/><br/>`type CascaderChangeSource = 'invalid-value' | 'check' | 'clear' | 'uncheck'`<br/>
focus | `(context: { value: CascaderValue<CascaderOption>; e: FocusEvent })` | 获得焦点时触发
popup-visible-change | `(visible: boolean, context: PopupVisibleChangeContext)` | 下拉框显示或隐藏时触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`import { PopupVisibleChangeContext } from '@Popup'`<br/>
remove | `(context: RemoveContext<CascaderOption>)` | 多选模式下,选中数据被移除时触发。[详细类型定义](https://github.com/Tencent/tdesign-vue/tree/develop/src/cascader/type.ts)。<br/>`interface RemoveContext<T> { value: CascaderValue<T>; node: TreeNodeModel<T> }`<br/>
19 changes: 1 addition & 18 deletions examples/cascader/demos/base.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,8 @@
<template>
<div>
<t-cascader
v-model="value"
:options="options"
clearable
size="medium"
placeholder='请选择'
class="t-demo-cascader"
@change="onChange"
></t-cascader>
<t-cascader v-model="value" :options="options" clearable @change="onChange" />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -61,11 +52,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader-title {
margin: 10px 0;
}
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
18 changes: 3 additions & 15 deletions examples/cascader/demos/check-strictly.vue
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value1" placeholder='请选择' check-strictly></t-cascader>
<t-cascader
class="t-demo-cascader"
:options="options"
v-model="value2"
check-strictly
multiple
></t-cascader>
<div class="tdesign-demo-block-row">
<t-cascader v-model="value1" :options="options" check-strictly />
<t-cascader v-model="value2" :options="options" check-strictly multiple />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -111,8 +104,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
32 changes: 10 additions & 22 deletions examples/cascader/demos/collapsed.vue
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value" :onRemove="handleBlur" multiple :minCollapsedNum="1" />
<t-cascader class="t-demo-cascader" :options="options" v-model="value" :collapsedItems="collapsedItems" multiple :minCollapsedNum="1" />
<t-cascader class="t-demo-cascader" :options="options" v-model="value" multiple clearable :minCollapsedNum="1">
<div class="tdesign-demo-block-row">
<t-cascader v-model="value" :options="options" :on-remove="handleBlur" multiple :min-collapsed-num="1" />
<t-cascader v-model="value" :options="options" :collapsed-items="collapsedItems" multiple :min-collapsed-num="1" />
<t-cascader v-model="value" class="t-demo-cascader" :options="options" multiple clearable :min-collapsed-num="1">
<template #collapsedItems="{ collapsedSelectedItems, count }">
<t-popup>
<template #content>
<p
v-for="(item, index) in collapsedSelectedItems"
:key="index"
style="padding: 10px;"
>
{{item.label}}
<p v-for="(item, index) in collapsedSelectedItems" :key="index" style="padding: 10px">
{{ item.label }}
</p>
</template>
<span v-show="count > 0" style="color: #00A870;">+{{count}}</span>
<span v-show="count > 0" style="color: #00a870">+{{ count - 1 }}</span>
</t-popup>
</template>
</t-cascader>
</div>
</template>

<script lang="jsx">
export default {
data() {
Expand Down Expand Up @@ -71,14 +66,12 @@ export default {
return (
<t-popup>
<div slot="content">
{
value.map((item) => (
{value.map((item) => (
<p style="padding: 10px;">{item.label}</p>
))
}
))}
</div>
<span v-show={count > 0} style="color: #ED7B2F;">
+{count}
+{count - 1}
</span>
</t-popup>
);
Expand All @@ -89,8 +82,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
12 changes: 3 additions & 9 deletions examples/cascader/demos/disabled.vue
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value1" disabled></t-cascader>
<t-cascader class="t-demo-cascader" :options="options" v-model="value2" disabled multiple></t-cascader>
<div class="tdesign-demo-block-row">
<t-cascader v-model="value1" :options="options" disabled />
<t-cascader v-model="value2" :options="options" disabled multiple />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -49,8 +48,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
15 changes: 8 additions & 7 deletions examples/cascader/demos/ellipsis.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value" clearable placeholder='请选择'></t-cascader>
<div class="tdesign-demo-block-row t-cascader-demo">
<t-cascader v-model="value1" :options="options" clearable placeholder="请选择" />
<t-cascader v-model="value2" multiple :options="options" clearable placeholder="请选择" />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -42,13 +42,14 @@ export default {
],
},
],
value: '1.1',
value1: '1.1',
value2: ['1.1'],
};
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
<style>
.t-cascader-demo {
width: 100%;
}
</style>
26 changes: 14 additions & 12 deletions examples/cascader/demos/filterable.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value" filterable clearable placeholder='请选择'></t-cascader>
<t-cascader class="t-demo-cascader" :options="options" v-model="value2" filterable clearable multiple placeholder='请选择' :minCollapsedNum="2"></t-cascader>
<div class="tdesign-demo-block-row">
<t-cascader v-model="value" :options="options" filterable clearable />
<t-cascader v-model="value2" :options="options" filterable clearable multiple :min-collapsed-num="2" />
<t-cascader v-model="value3" :filter="filterMethod" :options="options" clearable :min-collapsed-num="2" />
</div>
</template>

<script>
export default {
data() {
return {
options: [
{
label: '选项一',
label: '当选项一数据展示文本过长时',
value: '1',
children: [
{
Expand All @@ -23,7 +23,7 @@ export default {
value: '1.2',
},
{
label: '子选项三',
label: '当选项数据展示文本过长时',
value: '1.3',
},
],
Expand All @@ -37,20 +37,22 @@ export default {
value: '2.1',
},
{
label: '子选项二',
label: '当选项数据展示文本过长时',
value: '2.2',
},
],
},
],
value: '',
value2: ['1.1'],
value3: '',
};
},
methods: {
filterMethod(search, node) {
console.log('filter:', search, node.label);
return node.label.indexOf(search) !== -1;
},
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
13 changes: 6 additions & 7 deletions examples/cascader/demos/keys.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :keys="{ label: 'name', value: 'code', children: 'items' }" :options="options" v-model="value" clearable placeholder='请选择'></t-cascader>
<t-cascader
v-model="value"
:keys="{ label: 'name', value: 'code', children: 'items' }"
:options="options"
clearable
/>
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -47,8 +51,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
12 changes: 3 additions & 9 deletions examples/cascader/demos/load.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value" clearable :load="load" />
<t-cascader v-model="value" :options="options" clearable :load="load" />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -32,11 +31,11 @@ export default {
nodes = [
{
label: `${node.label}.1`,
children: node.level < 2,
children: node.level < 1,
},
{
label: `${node.label}.2`,
children: node.level < 2,
children: node.level < 1,
},
];
}
Expand All @@ -47,8 +46,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
8 changes: 1 addition & 7 deletions examples/cascader/demos/max.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value" multiple clearable :max="3"/>
<t-cascader v-model="value" :options="options" multiple clearable :max="3" />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -47,8 +46,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
13 changes: 2 additions & 11 deletions examples/cascader/demos/multiple.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<template>
<div>
<t-cascader class="t-demo-cascader" :options="options" v-model="value" multiple clearable/>
<div class="t-cascader-demo">
<t-cascader v-model="value" :options="options" multiple clearable />
</div>
</template>

<script>
export default {
data() {
Expand Down Expand Up @@ -52,11 +51,3 @@ export default {
},
};
</script>
<style scoped>
.t-demo-cascader-title {
margin: 10px 0;
}
.t-demo-cascader + .t-demo-cascader {
margin-top: 16px;
}
</style>
Loading