TreeSelect 树型选择控件
如果项目中使用的是 1.x 版本的基础组件(@alifd/next),请在左侧导航顶部切换组件版本。
安装方法
- 在命令行中执行以下命令
npm install @icedesign/base@latest -S
开发指南
何时使用
类似 Select 的选择控件,可选择的数据结构是一个树形结构时,可以使用 TreeSelect,例如公司层级、学科系统、分类目录等等。
API
树型选择控件
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
prefix | 样式类名的品牌前缀 | String | 'next-' |
className | 自定义类名 | String | - |
style | 自定义内联样式 | Object | - |
children | 树节点 | ReactNode | - |
size | 选择框大小可选值:'small', 'medium', 'large' | Enum | 'medium' |
shape | 选择框形状可选值:'normal', 'arrow-only' | Enum | 'normal' |
placeholder | 选择框占位符 | String | - |
disabled | 是否禁用 | Boolean | false |
hasArrow | 是否显示右侧的箭头 | Boolean | true |
hasClear | 是否显示清空按钮,该按钮可以清空当前选中的值,该属性仅在单选模式下有效 | Boolean | false |
autoWidth | 下拉框是否与选择器对齐 | Boolean | false |
dataSource | 数据源,该属性优先级高于 children | Array<Object> | - |
value | (受控)当前值 | String/Array<String> | - |
defaultValue | (非受控)默认值 | String/Array<String> | null |
onChange | 选中值改变时触发的回调函数签名:Function(value: String/Array, data: Object/Array) => void参数:value: {String/Array} 选中的值,单选时返回单个值,多选时返回数组data: {Object/Array} 选中的数据,包括 value, label, pos, key属性,单选时返回单个值,多选时返回数组,父子节点选中关联时,同时选中,只返回父节点 | Function | () => {} |
defaultVisible | 初始下拉框是否显示 | Boolean | false |
showSearch | 是否显示搜索框 | Boolean | false |
onSearch | 在搜索框中输入时触发的回调函数签名:Function(keyword: String) => void参数:keyword: {String} 输入的关键字 | Function | () => {} |
multiple | 是否支持多选 | Boolean | false |
treeCheckable | 下拉框中的树是否支持勾选节点的复选框 | Boolean | false |
treeCheckStrictly | 下拉框中的树勾选节点复选框是否完全受控(父子节点选中状态不再关联) | Boolean | false |
treeDefaultExpandAll | 下拉框中的树是否默认展开所有节点 | Boolean | false |
treeDefaultExpandedKeys | 下拉框中的树默认展开节点key的数组 | Array<String> | [] |
treeLoadData | 下拉框中的树异步加载数据的函数,使用请参考Tree的异步加载数据Demo签名:Function(node: ReactElement) => void参数:node: {ReactElement} 被点击展开的节点 | Function | - |
popupClassName | 下拉框样式自定义类名 | String | - |
container | 下拉框挂载的容器节点 | String/Function | - |
代码示例
最简单的单选用法。
查看源码在线预览
import { TreeSelect } from "@icedesign/base";
const TreeNode = TreeSelect.Node;
class Demo extends React.Component {
handleChange(value, data) {
console.log(value, data);
}
render() {
return (
<TreeSelect
treeDefaultExpandAll
onChange={::this.handleChange}
hasClear
autoWidth
style={{ width: 200 }}
>
<TreeNode key="1" value="1" label="服装">
<TreeNode key="2" value="2" label="男装">
<TreeNode key="4" value="4" label="外套" />
<TreeNode key="5" value="5" label="夹克" />
</TreeNode>
<TreeNode key="3" value="3" label="女装">
<TreeNode key="6" value="6" label="裙子" />
</TreeNode>
</TreeNode>
</TreeSelect>
);
}
}
ReactDOM.render(<Demo />, mountNode);
展示复选框多选的功能。
查看源码在线预览
import { TreeSelect } from "@icedesign/base";
const treeData = [
{
label: "服装",
value: "1",
children: [
{
label: "男装",
value: "2",
children: [
{
label: "外套",
value: "4"
},
{
label: "夹克",
value: "5"
}
]
},
{
label: "女装",
value: "3",
children: [
{
label: "裙子",
value: "6"
}
]
}
]
}
];
class Demo extends React.Component {
handleChange(value, data) {
console.log(value, data);
}
render() {
return (
<TreeSelect
treeDefaultExpandAll
treeCheckable
autoWidth
dataSource={treeData}
onChange={::this.handleChange}
style={{ width: 200 }}
/>
);
}
}
ReactDOM.render(<Demo />, mountNode);
展示树选择受控的用法。
查看源码在线预览
import { TreeSelect } from "@icedesign/base";
const treeData = [
{
label: "服装",
value: "1",
children: [
{
label: "男装",
value: "2",
children: [
{
label: "外套",
value: "4"
},
{
label: "夹克",
value: "5"
}
]
},
{
label: "女装",
value: "3",
children: [
{
label: "裙子",
value: "6"
}
]
}
]
}
];
class Demo extends React.Component {
state = {
value: ["4", "6"]
};
handleChange(value, data) {
console.log(value, data);
this.setState({
value
});
}
render() {
return (
<TreeSelect
treeDefaultExpandAll
treeCheckable
autoWidth
dataSource={treeData}
value={this.state.value}
onChange={::this.handleChange}
style={{ width: 200 }}
/>
);
}
}
ReactDOM.render(<Demo />, mountNode);
使用dataSource
生成树结构,除设置label, value, children属性外,还可传入TreeNode的其他属性,包括selectable, disabled, disableCheckbox, isLeaf,推荐使用dataSource
而不是手动生成TreeNode
的方式生成树,这样使用更简单,性能更好。
查看源码在线预览
import { TreeSelect } from "@icedesign/base";
const treeData = [
{
label: "服装",
value: "1",
selectable: false,
children: [
{
label: "男装",
value: "2",
children: [
{
label: "外套",
value: "4"
},
{
label: "夹克",
value: "5",
disabled: true
}
]
},
{
label: "女装",
value: "3",
children: [
{
label: "裙子",
value: "6"
}
]
}
]
}
];
class Demo extends React.Component {
handleChange(value, data) {
console.log(value, data);
}
render() {
return (
<TreeSelect
treeDefaultExpandAll
dataSource={treeData}
onChange={::this.handleChange}
style={{ width: 200 }}
autoWidth
/>
);
}
}
ReactDOM.render(<Demo />, mountNode);
展示树选择的搜索用法。
查看源码在线预览
import { TreeSelect } from "@icedesign/base";
const treeData = [
{
label: "服装",
value: "1",
selectable: false,
children: [
{
label: "男装",
value: "2",
children: [
{
label: "外套",
value: "4"
},
{
label: "夹克",
value: "5",
disabled: true
}
]
},
{
label: "女装",
value: "3",
children: [
{
label: "裙子",
value: "6"
}
]
}
]
}
];
class Demo extends React.Component {
handleChange(value, data) {
console.log(value, data);
}
handleSearch(keyword) {
console.log(keyword);
}
render() {
return (
<TreeSelect
treeDefaultExpandAll
autoWidth
showSearch
dataSource={treeData}
onChange={::this.handleChange}
onSearch={::this.handleSearch}
style={{ width: 200 }}
/>
);
}
}
ReactDOM.render(<Demo />, mountNode);