UNPKG

zarm-web

Version:
225 lines (204 loc) 7.95 kB
## 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 | - | - |