@ray-js/smart-ui
Version:
轻量、可靠的智能小程序 UI 组件库
331 lines (276 loc) • 12.2 kB
Markdown
---
category: 布局
---
# DropdownMenu 下拉菜单
### 介绍
向下弹出的菜单列表。
### 引入
```jsx
import { DropdownMenu, DropdownItem } from '@ray-js/smart-ui';
```
## 代码演示
### 基础用法
```jsx
import React from 'react';
import { DropdownItem, DropdownMenu } from '@ray-js/smart-ui';
const option1 = [
{ text: '全部商品', value: 0 },
{ text: '新款商品', value: 1 },
{ text: '活动商品', value: 2 },
];
const option2 = [
{ text: '默认排序', value: 'a' },
{ text: '好评排序', value: 'b' },
{ text: '销量排序', value: 'c' },
];
export default function Demo() {
return (
<DropdownMenu>
<DropdownItem value={0} options={option1} />
<DropdownItem value={'a'} options={option2} />
</DropdownMenu>
);
}
```
### 自定义菜单内容
```jsx
import React, { useState, useCallback } from 'react';
import { DropdownItem, DropdownMenu, Cell, Switch, Button } from '@ray-js/smart-ui';
import { View, showModal } from '@ray-js/ray';
const option1 = [
{ text: '全部商品', value: 0 },
{ text: '新款商品', value: 1 },
{ text: '活动商品', value: 2 },
];
const option2 = [
{ text: '默认排序', value: 'a' },
{ text: '好评排序', value: 'b' },
{ text: '销量排序', value: 'c' },
];
export default function Demo() {
const [switch1, setSwitch1] = useState(true);
const [switch2, setSwitch2] = useState(false);
const onSwitch1Change = useCallback(({ detail }) => {
setSwitch1(detail);
}, []);
const onSwitch2Change = useCallback(({ detail }) => {
setSwitch2(detail);
}, []);
const onConfirm = useCallback(() => {
const pages = getCurrentPages();
const curPage = pages[pages.length - 1];
curPage.selectComponent('#item').toggle();
}, []);
return (
<DropdownMenu>
<DropdownItem value={0} options={option1} />
<DropdownItem id="item" title="筛选">
<Cell title="包邮">
<Switch
size="24px"
style={{ height: '26px' }}
checked={switch1}
activeColor="#ee0a24"
onChange={onSwitch1Change}
/>
</Cell>
<Cell title="团购">
<Switch
size="24px"
style={{ height: '26px' }}
checked={switch2}
activeColor="#ee0a24"
onChange={onSwitch2Change}
/>
</Cell>
<View style={{ padding: '5px 16px' }}>
<Button type="danger" block round onClick={onConfirm}>
确认
</Button>
</View>
</DropdownItem>
</DropdownMenu>
);
}
```
### 自定义选中状态颜色
```jsx
import React from 'react';
import { DropdownItem, DropdownMenu } from '@ray-js/smart-ui';
const option1 = [
{ text: '全部商品', value: 0 },
{ text: '新款商品', value: 1 },
{ text: '活动商品', value: 2 },
];
const option2 = [
{ text: '默认排序', value: 'a' },
{ text: '好评排序', value: 'b' },
{ text: '销量排序', value: 'c' },
];
export default function Demo() {
return (
<DropdownMenu activeColor="#1989fa">
<DropdownItem value={0} options={option1} />
<DropdownItem value={'a'} options={option2} />
</DropdownMenu>
);
}
```
### 向上展开
```jsx
import React from 'react';
import { DropdownItem, DropdownMenu } from '@ray-js/smart-ui';
const option1 = [
{ text: '全部商品', value: 0 },
{ text: '新款商品', value: 1 },
{ text: '活动商品', value: 2 },
];
const option2 = [
{ text: '默认排序', value: 'a' },
{ text: '好评排序', value: 'b' },
{ text: '销量排序', value: 'c' },
];
export default function Demo() {
return (
<DropdownMenu direction="up">
<DropdownItem value={0} options={option1} />
<DropdownItem value={'a'} options={option2} />
</DropdownMenu>
);
}
```
### 禁用菜单
```jsx
import React from 'react';
import { DropdownItem, DropdownMenu } from '@ray-js/smart-ui';
const option1 = [
{ text: '全部商品', value: 0 },
{ text: '新款商品', value: 1 },
{ text: '活动商品', value: 2 },
];
const option2 = [
{ text: '默认排序', value: 'a' },
{ text: '好评排序', value: 'b' },
{ text: '销量排序', value: 'c' },
];
export default function Demo() {
return (
<DropdownMenu>
<DropdownItem value={0} disabled options={option1} />
<DropdownItem value={'a'} disabled options={option2} />
</DropdownMenu>
);
}
```
### 异步打开/关闭
通过 `beforeToggle` 事件可以在下拉菜单打开或者关闭前执行特定的逻辑,实现状态变更前校验、异步打开/关闭的目的。
`scrollStyle` `v2.5.0` 当弹框需要滚动时,可以设置此属性,给定一个高度即可。
```jsx
import React, { useCallback } from 'react';
import { DropdownItem, DropdownMenu } from '@ray-js/smart-ui';
import { showModal } from '@ray-js/ray';
const option1 = [
{ text: '全部商品', value: 0 },
{ text: '新款商品', value: 1 },
{ text: '活动商品', value: 2 },
];
export default function Demo() {
const onBeforeChange = useCallback(({ detail: { status, callback } }) => {
showModal({
title: '异步打开/关闭',
content: `确定要${status ? '打开' : '关闭'}下拉菜单吗?`,
success: res => {
if (res.confirm) {
callback(true);
} else if (res.cancel) {
callback(false);
}
},
});
}, []);
return (
<DropdownMenu>
<DropdownItem scrollStyle={{ height: '120px' }} value={0} options={option1} useBeforeToggle onBeforeToggle={onBeforeChange} />
</DropdownMenu>
);
}
```
## API
### DropdownMenu Props
| 参数 | 说明 | 类型 | 默认值 |
| ---------------------- | ------------------------------ | --------- | --------- |
| activeColor | 菜单标题和选项的选中态颜色 | _string_ | `#3678E3` |
| triangleColor `v2.0.0` | 箭头未选中状态下的颜色 | _string_ | `#CCCCCC` |
| closeOnClickOutside | 是否在点击外部 menu 后关闭菜单 | _boolean_ | `true` |
| closeOnClickOverlay | 是否在点击遮罩层后关闭菜单 | _boolean_ | `true` |
| direction | 菜单展开方向,可选值为 up | _string_ | `down` |
| duration | 动画时长,单位毫秒 | _number_ | `200` |
| overlay | 是否显示遮罩层 | _boolean_ | `true` |
| safeAreaTabBar | 是否留出底部 tabbar 安全距离 | _boolean_ | `false` |
| zIndex | 菜单栏 z-index 层级 | _number_ | `10` |
### DropdownItem Props
| 参数 | 说明 | 类型 | 默认值 |
| ----------------- | ------------------------------------------------------ | ------------------ | -------------- |
| disabled | 是否禁用菜单 | _boolean_ | `false` |
| options | 选项数组 | _Option[]_ | `[]` |
| popupStyle | 自定义弹出层样式 | _React.CSSProperties_ | - |
| title | 菜单项标题 | _string_ | 当前选中项文字 |
| titleClass | 标题额外类名,建议使用自定义样式 item-title-class 代替 | _string_ | - |
| useBeforeToggle | 是否开启下拉菜单打开或者关闭前校验 | _boolean_ | `false` |
| value | 当前选中项对应的 value | _number \| string_ | - |
| scrollStyle `v2.5.0` | 当需要下拉菜单滚动时,此属性设置滚动区域的样式,比如高度 | _React.CSSProperties_ | - |
### DropdownItem Events
| 事件名 | 说明 | 回调参数 |
| ------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| beforeToggle | 下拉菜单打开或者关闭前触发,需要将`use-before-toggle`属性设置为`true` | `event.detail.status`: `true` 打开下拉菜单,`false` 关闭下拉菜单 <br>`event.detail.callback`: 回调函数,调用`callback(false)`终止下拉菜单状态变更 |
| change | 点击选项导致 value 变化时触发 | value |
| close | 关闭菜单栏时触发 | - |
| closed | 关闭菜单栏且动画结束后触发 | - |
| open | 打开菜单栏时触发 | - |
| opened | 打开菜单栏且动画结束后触发 | - |
### DropdownItem 方法
通过 [selectComponent](/material/smartui?comId=faq) 可访问。
| 方法名 | 说明 | 参数 | 返回值 |
| ------ | ------------------------------------------------------------- | -------------- | ------ |
| toggle | 切换菜单展示状态,传`true`为显示,`false`为隐藏,不传参为取反 | show?: boolean | - |
### Option 数据结构
| 键名 | 说明 | 类型 |
| ----- | -------------------------------- | ------------------ |
| icon | 左侧[图标svg字符串](/material/smartui?comId=icon)或图片链接 | _string_ |
| text | 文字 | _string_ |
| value | 标识符 | _number \| string_ |
### DropdownMenu 外部样式类
| 类名 | 说明 |
| ------------ | ------------ |
| customClass | 根节点样式类 |
| titleClass | 选中项样式类 |
### DropdownItem 外部样式类
| 类名 | 说明 |
| ---------------- | ------------ |
| customClass | 根节点样式类 |
| itemTitleClass | 选项样式类 |
### 样式变量
组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/material/smartui?comId=config-provider)。
| 名称 | 默认值 | 描述 |
| ----------------------------- | -------------------------------------- | ---- |
| --dropdown-menu-height | _46px_ | 菜单的高度 |
| --dropdown-menu-background-color | _var(--app-B3, #ffffff)_ | 菜单的背景色 |
| --dropdown-menu-title-font-size | _14px_ | 菜单的标题字体大小 |
| --dropdown-menu-title-line-height | _18px_ | 菜单的标题字体高度 |
| --dropdown-menu-title-text-color | _var(--app-B6-N1, rgba(0, 0, 0, 1))_ | 菜单的标题颜色 |
| --dropdown-menu-title-active-text-color | _var(--app-M1, #3678e3)_ | 菜单的标题选中颜色 |
| --dropdown-menu-title-disabled-text-color | _var(--app-B6-N4, rgba(0, 0, 0, 0.4))_ | 菜单的标题禁用颜色 |
| --dropdown-menu-title-padding | _0 24px 0 8px_ | 菜单的padding |
| --dropdown-menu-title-triangle-size `v2.0.0` | _12px_ | 箭头图标字体大小 |
| --dropdown-menu-title-triangle-margin-left `v2.0.0` | _4px_ | 箭头图标左间距 |
| --dropdown-menu-item-title-font-size `v2.0.0` | _14px_ | 下拉菜单字体大小 |
| --dropdown-menu-item-title-font-weight `v2.0.0` | _normal_ | 下拉菜单字体粗细 |
| --dropdown-menu-option-active-color | _var(--app-M1, #3678e3)_ | 下拉菜单选中颜色 |
| --dropdown-menu-item-title-line-height `v2.0.0` | _rgba(0,0,0,.05)_ | 下拉菜单分割线颜色 |
| --dropdown-menu-item-first-line-color `v2.0.0` | _rgba(0,0,0,.08)_ | 下拉菜单第一个分割线颜色 |
| --dropdown-menu-item-line-width `v2.0.0` | _1px_ | 下拉菜单第一个分割线高度 |
| --dropdown-menu-item-icon-font-size `v2.0.0` | _28px_ | 下拉菜单右侧图标字体大小 |
| --dropdown-menu-item-title-active-font-weight `v2.0.0` | _500_ | 下拉菜单选中字体粗细 |
## 常见问题
### Dropdown 组件在 Popup 中使用,为什么点击打开下拉选项时,定位出现异常?
DropDown 位于 Popup 节点内,并且 Popup 的 position 设置为 center。由于 center 样式包含 `top: 50% ` 和 `transform: translate3d(-50%,-50%,0)`,导致节点位置计算偏移,从而影响 DropDown 的定位,解决方案是将 Popup 的 position 设置为 bottom 或 top。