Categories: Vant3 教程

Vant3 DropdownMenu 下拉菜单

介绍

向下弹出的菜单列表。

实例演示

引入

通过以下方式来全局注册组件,更多注册方式请参考组件注册

import { createApp } from vue;
import { DropdownMenu, DropdownItem } from vant;

const app = createApp();
app.use(DropdownMenu);
app.use(DropdownItem);

代码演示

基础用法

<van-dropdown-menu>
  <van-dropdown-item v-model="state.value1" :options="option1" />
  <van-dropdown-item v-model="state.value2" :options="option2" />
</van-dropdown-menu>
import { reactive } from vue;

export default {
  setup() {
    const state = reactive({
      value1: 0,
      value2: a,
    });
    const option1 = [
      { text: 全部商品, value: 0 },
      { text: 新款商品, value: 1 },
      { text: 活动商品, value: 2 },
    ];
    const option2 = [
      { text: 默认排序, value: a },
      { text: 好评排序, value: b },
      { text: 销量排序, value: c },
    ];

    return {
      state,
      option1,
      option2,
    };
  },
};

自定义菜单内容

通过插槽可以自定义 DropdownItem 的内容,此时需要使用实例上的 toggle 方法手动控制菜单的显示。

<van-dropdown-menu>
  <van-dropdown-item v-model="value" :options="option" />
  <van-dropdown-item title="筛选" ref="item">
    <van-cell center title="包邮">
      <template #right-icon>
        <van-switch v-model="switch1" size="24" active-color="#ee0a24" />
      </template>
    </van-cell>
    <van-cell center title="团购">
      <template #right-icon>
        <van-switch v-model="switch2" size="24" active-color="#ee0a24" />
      </template>
    </van-cell>
    <div style="">
      <van-button type="danger" block round @click="onConfirm">
        确认
      </van-button>
    </div>
  </van-dropdown-item>
</van-dropdown-menu>
import { ref, reactive } from vue;

export default {
  setup() {
    const item = ref(null);
    const state = reactive({
      value: 0,
      switch1: false,
      switch2: false,
    });
    const options = [
      { text: 全部商品, value: 0 },
      { text: 新款商品, value: 1 },
      { text: 活动商品, value: 2 },
    ];
    const onConfirm = () => {
      item.value.toggle();
    };

    return {
      item,
      state,
      options,
      onConfirm,
    };
  },
};

自定义选中态颜色

通过 active-color 属性可以自定义菜单标题和选项的选中态颜色。

<van-dropdown-menu active-color="#1989fa">
  <van-dropdown-item v-model="value1" :options="option1" />
  <van-dropdown-item v-model="value2" :options="option2" />
</van-dropdown-menu>

向上展开

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

<van-dropdown-menu direction="up">
  <van-dropdown-item v-model="value1" :options="option1" />
  <van-dropdown-item v-model="value2" :options="option2" />
</van-dropdown-menu>

禁用菜单

<van-dropdown-menu>
  <van-dropdown-item v-model="value1" disabled :options="option1" />
  <van-dropdown-item v-model="value2" disabled :options="option2" />
</van-dropdown-menu>

API

DropdownMenu Props

参数 说明 类型 默认值
active-color 菜单标题和选项的选中态颜色 string #ee0a24
direction 菜单展开方向,可选值为up string down
z-index 菜单栏 z-index 层级 number | string 10
duration 动画时长,单位秒,设置为 0 可以禁用动画 number | string 0.2
overlay 是否显示遮罩层 boolean true
close-on-click-overlay 是否在点击遮罩层后关闭菜单 boolean true
close-on-click-outside 是否在点击外部元素后关闭菜单 boolean true

DropdownItem Props

参数 说明 类型 默认值
v-model 当前选中项对应的 value number | string
title 菜单项标题 string 当前选中项文字
options 选项数组 Option[] []
disabled 是否禁用菜单 boolean false
lazy-render 是否在首次展开时才渲染菜单内容 boolean true
title-class 标题额外类名 string | Array | object
teleport 指定挂载的节点,等同于 Teleport 组件的 to 属性 string | Element

DropdownItem Events

事件名 说明 回调参数
change 点击选项导致 value 变化时触发 value
open 打开菜单栏时触发
close 关闭菜单栏时触发
opened 打开菜单栏且动画结束后触发
closed 关闭菜单栏且动画结束后触发

DropdownItem Slots

名称 说明
default 菜单内容
title 自定义菜单项标题

DropdownItem 方法

通过 ref 可以获取到 DropdownItem 实例并调用实例方法,详见组件实例方法

方法名 说明 参数 返回值
toggle 切换菜单展示状态,传 true 为显示,false 为隐藏,不传参为取反 show?: boolean

Option 数据结构

键名 说明 类型
text 文字 string
value 标识符 number | string
icon 左侧图标名称或图片链接 string

样式变量

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

名称 默认值 描述
–van-dropdown-menu-height 48px
–van-dropdown-menu-background-color var(–van-white)
–van-dropdown-menu-box-shadow 0 2px 12px fade(var(–van-gray-7), 12)
–van-dropdown-menu-title-font-size 15px
–van-dropdown-menu-title-text-color var(–van-text-color)
–van-dropdown-menu-title-active-text-color var(–van-danger-color)
–van-dropdown-menu-title-disabled-text-color var(–van-gray-6)
–van-dropdown-menu-title-padding 0 var(–van-padding-xs)
–van-dropdown-menu-title-line-height var(–van-line-height-lg)
–van-dropdown-menu-option-active-color var(–van-danger-color)
–van-dropdown-menu-content-max-height 80%
–van-dropdown-item-z-index 10

常见问题

父元素设置 transform 后,下拉菜单的位置错误?

把 DropdownMenu 嵌套在 Tabs 等组件内部使用时,可能会遇到下拉菜单位置错误的问题。这是因为在 Chrome 浏览器中,transform 元素内部的 fixed 布局会降级成 absolute 布局,导致下拉菜单的布局异常。

将 DropdownItem 的 teleport 属性设置为 body 即可避免此问题:

<van-dropdown-menu>
  <van-dropdown-item teleport="body" />
  <van-dropdown-item teleport="body" />
</van-dropdown-menu>
唐伯虎点蚊香

前端小白,想各位学习!

Share
Published by
唐伯虎点蚊香

Recent Posts

聊聊vue3中的defineProps

在Vue 3中,defineP…

1 周 ago

在 Chrome 中删除、允许和管理 Cookie

您可以选择删除现有 Cooki…

2 周 ago

自定义指令:聊聊vue中的自定义指令应用法则

今天我们来聊聊vue中的自定义…

3 周 ago

聊聊Vue中@click.stop和@click.prevent

一起来学下聊聊Vue中@cli…

4 周 ago

Nginx 基本操作:启动、停止、重启命令。

我们来学习Nginx基础操作:…

1 月 ago

Vue3:手动清理keep-alive组件缓存的方法

Vue3中手动清理keep-a…

1 月 ago