Skip to content

Commit 1358ef5

Browse files
authoredApr 6, 2022
feat(Cascader):增加API: expandTrigger子菜单展开方式 (#745)
1 parent f988af3 commit 1358ef5

File tree

2 files changed

+83
-9
lines changed

2 files changed

+83
-9
lines changed
 

‎packages/react-cascader/README.md

+61
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,66 @@ const Demo = () => {
192192
ReactDOM.render(<Demo />, _mount_);
193193
```
194194

195+
## 移入展开菜单
196+
197+
<!--rehype:bgWhite=true&codeSandbox=true&codePen=true-->
198+
```jsx
199+
import ReactDOM from 'react-dom';
200+
import { Cascader } from 'uiw';
201+
202+
const Demo = () => {
203+
204+
const options = [
205+
{
206+
label: '上海市',
207+
value: 1,
208+
children: [
209+
{
210+
label: '徐汇区',
211+
value: 4,
212+
children: [
213+
{ label: '半淞园路街道', value: 6 },
214+
{ label: '南京东路街道', value: 7 },
215+
{ label: '外滩街道', value: 8 },
216+
]
217+
},
218+
]
219+
},
220+
{
221+
label: '北京市',
222+
value: 9,
223+
children: [
224+
{
225+
label: '崇文区',
226+
value: 12,
227+
children: [
228+
{ label: '东花市街道', value: 13 },
229+
{ label: '体育馆路街道', value: 14 },
230+
{ label: '前门街道', value: 15 },
231+
]
232+
},
233+
]
234+
},
235+
];
236+
237+
return (
238+
<Row style={{ flexDirection: 'column' }}>
239+
<Cascader
240+
style={{ width:200 }}
241+
expandTrigger="hover"
242+
allowClear={true}
243+
placeholder="请选择"
244+
value={[1, 4, 7]}
245+
option={options}
246+
onChange={(value, seleteds) => console.log(value, seleteds)}
247+
onSearch={true}
248+
/>
249+
</Row>
250+
)
251+
};
252+
ReactDOM.render(<Demo />, _mount_);
253+
```
254+
195255
### 在表单中使用
196256

197257
[`<Form />`](#/components/form) 表单中应用 `<Cascader />` 组件。
@@ -316,3 +376,4 @@ ReactDOM.render(<Demo />, _mount_);
316376
| onSearch | 开启搜索选项 | functionon(searchText) \| Boolean | - | v4.16.1 |
317377
| size | 选择框尺寸 | Enum{large, default, small } | `default` | v17.0.1 |
318378
| inputProps | 传给[Input](http://localhost:3000/#/components/input)组件的参数 | Object | - | v17.0.1 |
379+
| expandTrigger | 子集菜单的展开方式,'click' 和 'hover' | String | `click` | v4.18.2 |

‎packages/react-cascader/src/index.tsx

+22-9
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ export interface CascaderProps extends IProps, DropdownProps {
2020
placeholder?: string;
2121
disabled?: boolean;
2222
inputProps?: HTMLInputProps;
23+
expandTrigger: 'click' | 'hover';
2324
}
2425

2526
function Cascader(props: CascaderProps) {
2627
const {
2728
value,
2829
onChange,
2930
onSearch,
30-
31+
expandTrigger = 'click',
3132
size,
3233
disabled,
3334
allowClear,
@@ -110,6 +111,7 @@ function Cascader(props: CascaderProps) {
110111

111112
const handleItemClick = (optionsItem: OptionType, level: number) => {
112113
selectedValue.splice(level, selectedValue.length - level, optionsItem);
114+
if (!optionsItem.children) setInnerIsOpen(false);
113115

114116
handelChange(true, selectedValue);
115117
};
@@ -139,6 +141,21 @@ function Cascader(props: CascaderProps) {
139141

140142
const widths = (style?.width as number) * 0.7 || undefined;
141143

144+
const trigger = useMemo(() => {
145+
return (cb: Function, click?: boolean) => {
146+
const triggers: Record<'onClick' | 'onMouseOver', () => void> = { onClick: () => {}, onMouseOver: () => {} };
147+
const callback = () => {
148+
cb();
149+
};
150+
if (expandTrigger === 'click' || click) {
151+
triggers.onClick = callback;
152+
} else if (expandTrigger === 'hover') {
153+
triggers.onMouseOver = callback;
154+
}
155+
return triggers;
156+
};
157+
}, []);
158+
142159
const OptionIter = (option: Array<OptionType>, level: number = 0) => {
143160
if (!option) return;
144161

@@ -164,7 +181,9 @@ function Cascader(props: CascaderProps) {
164181
key={index}
165182
text={opt.label}
166183
addonAfter={opt.children ? <Icon type="right" /> : undefined}
167-
onClick={() => handleItemClick(opt, level)}
184+
{...trigger(() => {
185+
handleItemClick(opt, level);
186+
}, !opt.children?.length)}
168187
/>
169188
);
170189
})
@@ -215,13 +234,7 @@ function Cascader(props: CascaderProps) {
215234
searchOption
216235
.filter((opt) => opt.label.includes(searchText.trim()))
217236
.map((opt, index) => {
218-
return (
219-
<Menu.Item
220-
key={index}
221-
text={opt.label}
222-
onClick={() => searchItemClick(opt.options)} //
223-
/>
224-
);
237+
return <Menu.Item key={index} text={opt.label} onClick={() => searchItemClick(opt.options)} />;
225238
})
226239
)}
227240
</Menu>

0 commit comments

Comments
 (0)
Please sign in to comment.