zarm-web
Version:
基于 React 的桌面端UI库
225 lines (204 loc) • 7.95 kB
Markdown
## Dropdown 下拉框
下拉框组件。
### 基础用法
目前支持三种触发方式 `click hover contextMenus`,默认值为`click`。
:::demo 通过`visible`属性控制显隐。
```js
constructor(props) {
super(props);
this.state = {
dropdown: false,
dropdown2:false,
dropdown3:false,
dropdown4:false
}
}
render() {
const overlay = <Menu>
<Menu.Item><Checkbox value="name">姓名</Checkbox></Menu.Item>
<Menu.Item><Checkbox value="age">年龄</Checkbox></Menu.Item>
<Menu.Item onClick={()=>{
this.setState({
dropdown: false,
dropdown2:false,
dropdown3:false,
dropdown4:false
});
}}>点我关闭弹窗</Menu.Item>
</Menu>;
return (
<div style={{position: 'relative'}}>
<Dropdown
visible={this.state.dropdown}
onVisibleChange={visible => {
this.setState({
dropdown: visible
});
}}
overlay={overlay}
>
<Button theme="primary">
toggle
</Button>
</Dropdown>
<Dropdown
disabled
visible={this.state.dropdown2}
style={{position: 'absolute', left: 0, top: 36, minWidth: 200}}
onVisibleChange={visible => {
this.setState({
dropdown2: visible
});
}}
overlay={overlay}
>
<Button disabled theme="primary">
disabled
</Button>
</Dropdown>
<Dropdown
trigger="hover"
visible={this.state.dropdown3}
style={{position: 'absolute', left: 0, top: 36, minWidth: 200}}
onVisibleChange={visible => {
this.setState({
dropdown3: visible
});
}}
overlay={overlay}
>
<Button theme="primary">
hover me
</Button>
</Dropdown>
<Dropdown
trigger="contextMenu"
visible={this.state.dropdown4}
style={{position: 'absolute', left: 0, top: 36, minWidth: 200}}
onVisibleChange={visible => {
this.setState({
dropdown4: visible
});
}}
overlay={overlay}
>
<Button theme="primary">
right click me
</Button>
</Dropdown>
</div>
)
}
```
:::
### 弹窗的定位
定位信息有6种 `bottomLeft, bottomCenter, bottomRight, topLeft, topCenter, topRight`。通过`placement`控制显示位置
:::demo 通过`placement`属性控制弹窗的位置。
```js
constructor(props) {
super(props);
this.state = {
dropdown: false,
dropdown2:false,
}
}
render() {
const overlay = <Menu>
<Menu.Item><Checkbox value="name">姓名</Checkbox></Menu.Item>
<Menu.Item><Checkbox value="age">年龄</Checkbox></Menu.Item>
<Menu.Item onClick={()=>{
this.setState({
dropdown: false,
dropdown2:false,
});
}}>点我关闭当前弹窗</Menu.Item>
</Menu>;
return (
<div style={{position: 'relative'}}>
<Dropdown
visible={this.state.dropdown}
style={{position: 'absolute', left: 0, top: 36, minWidth: 200}}
onVisibleChange={visible => {
this.setState({
dropdown: visible
});
}}
overlay={overlay}
>
<Button theme="primary">
点我从下面弹出
</Button>
</Dropdown>
<Dropdown
placement="topLeft"
visible={this.state.dropdown2}
style={{position: 'absolute', left: 0, top: 36, minWidth: 200}}
onVisibleChange={visible => {
this.setState({
dropdown2: visible
});
}}
overlay={overlay}
>
<Button theme="primary">
点我从上面弹出
</Button>
</Dropdown>
</div>
)
}
```
:::
### `onVisibleChange` 参数
这个参数为当显示属性发生变化的回调函数 为必传项,一般情况下, 我们都需要保持外部数据和内部数据的一致性。参考下面用法
```
onVisibleChange={(visible)=>{
this.setState({
dropdownVisible: visible
})
}
}
```
### 静态方法
```
Drop.hide(); // 隐藏所有的Dropdown组件
Drop.show(); // 显示所有的Dropdown组件(不包括禁用的组件)
Drop.reposition(); // 重新定位所有的组件(不包括隐藏和禁用的组件)
```
### `notRenderInDisabledMode` 参数
当这个参数为true 且 disable参数也为true的时候,将不会渲染弹窗,这会在一些一直都是disabled状态下的组件节省渲染开销,尤其在渲染大量数据的情况下。
### `className` 和 `style`参数
className 和 style 参数会作用在弹出框的最外层 ui-dropdown节点上。内部的style会覆盖传入的style(若冲突), 会被覆盖的属性有:
```
display // 控制dropdown的显示
left // 控制dropdown的位置
top // 控制dropdown的位置
animationDuration // 控制dropdown动画的事件 默认为300
zIndex // 控制组件的显示层级 默认为9999
position // 控制组件的定位方式,只能为absolute
```
### 内部实现
设 点击的触发组件为 triggerBox, 弹出的组件为 DropdownBox
+ Dropdown组件在实现的时候,考虑到定位信息的获取,把所有的DropdownBox都动态创建到body的根节点下。然后相对于body进行绝对定位。计算出当前triggerBox的位置然后设置弹出框的绝对定位信息, 若父级中有position:fixed样式,则动态创建到该元素下。
+ 监听了window.resize事件,当window.resize的时候自动计算目前已弹出的DropdownBox的位置。
+ 监听了document的点击事件,当点击外部的时候回自动隐藏DropdownBox。
+ 默认在triggerBox和DropdownBox之间有5px的间隙。
+ 当trigger参数为hover的时候,鼠标移出之后会延迟300ms后,DropdownBox才会消失,为了让用户在从triggerBox滑到DropdownBox的时候,经过间隙不会直接隐藏DropdownBox。
+ DropdownBox的动画效果时长为300ms,目前不支持自定义。
+ 当前的弹出框的最小宽度为当前triggerBox的宽度。可以自己设置宽度。
### Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|---------- |-------- |---------- |------------- |-------- |
| visible | 是否显示 | boolean | - | false |
| radius | 是否圆角 | boolean | - | false |
| prefixCls | 组件的className | string | - | ui-dropdown|
| overlay | 组件弹出层的内容 | ReactElement | - |-|
| placement | 组件对齐的方式 | string | bottomLeft, bottomCenter, bottomRight, topLeft, topCenter, topRight| bottomLeft |
| className | 弹出层的className | string | - | - |
| style | 弹出层的style | React.CSSProperties | - | - |
| trigger | 出发弹出框的方式 | string | click hover contextMenu | click |
| disabled | 是否禁用弹出框 | boolean | - | false |
| zIndex | 当前弹框的zIndex值 | number | - | 9999 |
| notRenderInDisabledMode | 在disable为true的时候是否不渲染overlay | boolean | - | false |
| onVisibleChange | 显示属性变化时候的回调函数(必传)| (visible:boolean):=> void | - | - |
| getPopupContainer | 获取dropdown挂载点的函数(必传)| ():=> HTMLElement | - | - |