• Vant React

DropdownMenu 下拉菜单

介绍

向下弹出的菜单列表。

引入

import { DropdownMenu } from "@taroify/core"

代码演示

基础用法

import { DropdownMenu } from "@taroify/core"

function BasicDropdownMenu() {
  const [options] = useState([
    { title: "默认排序", value: 0 },
    { title: "好评排序", value: 1 },
    { title: "销量排序", value: 2 },
  ])
  return (
    <DropdownMenu>
      <DropdownMenu.Item>
        <DropdownMenu.Option value={0}>全部商品</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>新款商品</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>活动商品</DropdownMenu.Option>
      </DropdownMenu.Item>
      <DropdownMenu.Item options={options} />
    </DropdownMenu>
  )
}

自定义菜单内容

可以通过 DropdownMenu.Item 组件自定义内容。

import { DropdownMenu } from "@taroify/core"
import { Key } from "react"

function DropdownMenuWithCustomContent() {
  const [value, setValue] = useState<Key | false>()
  const [option1, setOption1] = useState(0)
  const [switch1, setSwitch1] = useState(true)
  const [switch2, setSwitch2] = useState(false)
  const [options] = useState([
    {
      title: (
        <View>
          默认<View>排序</View>
        </View>
      ),
      value: 0,
    },
    { title: "好评排序", value: 1 },
    { title: "销量排序", value: 2 },
  ])
  return (
    <DropdownMenu value={value} onChange={setValue}>
      <DropdownMenu.Item
        value={option1}
        onChange={setOption1}
        options={options}
      ></DropdownMenu.Item>
      <DropdownMenu.Item title="筛选">
        <Cell title="包邮" align="center">
          <Switch size="24" checked={switch1} onChange={setSwitch1} />
        </Cell>
        <Cell title="团购" align="center">
          <Switch size="24" checked={switch2} onChange={setSwitch2} />
        </Cell>
        <View style="padding: 5px 16px;">
          <Button color="danger" block shape="round" onClick={() => setValue(false)}>
            确认
          </Button>
        </View>
      </DropdownMenu.Item>
    </DropdownMenu>
  )
}

自定义选中态颜色

通过 css 可以自定义菜单标题和选项的选中态颜色。

import { DropdownMenu } from "@taroify/core"

function DropdownMenuWithCustomColor() {
  return (
    <DropdownMenu className="custom-color">
      <DropdownMenu.Item>
        <DropdownMenu.Option value={0}>全部商品</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>新款商品</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>活动商品</DropdownMenu.Option>
      </DropdownMenu.Item>
      <DropdownMenu.Item>
        <DropdownMenu.Option value={0}>默认排序</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>好评排序</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>销量排序</DropdownMenu.Option>
      </DropdownMenu.Item>
    </DropdownMenu>
  )
}
.custom-color {
  --dropdown-menu-title-active-color: #1989fa;
  --dropdown-menu-option-active-color: #1989fa;
}

向上展开

direction 属性值设置为 up,菜单即可向上展开。

import { DropdownMenu } from "@taroify/core"

function UpDropdownMenu() {
  return (
    <DropdownMenu direction="up">
      <DropdownMenu.Item>
        <DropdownMenu.Option value={0}>全部商品</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>新款商品</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>活动商品</DropdownMenu.Option>
      </DropdownMenu.Item>
      <DropdownMenu.Item>
        <DropdownMenu.Option value={0}>默认排序</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>好评排序</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>销量排序</DropdownMenu.Option>
      </DropdownMenu.Item>
    </DropdownMenu>
  )
}

禁用菜单

import { DropdownMenu } from "@taroify/core"

function DisabledDropdownMenu() {
  return (
    <DropdownMenu>
      <DropdownMenu.Item disabled>
        <DropdownMenu.Option value={0}>全部商品</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>新款商品</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>活动商品</DropdownMenu.Option>
      </DropdownMenu.Item>
      <DropdownMenu.Item disabled>
        <DropdownMenu.Option value={0}>默认排序</DropdownMenu.Option>
        <DropdownMenu.Option value={1}>好评排序</DropdownMenu.Option>
        <DropdownMenu.Option value={2}>销量排序</DropdownMenu.Option>
      </DropdownMenu.Item>
    </DropdownMenu>
  )
}

阻止滑动穿透

在 h5 上设置 lock 即可阻止滑动穿透
若要在微信小程序上支持,还需下面两项设置
1.设置滑动容器高度(—dropdown-menu-item-content-max-height),不设置超长时无法滑动
2.当下拉展开时,禁用外层滑动(通过 PageMeta,或者你包裹的滑动容器),不设置无法阻止下拉反方向的滑动

function BasicDropdownMenu() {
  const [options] = useState(
    [
      { title: "默认排序", value: 0 },
      { title: "好评排序", value: 1 },
      { title: "销量排序", value: 2 },
    ].concat(Array.from({ length: 20 }, (_, i) => ({ title: "选项" + i, value: 3 + i }))),
  )
  const [opened, setOpened] = useState(false)
  const getScrollHeight = useCallback((len) => {
    return len < 5 ? len * 46 : 5 * 46
  }, [])
  return (
    <>
      <PageMeta pageStyle={opened ? "overflow: hidden;" : ""} />
      <DropdownMenu>
        {/* @ts-ignore */}
        <DropdownMenu.Item
          style={{ "--dropdown-menu-item-content-max-height": getScrollHeight(23) + "px" }}
          options={options}
          lock
          onOpen={() => setOpened(true)}
          onClose={() => setOpened(false)}
        />
        {/* @ts-ignore */}
        <DropdownMenu.Item
          style={{ "--dropdown-menu-item-content-max-height": getScrollHeight(4) + "px" }}
          lock
          onOpen={() => setOpened(true)}
          onClose={() => setOpened(false)}
        >
          <DropdownMenu.Option value={0}>全部商品</DropdownMenu.Option>
          <DropdownMenu.Option value={1}>新款商品</DropdownMenu.Option>
          <DropdownMenu.Option value={2}>活动商品</DropdownMenu.Option>
          <DropdownMenu.Option value={3}>活动商品2</DropdownMenu.Option>
        </DropdownMenu.Item>
      </DropdownMenu>
    </>
  )
}

API

参数说明类型默认值
direction菜单展开方向,可选值为upstringdown
backdropType背景板位置,可选值 inner outerstringinner
参数说明类型默认值
defaultValue默认选中项对应的 valueany-
value当前选中项对应的 valueany-
title菜单项标题string当前选中项文字
disabled是否禁用菜单booleanfalse
lock是否锁定背景滚动booleanfalse
options选项数组同下方 DropdownMenu.Option Props-
事件名说明回调参数
onChange点击选项导致 value 变化时触发value: any
onOpen打开菜单栏时触发-
onClose关闭菜单栏时触发-
onOpened打开菜单栏且动画结束后触发-
onClosed关闭菜单栏且动画结束后触发-
键名说明类型
value标识符any
icon左侧图标图片ReactNode
title展示 DropdownMenu 选中的 title 内容ReactNode

主题定制

样式变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件。

名称默认值描述
—dropdown-menu-height48px * $hd-
—dropdown-menu-background-colorvar(—white)-
—dropdown-menu-z-index11-
—dropdown-menu-box-shadow0 2px * $hd 12px * $hd rgba(100, 101, 102, 0.12)-
—dropdown-menu-title-font-size15px * $hd-
—dropdown-menu-title-colorvar(—text-color)-
—dropdown-menu-title-padding0 var(—padding-xs)-
—dropdown-menu-title-line-heightvar(—line-height-lg)-
—dropdown-menu-title-active-opacityvar(—active-opacity)-
—dropdown-menu-title-active-colorvar(—danger-color)-
—dropdown-menu-title-disabled-colorvar(—gray-6)-
—dropdown-menu-item-z-indexcalc(var(—dropdown-menu-z-index) - 1)-
—dropdown-menu-item-content-max-height80%-
—dropdown-menu-item-content-animation-durationvar(—animation-duration-fast)-
—dropdown-menu-option-active-colorvar(—danger-color)-