介绍

Vant 是有赞前端团队开源的移动端组件库,于 2017 年开源,已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务,对外服务十多万开发者,是业界主流的移动端组件库之一。

目前 Vant 官方提供了 Vue 2 版本Vue 3 版本微信小程序版本,并由社区团队维护  React 版本支付宝小程序版本

特性

  • 提供 60 多个高质量组件,覆盖移动端各类场景
  • 性能极佳,组件平均体积不到 1kb(min+gzip)
  • 单元测试覆盖率 90%+,提供稳定性保障
  • 完善的中英文文档和示例
  • 支持 Vue 2 & Vue 3
  • 支持按需引入
  • 支持主题定制
  • 支持国际化
  • 支持 TypeScript
  • 支持 SSR

快速上手

请参考 快速上手 章节

贡献代码

修改代码请阅读我们的 贡献指南

使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR

浏览器支持

现代浏览器以及 Android 4.0+, iOS 8.0+

加入我们

有赞前端团队是由一群年轻、皮实、对技术饱含热情的小伙伴组成的,目前共有 100 多名前端工程师,分布在业务中台、电商、零售、美业、资产、赋能等业务线。

我们热爱分享和开源,崇尚用工程师的方式解决问题,因此造了很多工具来解决我们遇到的问题,目前我们维护的开源产品有:

我们正在寻找更多优秀的小伙伴,一起拓展前端技术的边界,期待你的加入!

生态

项目描述
vant-demoVant 官方示例合集
vant-weapp微信小程序组件库
vant-cli开箱即用的组件库搭建工具
vant-iconsVant 图标库
vant-touch-emulator在桌面端使用 Vant 的辅助库

社区生态

由社区维护的项目如下,欢迎补充:

项目描述
vant-reactVant React 版
vant-aliappVant 支付宝小程序版
taroifyVant Taro 版

链接

开源协议

本项目基于 MIT 协议,请自由地享受和参与开源


通过 npm 安装

在现有项目中使用 Vant 时,可以通过 ​npm ​或 ​yarn ​进行安装:

# Vue 2 项目,安装 Vant 2:npm i vant -S# Vue 3 项目,安装 Vant 3:npm i vant@next -S

通过 CDN 安装

使用 Vant 最简单的方法是直接在 html 文件中引入 CDN 链接,之后你可以通过全局变量 ​vant ​访问到所有组件。

<!-- 引入样式文件 --><link  rel="stylesheet"  href="https://cdn.jsdelivr.net/npm/vant@next/lib/index.css" rel="external nofollow" target="_blank" /><!-- 引入 Vue 和 Vant 的 JS 文件 --><script src="https://cdn.jsdelivr.net/npm/vue@next" rel="external nofollow" ></script><script src="https://cdn.jsdelivr.net/npm/vant@next/lib/vant.min.js" rel="external nofollow" ></script><script>  // 在 #app 标签下渲染一个按钮组件  const app = Vue.createApp({    template: `<van-button>按钮</van-button>`,  });  app.use(vant);  // 通过 CDN 引入时不会自动注册 Lazyload 组件  // 可以通过下面的方式手动注册  app.use(vant.Lazyload);  // 调用函数组件,弹出一个 Toast  vant.Toast('提示');  app.mount('#app');</script>

你可以通过以下免费 CDN 服务来使用 Vant:

通过脚手架安装

在新项目中使用 Vant 时,推荐使用 Vue 官方提供的脚手架 Vue Cli 创建项目并安装 Vant。

# 安装 Vue Clinpm install -g @vue/cli# 创建一个项目vue create hello-world# 创建完成后,可以通过命令打开图形化界面,如下图所示vue ui

vue图形化界面

在图形化界面中,点击 依赖 -> 安装依赖,然后将 vant 添加到依赖中即可。

示例

示例工程

我们提供了丰富的示例工程,通过示例工程你可以了解如下内容:

  • 基于 Vue Cli 和 Vant 搭建应用
  • 基于 Nuxt 和 Vant 搭建应用
  • 配置按需引入组件
  • 配置基于 Rem 的适配方案
  • 配置基于 Viewport 的适配方案
  • 配置基于 TypeScript 的工程
  • 配置自定义主题色方案

引入组件

方式一. 通过 babel 插件按需引入组件

babel-plugin-import 是一款 babel 插件,它会在编译过程中将 import 语句自动转换为按需引入的方式。

# 安装插件npm i babel-plugin-import -D

在.babelrc 或 babel.config.js 中添加配置:

{  "plugins": [    [      "import",      {        "libraryName": "vant",        "libraryDirectory": "es",        "style": true      }    ]  ]}

接着你可以在代码中直接引入 Vant 组件,插件会自动将代码转化为按需引入的形式。

// 原始代码import { Button } from 'vant';// 编译后代码import Button from 'vant/es/button';import 'vant/es/button/style';
如果你在使用 TypeScript,可以使用 ts-import-plugin 实现按需引入。

方式二. 在 Vite 项目中按需引入组件

对于 vite 项目,可以使用 vite-plugin-style-import 实现按需引入, 原理和 babel-plugin-import 类似。

# 安装插件npm i vite-plugin-style-import -D
// vite.config.jsimport vue from '@vitejs/plugin-vue';import styleImport from 'vite-plugin-style-import';export default {  plugins: [    vue(),    styleImport({      libs: [        {          libraryName: 'vant',          esModule: true,          resolveStyle: (name) => `vant/es/${name}/style`,        },      ],    }),  ],};

方式三. 手动按需引入组件

在不使用插件的情况下,可以手动引入需要使用的组件和样式。

// 引入组件import Button from 'vant/es/button';// 引入组件对应的样式,若组件没有样式文件,则无须引入import 'vant/es/button/style';

方式四. 导入所有组件

Vant 支持一次性导入所有组件,引入所有组件会增加代码包体积,因此不推荐这种做法。

import { createApp } from 'vue';import Vant from 'vant';import 'vant/lib/index.css';const app = createApp();app.use(Vant);
Tips: 配置按需引入后,将不允许直接导入所有组件。

常见问题

如何自定义 Vant 组件的样式?

1. 主题定制

Vant 基于 CSS 变量提供了主题定制的能力,可以对组件样式进行统一修改,详见 ConfigProvider 全局配置 组件。

2. 覆盖默认样式

如果主题定制不能满足你的需求,也可以通过自定义样式类来覆盖默认样式,参考下面的示例:

<template>  <van-button class="my-button">按钮</van-button></template><style>  /** 覆盖 Button 最外层元素的样式 */  .my-button {    width: 200px;  }  /** 覆盖 Button 内部子元素的样式 */  .my-button .van-button__text {    color: red;  }</style>

在 HTML 中无法正确渲染组件?

在 HTML 中使用 Vant 组件时,你可能会碰到部分示例代码无法正确渲染的情况,比如下面的用法:

<van-cell-group>  <van-cell title="单元格" value="内容" />  <van-cell title="单元格" value="内容" /></van-cell-group>

这是因为 HTML 并不支持自闭合的自定义元素,也就是说 <van-cell /> 这样的语法是不被识别的,使用完整的闭合标签可以避免这个问题:

<van-cell-group>  <van-cell title="单元格" value="内容"></van-cell>  <van-cell title="单元格" value="内容"></van-cell></van-cell-group>

在单文件组件、字符串模板和 JSX 中可以使用自闭合的自定义元素,因此不会出现这个问题。


组件注册

Vant 支持多种组件注册方式,请根据实际业务需要进行选择。

全局注册

全局注册后,你可以在 app 下的任意子组件中使用注册的 Vant 组件。

import { Button } from 'vant';import { createApp } from 'vue';const app = createApp();// 方式一. 通过 app.use 注册// 注册完成后,在模板中通过 <van-button> 或 <VanButton> 标签来使用按钮组件app.use(Button);// 方式二. 通过 app.component 注册// 注册完成后,在模板中通过 <van-button> 标签来使用按钮组件app.component(Button.name, Button);

局部注册

局部注册后,你可以在当前组件中使用注册的 Vant 组件。

import { Button } from 'vant';export default {  components: {    [Button.name]: Button,  },};
对于组件注册更详细的介绍,请参考 Vue 官方文档 - 组件注册。

组件插槽

Vant 提供了丰富的组件插槽,通过插槽可以对组件的某一部分进行个性化定制。如果你对 Vue 的插槽不太熟悉,可以阅读 Vue 官方文档中的插槽章节。下面是通过插槽来定制 Checkbox 图标的示例:

<van-checkbox v-model="checked">  <!-- 使用组件提供的 icon 插槽 -->  <!-- 将默认图标替换为个性化图片 -->  <template #icon="props">    <img :src="props.checked ? activeIcon : inactiveIcon" />  </template></van-checkbox>
export default {  data() {    return {      checked: true,      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

组件实例方法

Vant 中的许多组件提供了实例方法,调用实例方法时,我们需要通过 ref 来注册组件引用信息,引用信息将会注册在父组件的$refs对象上。注册完成后,我们可以通过this.$refs.xxx访问到对应的组件实例,并调用上面的实例方法。

<!-- 通过 ref 属性将组件绑定到 this.$refs.checkbox 上 --><van-checkbox v-model="checked" ref="checkbox"> 复选框 </van-checkbox>
export default {  data() {    return {      checked: false,    };  },  // 注意:组件挂载后才能访问到 ref 对象  mounted() {    this.$refs.checkbox.toggle();  },};

浏览器适配

Viewport 布局

Vant 默认使用 px 作为样式单位,如果需要使用 viewport 单位 (vw, vh, vmin, vmax),推荐使用 postcss-px-to-viewport 进行转换。

postcss-px-to-viewport 是一款 PostCSS 插件,用于将 px 单位转化为 vw/vh 单位。

PostCSS PostCSS 示例配置

下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。

// postcss.config.jsmodule.exports = {  plugins: {    'postcss-px-to-viewport': {      viewportWidth: 375,    },  },};
Tips: 在配置 postcss-loader 时,应避免 ignore node_modules 目录,否则将导致 Vant 样式无法被编译。

Rem 布局适配

如果需要使用 rem 单位进行适配,推荐使用以下两个工具:

PostCSS 示例配置

下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。

// postcss.config.jsmodule.exports = {  plugins: {    'postcss-pxtorem': {      rootValue: 37.5,      propList: ['*'],    },  },};

其他设计稿尺寸

如果设计稿的尺寸不是 375,而是 750 或其他大小,可以将 rootValue 配置调整为:

// postcss.config.jsmodule.exports = {  plugins: {    // postcss-pxtorem 插件的版本需要 >= 5.0.0    'postcss-pxtorem': {      rootValue({ file }) {        return file.indexOf('vant') !== -1 ? 37.5 : 75;      },      propList: ['*'],    },  },};

桌面端适配

Vant 是一个面向移动端的组件库,因此默认只适配了移动端设备,这意味着组件只监听了移动端的 touch 事件,没有监听桌面端的 mouse 事件。

如果你需要在桌面端使用 Vant,可以引入我们提供的 @vant/touch-emulator,这个库会在桌面端自动将 mouse 事件转换成对应的 touch 事件,使得组件能够在桌面端使用。

# 安装模块npm i @vant/touch-emulator -S
// 引入模块后自动生效import '@vant/touch-emulator';

底部安全区适配

iPhone X 等机型底部存在底部指示条,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行安全区适配。Vant 中部分组件提供了 safe-area-inset-top 或 safe-area-inset-bottom 属性,设置该属性后,即可在对应的机型上开启适配,如下示例:

<!-- 在 head 标签中添加 meta 标签,并设置 viewport-fit=cover 值 --><meta  name="viewport"  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"/><!-- 开启顶部安全区适配 --><van-nav-bar safe-area-inset-top /><!-- 开启底部安全区适配 --><van-number-keyboard safe-area-inset-bottom />



提示
当前文档为 Vant 3 的更新日志,如需查询 Vant 2 的更新内容,请访问 Vant 2 更新日志

介绍

Vant 遵循 Semver 语义化版本规范。

发布节奏

  • 修订号:每周发布,包含新特性和问题修复。
  • 次版本号:每隔一至二个月发布,包含新特性和较大的功能更新,向下兼容。
  • 主版本号:无固定的发布时间,包含不兼容更新和重大功能更新。

更新内容

v3.1.5

2021-07-26

Feature

  • AddressEdit: 新增 address-edit-button-font-size 样式变量 #9113
  • Icon: 新增 shield-o 图标 #9082
  • Locale: 新增 Russian 俄罗斯语言包 #9088
  • Toast: 优化不可点击状态下的光标展示 #9116
  • Uploader: 新增 click-upload 事件 #9119
  • Uploader: 新增 readonly 属性 #9118

Bug Fixes

  • Icon: 修复 invitation 图标名称拼写错误 #9096
  • NumberKeyboard: 修复点击外部时会触发 close 事件的问题 #9108
  • Search: 修复左侧图标颜色不正确的问题 #9100
  • Tabbar: 修复 tabbar-item-icon-margin-bottom 样式变量名称 #9101

v3.1.4

2021-07-19

Feature

  • ActionSheet: 新增 before-close 属性 #9068
  • Cascader: 新增 option 插槽 #9036
  • Cascader: 优化光标展示 #9032
  • Popup: 新增 before-close 属性 #9067
  • ShareSheet: 新增 before-close 属性 #9068
  • Tabs: 新增 click-tab 事件 #9037

Bug Fixes

  • Field: 修复 label-align 为 right 时 required 标记位置错误的问题 #9035
  • List: 修复在 Tabs 内嵌套使用时,切换 Tabs 不触发 load 事件的问题 #9022
  • Popup: 修复某些情况下未正确触发 open、close 事件的问题 #9065

v3.1.3

2021-07-11

Feature

  • Calendar: 新增 click-subtitle 事件 #8981
  • Calendar: 新增 subtitle 插槽 #8980
  • ConfigProvider: 新增 icon-prefix 属性 #8986
  • Slider: 新增 drag 事件参数 #8990
  • Slider: 新增 left-button、right-button 插槽 #8989
  • touch-emulator: 支持通过白名单排除节点 #8984

Bug Fixes

  • Step: 修复 z-index 过高问题 #9003

v3.1.2

2021-07-03

Feature

  • Area: 新增 toolbar、confirm、cancel 插槽 #8969
  • Calendar: 优化日期较多时的加载性能 #8955
  • Cascader: 新增 disabled 选项 #8952
  • ConfigProvider: 新增 tag 属性 #8967
  • Picker: 新增 toolbar 插槽,将 default 插槽标记为废弃 #8968
  • Picker: 允许 Option 的值为 number 类型 #8951
  • Picker: 新增 picker-option-padding CSS 变量 #8947

Bug Fixes

  • Toast: 修复文字换行问题 #8965

v3.1.1

2021-06-27

Feature

  • Cell: 新增 value 插槽,将 default 插槽标记为废弃 #8933
  • CollapseItem: 新增 label 插槽 #8934
  • NoticeBar: 新增 reset 方法 #8917
  • Tabs: 新增 nav-bottom 插槽 #8915

v3.1.0

2021-06-22

New Component

Feature

  • 所有组件支持 CSS 变量 aef257 fe1cba
  • 新增 primary-color 等样式变量 #8861
  • Checkbox: icon 插槽新增 disabled 参数 #8839
  • Cascader: 新增 className 选项 #8882
  • Cascader: 新增 color 选项 #8883
  • CellGroup: 新增 inset 属性 #8885
  • GridItem: 新增 reverse 属性 #8878
  • IndexBar: 新增 teleport 属性 #8820

Bug Fixes

  • Dialog: 修复 message 作为函数时返回 HTML 字符串无效的问题 #8872
  • Slider: 修复设置 step 属性时,输入值格式化错误的问题 #8893

v3.0.18

2021-06-03

Feature

  • Button: 新增 icon 插槽 #8783
  • CouponList: 新增 list-footer、disabled-list-footer 插槽 #8801
  • Locale: 新增 French 法语语言包 #8795
  • Popup: 新增 icon-prefix 属性 #8793
  • Popup: 新增 overlay-content 插槽 #8794

Bug Fixes

  • Collapse: 修复在 safari 上可能出现渲染异常的问题 #8788
  • NoticeBar: 修复在 Popup 内嵌套使用时播放异常的问题 #8789
  • List: 移除未使用的 @list-icon-margin-right 变量 #8759
  • @vant/touch-emulator: 修复 SSR 时报错的问题 #8767

v3.0.17

2021-05-23

Feature

  • ActionBarIcon: 新增 icon-prefix 属性 #8748
  • Calendar: 新增 over-range 事件 #8739
  • Calendar: 新增 show-range-prompt 属性 #8739
  • Calendar: 新增 top-info、bottom-info 插槽 #8716
  • GridItem: 新增 icon-color 属性 #8753
  • NoticeBar: 默认 speed 由 50 调整为 60 #8694
  • Popover: 新增 icon-prefix 属性 #8703
  • Toast: 新增不同类型 Toast 的 transition 过渡效果 #8743
  • Uploader: max-size 属性支持函数格式 #8744

Bug Fixes

  • Button: 修复 tsx 下使用时缺少 onClick 类型定义的问题 #8665
  • Calendar: 修复默认日期不正确的问题 #8696
  • DatetimePicker: 修复动态设置 minDate、maxDate 时异常的问题 #8658
  • List: 修复在开启 animated 的 Tabs 下使用时加载异常的问题 #8741
  • Tabs: 修复滚动事件监听不正确的问题 #8734
  • Toast: 修复多次调用时持续时间不正确的问题 #8742

v3.0.16

2021-05-03

Feature

  • Swipe: 新增 indicator 插槽的 active 参数 #8645
  • Cascader: 新增 @cascader-header-padding less 变量 #8626
  • Steps: 新增 icon-prefix 属性 #8631
  • 导出更多类型定义 #8652

Bug Fixes

  • Stepper: 修复 blur 事件触发时机 #8620
  • SubmitBar: 修复 @submit-bar-price-font-size 变量不生效的问题 #8639
  • Swipe: 修复在 Popup 内时展示可能不正确的问题 #8643
  • Tabs: 修复在 Popup 内时展示可能不正确的问题 #8642

v3.0.15

2021-04-25

Feature

  • Cascader: 新增 click-tab 事件 #8606

Bug Fixes

  • Tab: 修复 SSR 时报错的问题 #8603
  • Rate: 修复点击半星时未正确选中的问题 #8580
  • Tag: 修复使用 color 和 plain 属性时边框颜色错误的问题 #8601

v3.0.14

2021-04-18

Feature

  • Badge: offset 属性支持传入任意单位 35edb7
  • Rate: 支持在 readonly 时渲染任意小数结果 #8528

Bug Fixes

  • ContactList: 修复 nodes 类型错误 0b764b

v3.0.13

2021-04-11

Feature

  • ActionBar: 新增 @action-bar-icon-background-color 样式变量 #8474
  • Popover: 升级依赖的 @popperjs/core 到 2.9.2 版本 0d1323
  • perf: 优化包体积 ba3e6d

Types

  • Popup: 修复 PopupCloseIconPosition 类型错误 15d901
  • Search: 修复在 tsx 下部分 props 不存在的问题 #8485
  • Stepper: 优化 theme 属性类型定义 #8489

Bug Fixes

  • Field: 修复 autofocus 属性不生效的问题 #8488

v3.0.12

2021-04-05

Feature

  • CollapseItem: 新增 readonly 属性 #8445
  • Field: 新增 clear-icon 属性 #8438
  • Search: 新增 clear-icon 属性 #8439
  • Search: 新增 error-message 属性 #8442
  • Search: 新增 formatter、format-trigger 属性 #8441

Bug Fixes

  • 修复 Webstorm 下组件标签提示不正确的问题 #8450

v3.0.11

2021-03-30

Feature

  • Cascader: 新增 swipeable 属性 #8383
  • Dialog: 新增 footer 插槽 #8382
  • Dialog: 支持在 message 中传入 render 函数 #8420
  • Image: 新增 icon-size 属性 #8395
  • Row: 新增 wrap 属性 #8393

Bug Fixes

  • Field: 修复在个别情况下错误地清除错误提示的问题 #8409
  • Sticky: 修复在 SSR 时提示 Element 不存在的问题 #8407
  • Tabs: 修复在 safari 上左滑退出页面时手势判断错误的问题 #8388

v3.0.10

2021-03-19

Feature

  • ActionSheet: 新增 cancel 插槽 #8333
  • Badge: 新增 show-zero 属性 #8381
  • Cascader: 新增 close-icon 属性 #8334
  • Popover: 新增 close-on-click-overlay 属性 #8351
  • Popover: 新增 duration 属性 #8355
  • Popover: 新增 overlay-class 属性 #8353
  • Popover: 新增 overlay-style 属性 #8354
  • ShareSheet: 新增 cancel 插槽 #8335
  • Sticky: 新增 change event #8374
  • Tag: close 事件新增 event 参数 #8337
  • Toast: 新增 iconSize 选项 #8338

Feature

  • ContactList: 新增 @contact-list-item-radio-icon-color Less 变量 #8322
  • Coupon: 新增 @coupon-corner-checkbox-icon-color Less 变量 #8323
  • List: 新增 @list-loading-icon-size Less 变量 #8365
  • Loading: 新增 @button-loading-icon-size Less 变量 465bf0
  • PullRefresh: 新增 @pull-refresh-loading-icon-size Less 变量 #8366

Bug Fixes

  • Popover: 修复 close-on-click-outside 属性不生效的问题 #8352
  • Swipe: 修复添加 scale 动画时宽度计算错误的问题 #8330

v3.0.9

2021-03-08

Feature

  • AddressList: 新增 tag 插槽 #8292

Bug Fixes

  • 修复主题定制不生效的问题 #8301
  • 修复在 TS 下使用 app.use 注册组件报错的问题 #8308

v3.0.8

2021-03-07

Types

  • 完善所有组件的类型定义 #8264

Feature

  • ImagePreview: 新增 transition 属性 #8275
  • ImagePreview: 新增 overlay-style 属性 #8276
  • Locale: 新增 th-TH 泰语 #8297
  • PullRefresh: 新增 pull-distance 属性 #8280
  • Button: 新增若干个 Less 变量 #8281

Bug Fixes

  • ActionSheet: 修复返回页面时可能错误地重新打开的问题 #8272
  • Stepper: 修复在 iOS14 下禁用时输入框文字不可见的问题 #8277
  • Swipe: 修复动态插入轮播图时渲染错误的问题 #8288

v3.0.7

2021-02-28

Feature

  • Notify: 新增 lockScroll 选项 #8168
  • Popup: click-overlay 事件新增 Event 参数 #8107
  • ShareSheet: 新增 overlay-style 属性 #8225
  • ShareSheet: 新增 overlay-class 属性 #8225
  • Step: 新增 finish-icon 插槽 #8241
  • Steps: 新增 finish-icon 属性 #8103
  • Uploader: 新增 @uploader-mask-text-color 样式变量 #8064

perf

  • 包体积优化:调整适配的浏览器版本,与 Vue 3 保持一致 #8227

Bug Fixes

  • ActionSheet: 修复 safe-area-inset-bottom 属性不生效的问题 #8085
  • DateTimePicker: 修复 v-model 为 null 时初始值不正确的问题 #8193
  • Form: 修复提交表单时可能滚动到错误的表单项的问题 #8159
  • ImagePreview: 修复第二次调用时可能出现渲染不正确的问题 #8060
  • IndexBar: 修复初始化时激活的锚点未正确渲染的问题 #8164
  • Popup: 修复动态设置 lock-scroll 属性不生效的问题 #8169
  • Swipe: 修复初始化时 active 值可能错误的问题 #8061
  • SwipeCell: 修复点击外部时 click 事件参数不正确的问题 #8108
  • Tabbar: 修复 name 为 0 时激活的选项可能不正确的问题 #8125
  • Tabs: 修复 v-model 为 0 时激活的标签页可能不正确的问题 #8074
  • Toast: 修复 SSR 时可能报错的问题 #8214

v3.0.6

2021-01-31

Feature

  • Area: 支持超过 6 位的地区码 #8001
  • Form: show-error 属性的默认值调整为 false #8016
  • Form: 支持在 validator 中返回错误提示 #8052
  • NumberKeyboard: 新增 blur-on-close 属性 #8033
  • Popover: 新增 click-overlay 事件 #8050
  • Popover: 支持在 action 选项对象中配置 color 字段 #8049
  • Sticky: 新增 position、offset-bottom 属性 #7979

Bug Fixes

  • Button: 修复加载状态下会触发表单提交的问题 #8018
  • Calendar: 修复无法使用 scrollToDate 方法的问题 #7983
  • Empty: 修复 linearGradient id 可能导致冲突的问题 #8013
  • Toast: 修复 closeOnClickOverlay 设置为 true 不生效的问题 #8044

v3.0.5

2021-01-24

Feature

  • Badge: 新增 offset 属性 e0b463
  • Calendar: reset 方法支持重置到指定日期 #7966
  • Icons: 新增 wechat 图标, 重命名原 wechat 图标为 wechat-pay b3cd8c
  • ImagePreview: 调用 swipeTo 方法后自动重置缩放状态 #7972
  • ImagePreview: 调整 swipeDuration 的默认值为 300ms #7970
  • ShareSheet: 新增 wechat-moments 朋友圈图标 ca66fb
  • Slider: 新增 readonly 属性 4cd991

style

  • ShareSheet: 更新 qrcode 图标 32a08b
  • TreeSelect: 新增右侧选项点击反馈 bada31

Bug Fixes

  • Calendar: 修复调用 reset 方法时未重置到默认日期的问题 #7967
  • Dialog: 修复切换 allowHtml 时 message 渲染不正确的问题 #7968
  • ImagePreview: 修复 scale 事件的 index 参数为 undefined 的问题 #7971

v3.0.4

2021-01-17

Feature

  • Cascader: 新增 field-names 属性,用于自定义字段名 #7933
  • Cell: 支持在设置 is-link 时将 clickable 设置为 false 来禁用点击状态 #7923
  • DropdownItem: 支持传入数组或对象格式的 title-class #7926
  • Popup: 支持传入数组或对象格式的 overlay-class #7924
  • Toast: 新增 overlayClass 选项 #7925
  • Toast: 新增 overlayStyle 选项 #7898

Bug Fixes

  • AddressEdit: 修复无法调用 setAreaCode 方法的问题 6a184f
  • Circle: 修复渐变色不生效的问题 #7909
  • NumberKeyboard: 修复 delete、extra-key 插槽不生效的问题 52a0e5
  • Search: 修复控制台存在 update:modelValue warning 的问题 #7872
  • Swipe: 修复页面隐藏时未暂停自动轮播的问题 1c428f

v3.0.3

2021-01-10

Feature

  • Field: 新增 autocomplate 属性 #7877

Bug Fixes

  • Area: 修复无法调用 getValues 方法的问题 03c7b4
  • ImagePreview: 修复 close-on-popstate 属性不生效的问题 #7880
  • List: 修复更新 error 属性后未触发位置检查的问题 b79c32

v3.0.2

2021-01-02

Feature

  • Calendar: 新增 scrollToDate 方法 #7847
  • Form: 新增 disabled 属性 #7830
  • Form: 新增 readonly 属性 #7830
  • Loading: 新增 text-color 属性 #7806
  • Picker: 新增 columns-field-names 属性 #7791
  • NumberKeyboard: 新增 random-key-order 属性 #7841

Bug Fixes

  • Calendar: 修复 title 插槽不生效的问题 #7826
  • Calendar: 修复动态设置 defaultDate 不生效的问题 #7815
  • Popup: 修复组件销毁时未解除滚动锁定的问题 #7835
  • Stepper: 修复动态设置 modelValue 时未格式化的问题 81494d

v3.0.1

2020-12-27

Feature

  • Form: valdiate 方法支持校验多个表单项 #7810
  • Form: resetValidation 方法支持重置多个表单项 #7811
  • Stepper: 新增 show-input 属性,用于控制是否显示输入框 #7812
  • IndexBar: 新增 scrollTo 方法 #7794

Bug Fixes

  • Cascader: 修复动画闪烁的问题 #7802
  • CountDown: 修复 SSR 过程中内存泄露的问题 #7808
  • Image: 修复 SSR 时提示 DOM 不匹配的问题 #7822
  • Popup: 修复滚动穿透的问题 #7738
  • Stepper: 修复 change 事件重复触发的问题 #7820
  • Swipe: 修复 SSR 样式不正确的问题 #7821
  • Swipe: 修复在 keepalive 标签内使用时显示不正确的问题 #7772

v3.0.0

2020-12-23

更新内容

请参考 Vant 3.0 正式发布:全面拥抱 Vue 3

v3.0.0-rc.4

2020-12-21

New Component

  • 新增 Cascader 级联选择组件 #7771

cascader级联选择组件

Feature

  • Stepper: 新增 show-input 属性 #7785
  • uploader: 支持在 fileList 的选项中单独配置 imageFit deletable previewSize beforeDelete 字段 #7731

Types

  • Lazyload: 修复类型定义错误 #7757

v3.0.0-rc.3

2020-12-10

Breaking Change

  • Stepper: async-change 属性重命名为 before-change,并调整使用方法 e026d2

perf

  • Stepper: 优化代码包体积 #7675

Bug Fixes

  • Stepper: 修复禁用按钮仍然能点击的问题 c27760
  • Tabs: 修复动态设置 active 值无效的问题 #7717
  • 包含 v2.11.3 版本的所有改动和修复

v3.0.0-rc.2

2020-12-04

perf

  • 优化包体积大小 #7675

Bug Fixes

  • Lazyload: 修复未导出 ESModule 的问题 #7685
  • NumberKeyboard: 修复 hide-on-click-outside 属性不生效的问题 #7668 #7667
  • Uploader: 修复动态修改 status 不生效的问题 #7681
  • Types: 修复 teleport 类型定义错误的问题 #7687
  • 包含 v2.11.2 版本的所有改动和修复

v3.0.0-rc.1

2020-12-01

Breaking Change

  • Popover: trigger 属性的默认值调整为 click 1699d9

Feature

  • Lazyload: 适配 Vue 3 d3ca40
  • 包含 v2.11.1 版本的所有改动和修复

style

  • Circle: 新增 @circle-color Less 变量 1a6cf6
  • Circle: 新增 @circle-layer-color Less 变量 65a5ed
  • Circle: 新增 @circle-size Less 变量 b57f7e
  • IndexBar: 默认高亮颜色调整为红色 65b680 87b0a0
  • IndexBar: 右边距调整为 8px aad055

Bug Fixes

  • Image: 修复 lazy-load 属性不生效的问题 0ba818
  • Lazyload: 修复类型定义错误的问题 d0c4c2
  • Popup: 修复 transition-appear 属性不生效的问题 dd6930

v3.0.0-beta.10

2020-11-22

Bug Fixes

  • Radio: 修复 Radio 无法操作的问题 0f7c9a

v3.0.0-beta.9

2020-11-22

New Component

气泡弹出框

Feature

  • Search: 新增 blur 方法 d26282
  • Search: 新增 focus 方法 2833bc

Bug Fixes

  • Checkbox: 修复 bind-group 属性不生效的问题 #7447
  • Badge: 修复无类型定义的问题 c487b3
  • 包含 v2.11.0 版本的所有改动和修复

v3.0.0-beta.8

2020-11-15

Bug Fixes

  • ActionSheet: 修复选项禁用或加载时仍能点击的问题 996598
  • ActionSheet: 修复 callback 选项不生效的问题 27b761
  • Calendar: 修复 default-date 为 null 时渲染失败的问题 #7519
  • DatetimePicker: 修复 DOM 上渲染多余属性的问题 ed332d
  • NoticeBar: 修复初始化逻辑执行多次的问题 0712d9
  • Swipe: 修复在 lazy-render 模式下渲染失败的问题 e06ba4
  • Swipe: 修复初始化逻辑执行多次的问题 c94173
  • Tabs: 修复初始化逻辑执行多次的问题 599e81
  • 包含 v2.10.14 版本的所有改动和修复

v3.0.0-beta.7

2020-11-08

Bug Fixes

  • Calendar: 修复动态设置 minDate 和 maxDate 时展示错误的问题 #7412
  • DropdownMenu: 修复无法禁用 closeOnClickOutside 属性的问题 #7473
  • Uploader: 修复在 before-read 返回 true 无效的问题 #7493
  • Uploader: 修复在 delete 事件中无法获取 index 的问题 #7481
  • 包含 v2.10.13 版本的所有改动和修复

v3.0.0-beta.6

2020-11-01

Bug Fixes

  • Swipe: 修复开启 lazy-render 且 loop 为 false 时渲染节点不正确的问题 #7465
  • Swipe: 修复开启 lazy-render 时子节点被重复挂载的问题 #7466
  • Tabs: 修复初始动画错误的问题 49e877
  • ActionBar: 修复类型定义不存在的问题 #7440 #7442
  • 包含 v2.10.12 版本的所有改动和修复

v3.0.0-beta.5

2020-10-24

Bug Fixes

  • Swipe: 修复动态插入轮播时无法滚动的问题 #7366
  • Toast: 修复 forbidClick 属性不生效的问题 #7396
  • Toast: 修复 duration 变化未生效的问题 #7394
  • 包含 v2.10.11 版本的所有改动和修复

v3.0.0-beta.4

2020-10-18

refactor

  • Layout: 默认使用 flex 布局,移除 type 属性 f7a120

style

  • Stepper: 布局方式调整为 inline-block e9c282

Bug Fixes

  • ContactList: 修复 select 事件重复触发的问题 1dd408
  • Search: 修复布局错误的问题 9cd48e
  • Image: 修复图片加载错误时仍会渲染图片节点的问题 59fb1d
  • Pagination: 修复 change 事件触发时机错误的问题 346035
  • Toast: 修复展示时会锁定滚动的问题 a622ca
  • 包含 v2.10.10 版本的所有改动和修复

v3.0.0-beta.3

2020-10-03

breaking changes

  • Checkbox: 在 Cell 内部使用时,现在需要手动添加 @click.stop 来阻止事件冒泡 #7023

Feature

  • 新增 Badge 徽标组件 #6573
  • Tab: 增加滑动切换动画 #1174
  • 包含 v2.10.9 版本的所有改动和修复

v3.0.0-beta.2

2020-09-28

Bug Fixes

  • 修复引入 Vant 时提示 'global is not defined' 的问题 7007fc

v3.0.0-beta.1

2020-09-28

breaking changes

  • DatetimePicker: change 事件的第一个参数调整为当前选中值 058665

refactor

使用 Composition API 重构以下组件:

Feature

  • Locale: 新增德语语言包 #7245
  • Pagination: 新增多个插槽 #7222

Bug Fixes

  • Picker: 修复 setIndex 方法无效的问题 d2a542
  • Dialog: 修复最小高度错误的问题 bf1f0f
  • 包含 v2.10.8 版本的所有改动和修复

v3.0.0-beta.0

2020-09-18

breaking changes

  • Dialog: allow-html 属性的默认值调整为 false 02c7a7
  • Picker: allow-html 属性的默认值调整为 false 02c7a7

refactor

使用 Composition API 重构以下组件:

Bug Fixes

  • AddressEdit: 修复 emits 未声明导致 warning 的问题 1e6a12
  • AddressEdit: 修复点击省市区弹窗的蒙层时无法关闭的问题 02e89a
  • Field: 修复在 iOS 上中文输入过程中触发 input 事件的问题 #7035
  • 包含 v2.10.7 版本的所有改动和修复

v3.0.0-alpha.5

2020-09-13

breaking changes

  • Button: native-type 属性的默认值调整为 button df8059

refactor

使用 Composition API 重构以下组件:

Feature

  • Button: 新增 icon-position 属性 #7174
  • slider: 新增 range 属性,支持范围选择 #7175
  • TabbarItem: 新增 @tabbar-item-active-background-color 变量 #7162

Bug Fixes

  • Sticky: 修复组件销毁时报错的问题 #7169

v3.0.0-alpha.4

2020-09-06

breaking changes

  • Dialog: before-close 属性用法调整,不再传入 done 函数,而是通过返回 Promise 来控制
  • SwipeCell: before-close 属性不再传入组件实例
  • ImagePreview: 移除 async-close 属性,新增 before-close 属性

refactor

使用 Composition API 重构以下组件:

Bug Fixes

  • Tag: 修复 color 属性不生效的问题 4b6da2
  • 修复在 TSX 中使用组件时提示类型错误的问题 #7076
  • 修复全量引入组件时提示类型错误的问题 #7056

v3.0.0-alpha.3

2020-09-01

Feature

  • ActionSheet: 新增 description 插槽 

    升级步骤

    1. 升级 Vue 3

    Vant 3 是基于 Vue 3 开发的,在使用 Vant 3 前,请将项目中的 Vue 升级到 3.0 以上版本。

    2. 处理不兼容更新

    Vant 2 到 Vant 3 存在一些不兼容更新,请仔细阅读下方的不兼容更新内容,并依次处理。

    不兼容更新

    组件命名调整

    GoodsAction 商品导航组件重命名为 ActionBar 行动栏。

    <!-- Vant 2 --><van-goods-action>  <van-goods-action-icon text="图标" />  <van-goods-action-button text="按钮" /></van-goods-action><!-- Vant 3 --><van-action-bar>  <van-action-bar-icon text="图标" />  <van-action-bar-button text="按钮" /></van-action-bar>

    废弃组件

    移除 SwitchCell 组件,可以直接使用 Cell 和 Switch 组件代替。

    <!-- Vant 2 --><van-switch-cell title="标题" v-model="checked" /><!-- Vant 3 --><van-cell center title="标题">  <template #right-icon>    <van-switch v-model="checked" size="24" />  </template></van-cell>

    弹窗型组件 v-model 变更

    为了适配 Vue 3 的 v-model API 用法变更,所有提供 v-model 属性的组件在用法上有一定调整。以下弹窗类组件的 v-model 被重命名为 v-model:show:

    • ActionSheet
    • Calendar
    • Dialog
    • ImagePreview
    • Notify
    • Popover
    • Popup
    • ShareSheet
    <!-- Vant 2 --><van-popup v-model="show" /><!-- Vant 3 --><van-popup v-model:show="show" />

    表单型组件 v-model 内部值变更

    以下表单型组件 v-model 对应的 prop 重命名为 modelValue,event 重命名为 update:modelValue:

    • Checkbox
    • CheckboxGroup
    • DatetimePicker
    • DropdownItem
    • Field
    • Radio
    • RadioGroup
    • Search
    • Stepper
    • Switch
    • Sidebar
    • Uploader
    <!-- Vant 2 --><van-field :value="value" @input="onInput" /><!-- Vant 3 --><van-field :model-value="value" @update:model-value="onInput" />

    其他 v-model 调整

    • Circle: v-model 重命名为 v-model:currentRate
    • CouponList: v-model 重命名为 v-model:code
    • List: v-model 重命名为 v-model:loading,error.sync 重命名为 v-model:error
    • Tabs: v-model 重命名为 v-model:active
    • TreeSelect: active-id.sync 重命名为 v-model:active-id
    • TreeSelect: main-active-index.sync 重命名为 v-model:main-active-index

    徽标属性命名调整

    在之前的版本中,我们通过 info 属性来展示图标右上角的徽标信息,为了更符合社区的命名习惯,我们将这个属性重命名为 badge,影响以下组件:

    • Tab
    • Icon
    • GridItem
    • TreeSelect
    • TabbarItem
    • SidebarItem
    • GoodsActionIcon

    同时内部使用的 Info 组件也会重命名为 Badge。

    <!-- Vant 2 --><van-icon info="5" /><!-- Vant 3 --><van-icon badge="5" />

    重命名 get-container 属性

    Vue 3.0 中增加了 Teleport 组件,提供将组件渲染到任意 DOM 位置的能力,Vant 2 也通过 get-container 属性提供了类似的能力。为了与官方的 API 保持一致,Vant 中的 get-container 属性将重命名为 teleport。

    <!-- Vant 2 --><template>  <van-popup get-container="body" />  <van-popup :get-container="getContainer" /></template><script>  export default {    methods: {      getContainer() {        return document.querySelector('#container');      },    },  };</script><!-- Vant 3 --><template>  <van-popup teleport="body" />  <van-popup :teleport="container" /></template><script>  export default {    beforeCreate() {      this.container = document.querySelector('#container');    },  };</script>

    API 调整

    Area

    • change 事件参数不再传入组件实例

    Button

    • 蓝色按钮对应的类型由 info 调整为 primary
    • 绿色按钮对应的类型由 primary 调整为 success
    • native-type 的默认值由 submit 调整为 button

    Checkbox

    • 在 Cell 内部使用时,现在需要手动添加 @click.stop 来阻止事件冒泡

    Dialog

    • 默认关闭 allow-html 属性
    • before-close 属性用法调整,不再传入 done 函数,而是通过返回 Promise 来控制

    DatetimePicker

    • change 事件参数不再传入组件实例

    ImagePreview

    • 移除 async-close 属性,可以使用新增的 before-close 属性代替

    Picker

    • change 事件参数不再传入组件实例
    • 默认关闭 allow-html 属性
    • 默认开启 show-toolbar 属性
    • 级联选择下,confirm、change 事件返回的回调参数将包含为完整的选项对象。

    Popover

    • trigger 属性的默认值调整为 click

    Stepper

    • async-change 属性重命名为 before-change,并调整使用方法

    SwipeCell

    • open 事件的 detail 参数重命名为 name
    • on-close 属性重命名为 before-close,并调整参数结构
    • before-close 属性不再传入组件实例

    Toast

    • mask 属性重命名为 overlay

    TreeSelect

    • navclick 事件重命名为 click-nav
    • itemclick 事件重命名为 click-item

    注册全局方法

    Vant 2 中默认提供了 $toast、$dialog 等全局方法,但 Vue 3.0 不再支持直接在 Vue 的原型链上挂载方法,因此从 Vant 3.0 开始,使用全局方法前必须先通过 app.use 将组件注册到对应的 app 上。

    import { Toast, Dialog, Notify } from 'vant';// 将 Toast 等组件注册到 app 上app.use(Toast);app.use(Dialog);app.use(Notify);// app 内的子组件可以直接调用 $toast 等方法export default {  mounted() {    this.$toast('提示文案');  },};


    介绍

    感谢你使用 Vant。

    以下是关于向 Vant 提交反馈或代码的指南。在向 Vant 提交 issue 或者 PR 之前,请先花几分钟时间阅读以下文字。

    Issue 规范

    • 遇到问题时,请先确认这个问题是否已经在 issue 中有记录或者已被修复
    • 提 issue 时,请用简短的语言描述遇到的问题,并添加出现问题时的环境和复现步骤

    参与开发

    本地开发

    按照下面的步骤操作,即可在本地开发 Vant 组件。

    # 克隆仓库# 默认为 dev 分支,包含 Vant 3 的代码# 如果需要在 Vant 2 上进行更改,请基于 2.x 分支进行开发git clone git@github.com:youzan/vant.git# 安装依赖cd vant && yarn# 进入开发模式,浏览器访问 http://localhost:8080npm run dev

    目录结构

    项目的主要目录结构如下所示:

    vant├─ docs            # 文档├─ packages        # 基础包├─ src             # 组件源代码├─ test            # 单测工具类└─ vant.config.js  # 文档网站配置

    组件代码位于 src 目录下,每个组件一个独立的文件夹。

    组件目录结构

    添加新组件时,请按照下面的目录结构组织文件,并在 vant.config.js 中配置组件名称。

    src└─ button   ├─ demo             # 示例代码   ├─ test             # 单元测试   ├─ Component.ts     # 组件   ├─ index.ts         # 组件入口   ├─ index.less       # 样式   ├─ var.less         # 样式变量   ├─ README.md        # 英文文档   └─ README.zh-CN.md  # 中文文档

    提交 PR

    Pull Request 规范

    如果你是第一次在 GitHub 上提 Pull Request ,可以阅读下面这两篇文章来学习:

    规范

    • 如果遇到问题,建议保持你的 PR 足够小。保证一个 PR 只解决一个问题或只添加一个功能
    • 当新增组件或者修改原有组件时,记得增加或者修改测试代码,保证代码的稳定
    • 在 PR 中请添加合适的描述,并关联相关的 Issue

    Pull Request 流程

    1. fork 主仓库,如果已经 fork 过,请同步主仓库的最新代码
    2. 基于 fork 后仓库的 dev 分支新建一个分支,比如 feature/button_color
    3. 在新分支上进行开发,开发完成后,提 Pull Request 到主仓库的 dev 分支
    4. Pull Request 会在 Review 通过后被合并到主仓库
    5. 等待 Vant 发布版本,一般是每周一次

    同步最新代码

    提 Pull Request 前,请依照下面的流程同步主仓库的最新代码:

    # 添加主仓库到 remote,作为 fork 后仓库的上游仓库git remote add upstream https://github.com/youzan/vant.git# 拉取主仓库最新代码git fetch upstream# 切换至 dev 分支git checkout dev# 合并主仓库代码git merge upstream/dev


    介绍

    Vant 是基于有赞 Zan Design System 视觉规范实现的组件库,在这里可以下载 Vant 的设计资源。

    设计稿

    组件设计稿(Sketch)

    包含 Sketch 格式的色彩规范、字体规范、组件设计规范。

    色彩规范

    字体规范

    组件规范

    下载

    图标设计稿(Sketch)

    包含 Sketch 格式的图标库资源。

    下载

    在线资源

    Vant 的所有图标都托管在 iconfont.cn 上,点此查看:Vant 图标库

    Axure 元件库

    Axure 元件库,由社区的 @axure-tczy 同学贡献。

    下载


    介绍

    在参与 Vant 开发时,请遵守约定的单文件组件风格指南,指南内容节选自 Vue 官方风格指南

    组件数据

    组件的 data 必须是一个函数。

    // badexport default {  data: {    foo: 'bar',  },};// goodexport default {  data() {    return {      foo: 'bar',    };  },};

    单文件组件文件名称

    单文件组件的文件名应该要么始终是单词大写开头 (PascalCase),要么始终是横线连接 (kebab-case)。

    // badmycomponent.vuemyComponent.vue// goodmy-component.vueMyComponent.vue

    紧密耦合的组件名

    和父组件紧密耦合的子组件应该以父组件名作为前缀命名。

    // badcomponents/|- TodoList.vue|- TodoItem.vue└─ TodoButton.vue// goodcomponents/|- TodoList.vue|- TodoListItem.vue└─ TodoListItemButton.vue

    自闭合组件

    在单文件组件中没有内容的组件应该是自闭合的。

    <!-- bad --><my-component></my-component><!-- good --><my-component />

    Prop 名大小写

    在声明 prop 的时候,其命名应该始终使用 camelCase,而在模板中应该始终使用 kebab-case。

    // badexport default {  props: {    'greeting-text': String,  },};// goodexport default {  props: {    greetingText: String,  },};
    <!-- bad --><welcome-message greetingText="hi" /><!-- good --><welcome-message greeting-text="hi" />

    指令缩写

    指令缩写,用 : 表示 v-bind: ,用 @ 表示 v-on:

    <!-- bad --><input v-bind:value="value" v-on:input="onInput" /><!-- good --><input :value="value" @input="onInput" />

    Props 顺序

    标签的 Props 应该有统一的顺序,依次为指令、属性和事件。

    <my-component  v-if="if"  v-show="show"  v-model="value"  ref="ref"  :key="key"  :text="text"  @input="onInput"  @change="onChange"/>

    组件选项的顺序

    组件选项应该有统一的顺序。

    export default {  name: '',  components: {},  props: {},  emits: [],  setup() {},  data() {},  computed: {},  watch: {},  created() {},  mounted() {},  unmounted() {},  methods: {},};

    组件选项中的空行

    组件选项较多时,建议在属性之间添加空行。

    export default {  computed: {    formattedValue() {      // ...    },    styles() {      // ...    },  },  methods: {    onInput() {      // ...    },    onChange() {      // ...    },  },};

    单文件组件顶级标签的顺序

    单文件组件应该总是让顶级标签的顺序保持一致,且标签之间留有空行。

    <template> ... </template><script>  /* ... */</script><style>  /* ... */</style>


    介绍

    Vant 采用中文作为默认语言,同时支持多语言切换,请按照下方教程进行国际化设置。

    使用方法

    多语言切换

    Vant 通过 Locale 组件实现多语言支持,使用 Locale.use 方法可以切换当前使用的语言。

    import { Locale } from 'vant';// 引入英文语言包import enUS from 'vant/es/locale/lang/en-US';Locale.use('en-US', enUS);

    覆盖语言包

    通过 Locale.add 方法可以实现文案的修改和扩展,示例如下:

    import { Locale } from 'vant';const messages = {  'zh-CN': {    vanPicker: {      confirm: '关闭', // 将'确认'修改为'关闭'    },  },};Locale.add(messages);

    语言包

    目前支持的语言:

    语言文件名
    简体中文zh-CN
    繁體中文(港)zh-HK
    繁體中文(台)zh-TW
    德语de-DE
    德语 (正式)de-DE-formal
    英语en-US
    西班牙语es-ES
    日语ja-JP
    挪威语nb-NO
    罗马尼亚语ro-RO
    俄罗斯语ru-RU
    土耳其语tr-TR
    泰语th-TH
    法语fr-FR
    在 这里 查看所有的语言包源文件。

    常见问题

    找不到所需的语言包?

    如果上方列表中没有你需要的语言,欢迎给我们提 Pull Request 来增加新的语言包,改动内容可以参考增加德语语言包 的 PR。

    业务代码如何实现国际化?

    可以使用 vue-i18n 来实现。

    以 CDN 形式引入时,如何使用语言包?

    目前没有提供 CDN 形式的语言包,可以手动拷贝语言包的内容来使用。

    语言包中不包含 Sku 组件?

    语言包中默认不包含 Sku 业务组件的语言配置,因此如果有 Sku 组件的国际化需求,请自行配置国际化文案。


    介绍

    按钮用于触发一个操作,如提交表单。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Button } from 'vant';const app = createApp();app.use(Button);

    代码演示

    按钮类型

    按钮支持 default、primary、success、warning、danger 五种类型,默认为 default。

    五种按钮类型

    <van-button type="primary">主要按钮</van-button><van-button type="success">成功按钮</van-button><van-button type="default">默认按钮</van-button><van-button type="warning">警告按钮</van-button><van-button type="danger">危险按钮</van-button>

    朴素按钮

    通过 plain 属性将按钮设置为朴素按钮,朴素按钮的文字为按钮颜色,背景为白色。

    朴素按钮

    <van-button plain type="primary">朴素按钮</van-button><van-button plain type="primary">朴素按钮</van-button>

    细边框

    设置 hairline 属性可以展示 0.5px 的细边框。

    细边框按钮

    <van-button plain hairline type="primary">细边框按钮</van-button><van-button plain hairline type="primary">细边框按钮</van-button>

    禁用状态

    通过 disabled 属性来禁用按钮,禁用状态下按钮不可点击。

    禁用状态

    <van-button disabled type="primary">禁用状态</van-button><van-button disabled type="primary">禁用状态</van-button>

    加载状态

    通过 loading 属性设置按钮为加载状态,加载状态下默认会隐藏按钮文字,可以通过 loading-text 设置加载状态下的文字。

    加载状态

    <van-button loading type="primary" /><van-button loading type="primary" loading-type="spinner" /><van-button loading type="primary" loading-text="加载中..." />

    按钮形状

    通过 square 设置方形按钮,通过 round 设置圆形按钮。

    按钮形状

    <van-button square type="primary">方形按钮</van-button><van-button round type="primary">圆形按钮</van-button>

    图标按钮

    通过 icon 属性设置按钮图标,支持 Icon 组件里的所有图标,也可以传入图标 URL。

    图标按钮

    <van-button icon="plus" type="primary" /><van-button icon="plus" type="primary">按钮</van-button><van-button icon="https://img.yzcdn.cn/vant/user-active.png" type="primary">  按钮</van-button>

    按钮尺寸

    支持 large、normal、small、mini 四种尺寸,默认为 normal。

    按钮尺寸

    <van-button type="primary" size="large">大号按钮</van-button><van-button type="primary" size="normal">普通按钮</van-button><van-button type="primary" size="small">小型按钮</van-button><van-button type="primary" size="mini">迷你按钮</van-button>

    块级元素

    按钮在默认情况下为行内块级元素,通过 block 属性可以将按钮的元素类型设置为块级元素。

    块级元素

    <van-button type="primary" block>块级元素</van-button>

    页面导航

    可以通过 url 属性进行 URL 跳转,或通过 to 属性进行路由跳转。

    页面导航

    <van-button type="primary" url="/vant/mobile.html">URL 跳转</van-button><van-button type="primary" to="index">路由跳转</van-button>

    自定义颜色

    通过 color 属性可以自定义按钮的颜色。

    自定义颜色

    <van-button color="#7232dd">单色按钮</van-button><van-button color="#7232dd" plain>单色按钮</van-button><van-button color="linear-gradient(to right, #ff6034, #ee0a24)">  渐变色按钮</van-button>

    API

    Props

    参数说明类型默认值
    type类型,可选值为 primary success warning dangerstringdefault
    size尺寸,可选值为 large small ministringnormal
    text按钮文字string-
    color按钮颜色,支持传入 linear-gradient 渐变色string-
    icon左侧图标名称或图片链接string-
    icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
    icon-position图标展示位置,可选值为 rightstringleft
    tag按钮根节点的 HTML 标签stringbutton
    native-type原生 button 标签的 type 属性stringbutton
    block是否为块级元素booleanfalse
    plain是否为朴素按钮booleanfalse
    square是否为方形按钮booleanfalse
    round是否为圆形按钮booleanfalse
    disabled是否禁用按钮booleanfalse
    hairline是否使用 0.5px 边框booleanfalse
    loading是否显示为加载状态booleanfalse
    loading-text加载状态提示文字string-
    loading-type加载图标类型,可选值为 spinnerstringcircular
    loading-size加载图标大小string20px
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse

    Events

    事件名说明回调参数
    click点击按钮,且按钮状态不为加载或禁用时触发event: MouseEvent
    touchstart开始触摸按钮时触发event: TouchEvent

    Slots

    名称说明
    default按钮内容
    icon v3.0.18自定义图标
    loading自定义加载图标

    主题定制

    样式变量

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

    名称默认值描述
    --van-button-mini-height24px-
    --van-button-mini-padding0 var(--van-padding-base)-
    --van-button-mini-font-sizevar(--van-font-size-xs)-
    --van-button-small-height32px-
    --van-button-small-padding0 var(--van-padding-xs)-
    --van-button-small-font-sizevar(--van-font-size-sm)-
    --van-button-normal-font-sizevar(--van-font-size-md)-
    --van-button-normal-padding0 15px-
    --van-button-large-height50px-
    --van-button-default-height44px-
    --van-button-default-line-height1.2-
    --van-button-default-font-sizevar(--van-font-size-lg)-
    --van-button-default-colorvar(--van-text-color)-
    --van-button-default-background-colorvar(--van-white)-
    --van-button-default-border-colorvar(--van-border-color)-
    --van-button-primary-colorvar(--van-white)-
    --van-button-primary-background-colorvar(--van-primary-color)-
    --van-button-primary-border-colorvar(--van-primary-color)-
    --van-button-success-colorvar(--van-white)-
    --van-button-success-background-colorvar(--van-success-color)-
    --van-button-success-border-colorvar(--van-success-color)-
    --van-button-danger-colorvar(--van-white)-
    --van-button-danger-background-colorvar(--van-danger-color)-
    --van-button-danger-border-colorvar(--van-danger-color)-
    --van-button-warning-colorvar(--van-white)-
    --van-button-warning-background-colorvar(--van-orange)-
    --van-button-warning-border-colorvar(--van-orange)-
    --van-button-border-widthvar(--van-border-width-base)-
    --van-button-border-radiusvar(--van-border-radius-sm)-
    --van-button-round-border-radiusvar(--van-border-radius-max)-
    --van-button-plain-background-colorvar(--van-white)-
    --van-button-disabled-opacityvar(--van-disabled-opacity)-
    --van-button-icon-size1.2em-
    --van-button-loading-icon-size20px-



    介绍

    单元格为列表中的单个展示项。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Cell, CellGroup } from 'vant';const app = createApp();app.use(Cell);app.use(CellGroup);

    代码演示

    基础用法

    Cell 可以单独使用,也可以与 CellGroup 搭配使用,CellGroup 可以为 Cell 提供上下外边框。

    基础用法

    <van-cell-group>  <van-cell title="单元格" value="内容" />  <van-cell title="单元格" value="内容" label="描述信息" /></van-cell-group>

    卡片风格

    通过 CellGroup 的 inset 属性,可以将单元格转换为圆角卡片风格(从 3.1.0 版本开始支持)。

    卡片风格

    <van-cell-group inset>  <van-cell title="单元格" value="内容" />  <van-cell title="单元格" value="内容" label="描述信息" /></van-cell-group>

    单元格大小

    通过 size 属性可以控制单元格的大小。

    单元格大小

    <van-cell title="单元格" value="内容" size="large" /><van-cell title="单元格" value="内容" size="large" label="描述信息" />

    展示图标

    通过 icon 属性在标题左侧展示图标。

    展示图标

    <van-cell title="单元格" icon="location-o" />

    只设置 value

    只设置 value 时,内容会靠左对齐。

    只设置value

    <van-cell value="内容" />

    展示箭头

    设置 is-link 属性后会在单元格右侧显示箭头,并且可以通过 arrow-direction 属性控制箭头方向。

    展示箭头

    <van-cell title="单元格" is-link /><van-cell title="单元格" is-link value="内容" /><van-cell title="单元格" is-link arrow-direction="down" value="内容" />

    页面导航

    可以通过 url 属性进行 URL 跳转,或通过 to 属性进行路由跳转。

    页面导航

    <van-cell title="URL 跳转" is-link url="/vant/mobile.html" /><van-cell title="路由跳转" is-link to="index" />

    分组标题

    通过 CellGroup 的 title 属性可以指定分组标题。

    分组标题

    <van-cell-group title="分组1">  <van-cell title="单元格" value="内容" /></van-cell-group><van-cell-group title="分组2">  <van-cell title="单元格" value="内容" /></van-cell-group>

    使用插槽

    如以上用法不能满足你的需求,可以使用插槽来自定义内容。

    使用插槽

    <van-cell value="内容" is-link>  <!-- 使用 title 插槽来自定义标题 -->  <template #title>    <span class="custom-title">单元格</span>    <van-tag type="danger">标签</van-tag>  </template></van-cell><van-cell title="单元格" icon="shop-o">  <!-- 使用 right-icon 插槽来自定义右侧图标 -->  <template #right-icon>    <van-icon name="search" class="search-icon" />  </template></van-cell><style>  .custom-title {    margin-right: 4px;    vertical-align: middle;  }  .search-icon {    font-size: 16px;    line-height: inherit;  }</style>

    垂直居中

    通过 center 属性可以让 Cell 的左右内容都垂直居中。

    垂直居中

    <van-cell center title="单元格" value="内容" label="描述信息" />

    API

    CellGroup Props

    参数说明类型默认值
    title分组标题string-
    inset v3.1.0是否展示为圆角卡片风格booleanfalse
    border是否显示外边框booleantrue

    Cell Props

    参数说明类型默认值
    title左侧标题number | string-
    value右侧内容number | string-
    label标题下方的描述信息string-
    size单元格大小,可选值为 largestring-
    icon左侧图标名称或图片链接string-
    icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
    border是否显示内边框booleantrue
    replace是否在跳转时替换当前页面历史booleanfalse
    clickable是否开启点击反馈booleannull
    is-link是否展示右侧箭头并开启点击反馈booleanfalse
    required是否显示表单必填星号booleanfalse
    center是否使内容垂直居中booleanfalse
    arrow-direction箭头方向,可选值为 left up downstringright
    title-style左侧标题额外样式string | Array | object-
    title-class左侧标题额外类名string | Array | object-
    value-class右侧内容额外类名string | Array | object-
    label-class描述信息额外类名string | Array | object-

    Cell Events

    事件名说明回调参数
    click点击单元格时触发event: MouseEvent

    CellGroup Slots

    名称说明
    default默认插槽
    title自定义分组标题

    Cell Slots

    名称说明
    title自定义左侧标题
    value v3.1.1自定义右侧内容
    label自定义标题下方的描述信息
    icon自定义左侧图标
    right-icon自定义右侧图标
    extra自定义单元格最右侧的额外内容

    主题定制

    样式变量

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

    名称默认值描述
    --van-cell-font-sizevar(--van-font-size-md)-
    --van-cell-line-height24px-
    --van-cell-vertical-padding10px-
    --van-cell-horizontal-paddingvar(--van-padding-md)-
    --van-cell-text-colorvar(--van-text-color)-
    --van-cell-background-colorvar(--van-white)-
    --van-cell-border-colorvar(--van-border-color)-
    --van-cell-active-colorvar(--van-active-color)-
    --van-cell-required-colorvar(--van-danger-color)-
    --van-cell-label-colorvar(--van-gray-6)-
    --van-cell-label-font-sizevar(--van-font-size-sm)-
    --van-cell-label-line-heightvar(--van-line-height-sm)-
    --van-cell-label-margin-topvar(--van-padding-base)-
    --van-cell-value-colorvar(--van-gray-6)-
    --van-cell-icon-size16px-
    --van-cell-right-icon-colorvar(--van-gray-6)-
    --van-cell-large-vertical-paddingvar(--van-padding-sm)-
    --van-cell-large-title-font-sizevar(--van-font-size-lg)-
    --van-cell-large-label-font-sizevar(--van-font-size-md)-
    --van-cell-group-background-colorvar(--van-white)-
    --van-cell-group-title-colorvar(--van-gray-6)-
    --van-cell-group-title-paddingvar(--van-padding-md) var(--van-padding-md) var(--van-padding-xs)-
    --van-cell-group-title-font-sizevar(--van-font-size-md)-
    --van-cell-group-title-line-height16px-
    --van-cell-group-inset-padding0 var(--van-padding-md)-
    --van-cell-group-inset-border-radiusvar(--van-border-radius-lg)-
    --van-cell-group-inset-title-paddingvar(--van-padding-md) var(--van-padding-md) var(--van-padding-xs) var(--van-padding-xl)-


    介绍

    用于配置 Vant 组件的主题样式,从 3.1.0 版本开始支持。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ConfigProvider } from 'vant';const app = createApp();app.use(ConfigProvider);

    定制主题

    介绍

    Vant 组件通过丰富的 CSS 变量 来组织样式,通过覆盖这些 CSS 变量,可以实现定制主题、动态切换主题等效果。

    ConfigProvider

    示例

    以 Button 组件为例,查看组件的样式,可以看到 .van-button--primary 类名上存在以下变量:

    .van-button--primary {  color: var(--van-button-primary-color);  background-color: var(--van-button-primary-background-color);}

    这些变量的默认值被定义在 root 节点上,HTML 文档的任何节点都可以访问到这些变量:

    :root {  --van-white: #fff;  --van-blue: #1989fa;  --van-button-primary-color: var(--van-white);  --van-button-primary-background-color: var(--van-primary-color);}

    自定义 CSS 变量

    通过 CSS 覆盖

    你可以直接在代码中覆盖这些 CSS 变量,Button 组件的样式会随之发生改变:

    /* 添加这段样式后,Primary Button 会变成红色 */:root {  --van-button-primary-background-color: red;}

    通过 ConfigProvider 覆盖

    ConfigProvider 组件提供了覆盖 CSS 变量的能力,你需要在根节点包裹一个 ConfigProvider 组件,并通过 theme-vars 属性来配置一些主题变量。

    <van-config-provider :theme-vars="themeVars">  <van-form>    <van-field name="rate" label="评分">      <template #input>        <van-rate v-model="rate" />      </template>    </van-field>    <van-field name="slider" label="滑块">      <template #input>        <van-slider v-model="slider" />      </template>    </van-field>    <div style="margin: 16px">      <van-button round block type="primary" native-type="submit">        提交      </van-button>    </div>  </van-form></van-config-provider>
    import { ref } from 'vue';export default {  setup() {    const rate = ref(4);    const slider = ref(50);    // themeVars 内的值会被转换成对应 CSS 变量    // 比如 sliderBarHeight 会转换成 `--van-slider-bar-height`    const themeVars = {      rateIconFullColor: '#07c160',      sliderBarHeight: '4px',      sliderButtonWidth: '20px',      sliderButtonHeight: '20px',      sliderActiveBackgroundColor: '#07c160',      buttonPrimaryBorderColor: '#07c160',      buttonPrimaryBackgroundColor: '#07c160',    };    return {      rate,      slider,      themeVars,    };  },};
    注意:ConfigProvider 仅影响它的子组件的样式,不影响全局 root 节点。

    基础变量

    Vant 中的 CSS 变量分为 基础变量 和 组件变量。组件变量会继承基础变量,因此在修改基础变量后,会影响所有相关的组件。

    修改变量

    由于 CSS 变量继承机制的原因, 两者的修改方式有一定差异:

    • 基础变量只能通过 root 选择器 修改,不能通过 ConfigProvider 组件 修改。
    • 组件变量可以通过 root 选择器 和 ConfigProvider 组件 修改。

    变量列表

    下面是所有的基础变量:

    // Color Palette--van-black: #000;--van-white: #fff;--van-gray-1: #f7f8fa;--van-gray-2: #f2f3f5;--van-gray-3: #ebedf0;--van-gray-4: #dcdee0;--van-gray-5: #c8c9cc;--van-gray-6: #969799;--van-gray-7: #646566;--van-gray-8: #323233;--van-red: #ee0a24;--van-blue: #1989fa;--van-orange: #ff976a;--van-orange-dark: #ed6a0c;--van-orange-light: #fffbe8;--van-green: #07c160;// Gradient Colors--van-gradient-red: linear-gradient(to right, #ff6034, #ee0a24);--van-gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);// Component Colors--van-primary-color: var(--van-blue);--van-success-color: var(--van-green);--van-danger-color: var(--van-red);--van-warning-color: var(--van-orange);--van-text-color: var(--van-gray-8);--van-active-color: var(--van-gray-2);--van-active-opacity: 0.7;--van-disabled-opacity: 0.5;--van-background-color: var(--van-gray-1);--van-background-color-light: #fafafa;--van-text-link-color: #576b95;// Padding--van-padding-base: 4px;--van-padding-xs: 8px;--van-padding-sm: 12px;--van-padding-md: 16px;--van-padding-lg: 24px;--van-padding-xl: 32px;// Font--van-font-size-xs: 10px;--van-font-size-sm: 12px;--van-font-size-md: 14px;--van-font-size-lg: 16px;--van-font-weight-bold: 500;--van-line-height-xs: 14px;--van-line-height-sm: 18px;--van-line-height-md: 20px;--van-line-height-lg: 22px;--van-base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue',  Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB',  'Microsoft Yahei', sans-serif;--van-price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue,  Arial, sans-serif;// Animation--van-animation-duration-base: 0.3s;--van-animation-duration-fast: 0.2s;--van-animation-timing-function-enter: ease-out;--van-animation-timing-function-leave: ease-in;// Border--van-border-color: var(--van-gray-3);--van-border-width-base: 1px;--van-border-radius-sm: 2px;--van-border-radius-md: 4px;--van-border-radius-lg: 8px;--van-border-radius-max: 999px;

    你可以在各个组件文档底部的表格中查看组件变量。

    API

    Props

    参数说明类型默认值
    theme-vars自定义主题变量object-
    tag v3.1.2根节点对应的 HTML 标签名stringdiv
    icon-prefix v3.1.3所有图标的类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon


    介绍

    基于字体的图标集,可以通过 Icon 组件使用,也可以在其他组件中通过 icon 属性引用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Icon } from 'vant';const app = createApp();app.use(Icon);

    代码演示

    基础用法

    通过 name 属性来指定需要使用的图标,Vant 内置了一套图标库(见右侧示例),可以直接传入对应的名称来使用。

    基础使用

    <van-icon name="chat-o" />

    使用图片 URL

    你也可以直接在 name 属性中传入一个图片 URL 来作为图标。

    <van-icon name="https://b.yzcdn.cn/vant/icon-demo-1126.png" />

    徽标提示

    设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

    徽标提示

    <van-icon name="chat-o" dot /><van-icon name="chat-o" badge="9" /><van-icon name="chat-o" badge="99+" />

    图标颜色

    通过 color 属性来设置图标的颜色。

    图标颜色

    <van-icon name="cart-o" color="#1989fa" /><van-icon name="fire-o" color="#ee0a24" />

    图标大小

    通过 size 属性来设置图标的尺寸大小,可以指定任意 CSS 单位。

    图标大小

    <!-- 不指定单位,默认使用 px --><van-icon name="chat-o" size="40" /><!-- 指定使用 rem 单位 --><van-icon name="chat-o" size="3rem" />

    自定义图标

    如果需要在现有 Icon 的基础上使用更多图标,可以引入第三方 iconfont 对应的字体文件和 CSS 文件,之后就可以在 Icon 组件中直接使用。

    /* 引入第三方或自定义的字体图标样式 */@font-face {  font-family: 'my-icon';  src: url('./my-icon.ttf') format('truetype');}.my-icon {  font-family: 'my-icon';}.my-icon-extra::before {  content: 'e626';}
    <!-- 通过 class-prefix 指定类名为 my-icon --><van-icon class-prefix="my-icon" name="extra" />

     https://vant-contrib.gitee.io/vant/v3/mobile.html#/zh-CN/icon有vant的默认自带的图标可供选用!

    API

    Props

    参数说明类型默认值
    name图标名称或图片链接string-
    dot是否显示图标右上角小红点booleanfalse
    badge图标右上角徽标的内容number | string-
    color图标颜色stringinherit
    size图标大小,如 20px 2em,默认单位为 pxnumber | stringinherit
    class-prefix类名前缀,用于使用自定义图标stringvan-icon
    tag根节点对应的 HTML 标签名stringi

    Events

    事件名说明回调参数
    click点击图标时触发event: MouseEvent


    介绍

    增强版的 img 标签,提供多种图片填充模式,支持图片懒加载、加载中提示、加载失败提示。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Image as VanImage } from 'vant';const app = createApp();app.use(VanImage);

    代码演示

    基础用法

    基础用法与原生 img 标签一致,可以设置 src、width、height、alt 等原生属性。

    基础用法

    <van-image width="100" height="100" src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  />

    填充模式

    通过 fit 属性可以设置图片填充模式,可选值见下方表格。

    填充模式

    <van-image  width="10rem"  height="10rem"  fit="contain"  src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" />

    圆形图片

    通过 round 属性可以设置图片变圆,注意当图片宽高不相等且 fit 为 contain 或 scale-down 时,将无法填充一个完整的圆形。

    圆形图片

    <van-image  round  width="10rem"  height="10rem"  src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" />

    图片懒加载

    设置 lazy-load 属性来开启图片懒加载,需要搭配 Lazyload 组件使用。

    <van-image  width="100"  height="100"  lazy-load  src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" />
    import { createApp } from 'vue';import { Lazyload } from 'vant';const app = createApp();app.use(Lazyload);

    加载中提示

    Image 组件提供了默认的加载中提示,支持通过 loading 插槽自定义内容。

    加载中提示

    <van-image src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >  <template v-slot:loading>    <van-loading type="spinner" size="20" />  </template></van-image>

    加载失败提示

    Image 组件提供了默认的加载失败提示,支持通过 error 插槽自定义内容。

    加载失败提示

    <van-image src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >  <template v-slot:error>加载失败</template></van-image>

    API

    Props

    参数说明类型默认值
    src图片链接string-
    fit图片填充模式stringfill
    alt替代文本string-
    width宽度,默认单位为 pxnumber | string-
    height高度,默认单位为 pxnumber | string-
    radius圆角大小,默认单位为 pxnumber | string0
    round是否显示为圆形booleanfalse
    lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
    show-error是否展示图片加载失败提示booleantrue
    show-loading是否展示图片加载中提示booleantrue
    error-icon失败时提示的图标名称或图片链接stringphoto-fail
    loading-icon加载时提示的图标名称或图片链接stringphoto
    icon-size v3.0.11加载图标和失败图标的大小number | string32px
    icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon

    图片填充模式

    名称含义
    contain保持宽高缩放图片,使图片的长边能完全显示出来
    cover保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边
    fill拉伸图片,使图片填满元素
    none保持图片原有尺寸
    scale-down取 none 或 contain 中较小的一个

    Events

    事件名说明回调参数
    click点击图片时触发event: MouseEvent
    load图片加载完毕时触发-
    error图片加载失败时触发-

    Slots

    名称说明
    default自定义图片下方的内容
    loading自定义加载中的提示内容
    error自定义加载失败时的提示内容

    主题定制

    样式变量

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

    名称默认值描述
    --van-image-placeholder-text-colorvar(--van-gray-6)-
    --van-image-placeholder-font-sizevar(--van-font-size-md)-
    --van-image-placeholder-background-colorvar(--van-background-color)-
    --van-image-loading-icon-size32px-
    --van-image-loading-icon-colorvar(--van-gray-4)-
    --van-image-error-icon-size32px-
    --van-image-error-icon-colorvar(--van-gray-4)-

    常见问题

    如何引用本地图片?

    在 .vue 文件中通过相对路径引用本地图片时,需要在图片的链接外包上一层 require(),将图片 URL 转换为 webpack 模块请求,并结合 file-loader 或者 url-loader 进行处理。

    <!-- 错误写法 --><van-image src="./image.png" /><!-- 正确写法 --><van-image :src="require('./image.png')" />    
    对此更详细的解释可以参考 vue-loader 的处理资源路径章节。

    使用 image 标签无法渲染?

    使用 Image 组件时,可能会遇到将 <image> 作为标签名时无法渲染的问题,比如下面的写法:

    <template>  <image src="xxx" /></template><script>import { Image } from 'vant';export default {  components: {    Image,  },};<script>

    这是因为 <image> 标签是原生的 SVG 标签,Vue 不允许将原生标签名注册为组件名,使用 <van-image> 即可规避这个问题。


    介绍

    Layout 提供了 van-row 和 van-col 两个组件来进行行列布局。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Col, Row } from 'vant';const app = createApp();app.use(Col);app.use(Row);

    代码演示

    基础用法

    Layout 组件提供了 24列栅格,通过在 Col 上添加 span 属性设置列所占的宽度百分比。此外,添加 offset 属性可以设置列的偏移宽度,计算方式与 span 相同。

    基础用法

    <van-row>  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col></van-row><van-row>  <van-col span="4">span: 4</van-col>  <van-col span="10" offset="4">offset: 4, span: 10</van-col></van-row><van-row>  <van-col offset="12" span="12">offset: 12, span: 12</van-col></van-row>

    设置列元素间距

    通过 gutter 属性可以设置列元素之间的间距,默认间距为 0。

    设置列元素间距

    <van-row gutter="20">  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col></van-row>

    对齐方式

    通过 justify 属性可以设置主轴上内容的对齐方式,等价于 flex 布局中的 justify-content 属性。

    对其方式

    <!-- 居中 --><van-row justify="center">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row><!-- 右对齐 --><van-row justify="end">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row><!-- 两端对齐 --><van-row justify="space-between">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row><!-- 每个元素的两侧间隔相等 --><van-row justify="space-around">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row>

    API

    Row Props

    参数说明类型默认值
    gutter列元素之间的间距(单位为 px)number | string-
    tag自定义元素标签stringdiv
    justify主轴对齐方式,可选值为 end center
    space-around space-between
    stringstart
    align交叉轴对齐方式,可选值为 center bottomstringtop
    wrap v3.0.11是否自动换行booleantrue

    Col Props

    参数说明类型默认值
    span列元素宽度number | string-
    offset列元素偏移距离number | string-
    tag自定义元素标签stringdiv

    Row Events

    事件名说明回调参数
    click点击时触发event: MouseEvent

    Col Events

    事件名说明回调参数
    click点击时触发event: MouseEvent


    介绍

    弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Popup } from 'vant';const app = createApp();app.use(Popup);

    代码演示

    基础用法

    通过 v-model:show 控制弹出层是否展示。

    基础用法

    <van-cell is-link @click="showPopup">展示弹出层</van-cell><van-popup v-model:show="show">内容</van-popup>
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const showPopup = () => {      show.value = true;    };    return {      show,      showPopup,    };  },};

    弹出位置

    通过 position 属性设置弹出位置,默认居中弹出,可以设置为 top、bottom、left、right。

    弹出位置

    <van-popup v-model:show="show" position="top" :style="{ height: '30%' }" />

    关闭图标

    设置 closeable 属性后,会在弹出层的右上角显示关闭图标,并且可以通过 close-icon 属性自定义图标,使用 close-icon-position 属性可以自定义图标位置。

    关闭图标

    <van-popup  v-model:show="show"  closeable  position="bottom"  :style="{ height: '30%' }"/><!-- 自定义图标 --><van-popup  v-model:show="show"  closeable  close-icon="close"  position="bottom"  :style="{ height: '30%' }"/><!-- 图标位置 --><van-popup  v-model:show="show"  closeable  close-icon-position="top-left"  position="bottom"  :style="{ height: '30%' }"/>

    圆角弹窗

    设置 round 属性后,弹窗会根据弹出位置添加不同的圆角样式。

    圆角弹窗

    <van-popup  v-model:show="show"  round  position="bottom"  :style="{ height: '30%' }"/>

    指定挂载位置

    弹出层默认挂载到组件标签所在位置,可以通过 teleport 属性指定挂载位置。

    指定挂载位置

    <!-- 挂载到 body 节点下 --><van-popup v-model:show="show" teleport="body" /><!-- 挂载到 #app 节点下 --><van-popup v-model:show="show" teleport="#app" /><!-- 挂载到指定的元素下 --><van-popup v-model:show="show" :teleport="myContainer" />
    export default {  setup() {    const myContainer = document.querySelector('.my-container');    return {      myContainer,    };  },};

    API

    Props

    参数说明类型默认值
    v-model:show是否显示弹出层booleanfalse
    overlay是否显示遮罩层booleantrue
    position弹出位置,可选值为 top bottom right leftstringcenter
    overlay-class自定义遮罩层类名string | Array | object-
    overlay-style自定义遮罩层样式object-
    duration动画时长,单位秒number | string0.3
    round是否显示圆角booleanfalse
    lock-scroll是否锁定背景滚动booleantrue
    lazy-render是否在显示弹层时才渲染节点booleantrue
    close-on-popstate是否在页面回退时自动关闭booleanfalse
    close-on-click-overlay是否在点击遮罩层后关闭booleantrue
    closeable是否显示关闭图标booleanfalse
    close-icon关闭图标名称或图片链接stringcross
    close-icon-position关闭图标位置,可选值为 top-left
    bottom-left bottom-right
    stringtop-right
    before-close v3.1.4关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-
    icon-prefix v3.0.18图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
    transition动画类名,等价于 transition 的 name 属性string-
    transition-appear是否在初始渲染时启用过渡动画booleanfalse
    teleport指定挂载的节点string | Element-
    safe-area-inset-bottom是否开启底部安全区适配booleanfalse

    Events

    事件名说明回调参数
    click点击弹出层时触发event: MouseEvent
    click-overlay点击遮罩层时触发event: MouseEvent
    click-close-icon点击关闭图标时触发event: MouseEvent
    open打开弹出层时触发-
    close关闭弹出层时触发-
    opened打开弹出层且动画结束后触发-
    closed关闭弹出层且动画结束后触发-

    Slots

    名称说明
    default弹窗内容
    overlay-content v3.0.18遮罩层的内容

    主题定制

    样式变量

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

    名称默认值描述
    --van-popup-background-colorvar(--van-white)-
    --van-popup-transitiontransform var(--van-animation-duration-base)-
    --van-popup-round-border-radius16px-
    --van-popup-close-icon-size22px-
    --van-popup-close-icon-colorvar(--van-gray-5)-
    --van-popup-close-icon-active-colorvar(--van-gray-6)-
    --van-popup-close-icon-margin16px-
    --van-popup-close-icon-z-index1-


    介绍

    Vant 中默认包含了一些常用样式,可以直接通过 className 的方式使用。

    实例演示

    文字省略

    当文本内容长度超过容器最大宽度时,自动省略多余的文本。

    <!-- 最多显示一行 --><div class="van-ellipsis">这是一段最多显示一行的文字,多余的内容会被省略</div><!-- 最多显示两行 --><div class="van-multi-ellipsis--l2">  这是一段最多显示两行的文字,多余的内容会被省略</div><!-- 最多显示三行 --><div class="van-multi-ellipsis--l3">  这是一段最多显示三行的文字,多余的内容会被省略</div>

    1px 边框

    为元素添加 Retina 屏幕下的 1px 边框(即 hairline),基于伪类 transform 实现。

    <!-- 上边框 --><div class="van-hairline--top"></div><!-- 下边框 --><div class="van-hairline--bottom"></div><!-- 左边框 --><div class="van-hairline--left"></div><!-- 右边框 --><div class="van-hairline--right"></div><!-- 上下边框 --><div class="van-hairline--top-bottom"></div><!-- 全边框 --><div class="van-hairline--surround"></div>

    底部安全区

    为元素添加底部安全区适配。

    <div class="van-safe-area-bottom"></div>

    动画

    可以通过 transition 组件使用内置的动画类。

    <!-- 淡入 --><transition name="van-fade">  <div v-show="visible">Fade</div></transition><!-- 上滑进入 --><transition name="van-slide-up">  <div v-show="visible">Slide Up</div></transition><!-- 下滑进入 --><transition name="van-slide-down">  <div v-show="visible">Slide Down</div></transition><!-- 左滑进入 --><transition name="van-slide-left">  <div v-show="visible">Slide Left</div></transition><!-- 右滑进入 --><transition name="van-slide-right">  <div v-show="visible">Slide Right</div></transition>


    介绍

    在页面中间弹出黑色半透明提示,用于消息通知、加载提示、操作结果提示等场景。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Toast } from 'vant';const app = createApp();app.use(Toast);

    代码演示

    文字提示

    基础用法

    Toast('提示内容');

    加载提示

    使用 Toast.loading 方法展示加载提示,通过 forbidClick 属性可以禁用背景点击。

    Toast.loading({  message: '加载中...',  forbidClick: true,});

    成功/失败提示

    使用 Toast.success 方法展示成功提示,使用 Toast.fail 方法展示失败提示。

    Toast.success('成功文案');Toast.fail('失败文案');

    自定义图标

    通过 icon 选项可以自定义图标,支持传入图标名称或图片链接,通过loadingType 属性可以自定义加载图标类型。

    自定义

    Toast({  message: '自定义图标',  icon: 'like-o',});Toast({  message: '自定义图片',  icon: 'https://img.yzcdn.cn/vant/logo.png',});Toast.loading({  message: '加载中...',  forbidClick: true,  loadingType: 'spinner',});

    自定义位置

    Toast 默认渲染在屏幕正中位置,通过 position 属性可以控制 Toast 展示的位置。

    自定义位置

    Toast({  message: '顶部展示',  position: 'top',});Toast({  message: '底部展示',  position: 'bottom',});

    动态更新提示

    执行 Toast 方法时会返回对应的 Toast 实例,通过修改实例上的 message 属性可以实现动态更新提示的效果。

    动态更新

    const toast = Toast.loading({  duration: 0,  forbidClick: true,  message: '倒计时 3 秒',});let second = 3;const timer = setInterval(() => {  second--;  if (second) {    toast.message = `倒计时 ${second} 秒`;  } else {    clearInterval(timer);    Toast.clear();  }}, 1000);

    全局方法

    通过 app.use 全局注册 Toast 组件后,会自动在 app 的所有子组件上挂载 $toast 方法,便于在组件内调用。

    export default {  mounted() {    this.$toast('提示文案');  },};
    Tips: 由于 setup 选项中无法访问 this,因此不能使用上述方式,请通过 import 引入。

    单例模式

    Toast 默认采用单例模式,即同一时间只会存在一个 Toast,如果需要在同一时间弹出多个 Toast,可以参考下面的示例:

    Toast.allowMultiple();const toast1 = Toast('第一个 Toast');const toast2 = Toast.success('第二个 Toast');toast1.clear();toast2.clear();

    修改默认配置

    通过 Toast.setDefaultOptions 函数可以全局修改 Toast 的默认配置。

    Toast.setDefaultOptions({ duration: 2000 });Toast.setDefaultOptions('loading', { forbidClick: true });Toast.resetDefaultOptions();Toast.resetDefaultOptions('loading');

    API

    方法

    方法名说明参数返回值
    Toast展示提示options | messagetoast 实例
    Toast.loading展示加载提示options | messagetoast 实例
    Toast.success展示成功提示options | messagetoast 实例
    Toast.fail展示失败提示options | messagetoast 实例
    Toast.clear关闭提示clearAll: booleanvoid
    Toast.allowMultiple允许同时存在多个 Toast-void
    Toast.setDefaultOptions修改默认配置,对所有 Toast 生效。
    传入 type 可以修改指定类型的默认配置
    type | optionsvoid
    Toast.resetDefaultOptions重置默认配置,对所有 Toast 生效。
    传入 type 可以重置指定类型的默认配置
    typevoid

    Options

    参数说明类型默认值
    type提示类型,可选值为 loading success
    fail html
    stringtext
    position位置,可选值为 top bottomstringmiddle
    message文本内容,支持通过 换行string''
    icon自定义图标,支持传入图标名称或图片链接string-
    iconSize图标大小,如 20px 2em,默认单位为 pxnumber | string36px
    iconPrefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
    overlay是否显示背景遮罩层booleanfalse
    forbidClick是否禁止背景点击booleanfalse
    closeOnClick是否在点击后关闭booleanfalse
    closeOnClickOverlay是否在点击遮罩层后关闭booleanfalse
    loadingType加载图标类型, 可选值为 spinnerstringcircular
    duration展示时长(ms),值为 0 时,toast 不会消失number2000
    className自定义类名string | Array | object-
    overlayClass v3.0.4自定义遮罩层类名string | Array | object-
    overlayStyle v3.0.4自定义遮罩层样式object-
    onOpened完全展示后的回调函数Function-
    onClose关闭时的回调函数Function-
    transition动画类名,等价于 transition 的name属性stringvan-fade
    teleport指定挂载的节点,用法示例string | Elementbody

    主题定制

    样式变量

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

    名称默认值描述
    --van-toast-max-width70%-
    --van-toast-font-sizevar(--van-font-size-md)-
    --van-toast-text-colorvar(--van-white)-
    --van-toast-loading-icon-colorvar(--van-white)-
    --van-toast-line-heightvar(--van-line-height-md)-
    --van-toast-border-radiusvar(--van-border-radius-lg)-
    --van-toast-background-colorfade(var(--van-black), 70%)-
    --van-toast-icon-size36px-
    --van-toast-text-min-width96px-
    --van-toast-text-paddingvar(--van-padding-xs) var(--van-padding-sm)-
    --van-toast-default-paddingvar(--van-padding-md)-
    --van-toast-default-width88px-
    --van-toast-default-min-height88px-
    --van-toast-position-top-distance20%-
    --van-toast-position-bottom-distance20%-


    介绍

    日历组件用于选择日期或日期区间。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Calendar } from 'vant';const app = createApp();app.use(Calendar);

    代码演示

    选择单个日期

    下面演示了结合单元格来使用日历组件的用法,日期选择完成后会触发 confirm 事件。

    选择单个日期

    <van-cell title="选择单个日期" :value="date" @click="show = true" /><van-calendar v-model:show="show" @confirm="onConfirm" />
    import { ref } from 'vue';export default {  setup() {    const date = ref('');    const show = ref(false);    const formatDate = (date) => `${date.getMonth() + 1}/${date.getDate()}`;    const onConfirm = (value) => {      show.value = false;      date.value = formatDate(value);    };    return {      date,      show,      onConfirm,    };  },};

    选择多个日期

    设置 type 为 multiple 后可以选择多个日期,此时 confirm 事件返回的 date 为数组结构,数组包含若干个选中的日期。

    选择多个日期

    <van-cell title="选择多个日期" :value="text" @click="show = true" /><van-calendar v-model:show="show" type="multiple" @confirm="onConfirm" />
    import { ref } from 'vue';export default {  setup() {    const text = ref('');    const show = ref(false);    const onConfirm = (dates) => {      show.value = false;      text.value = `选择了 ${dates.length} 个日期`;    };    return {      text,      show,      onConfirm,    };  },};

    选择日期区间

    设置 type 为 range 后可以选择日期区间,此时 confirm 事件返回的 date 为数组结构,数组第一项为开始时间,第二项为结束时间。

    选择日期区间

    <van-cell title="选择日期区间" :value="date" @click="show = true" /><van-calendar v-model:show="show" type="range" @confirm="onConfirm" />
    import { ref } from 'vue';export default {  setup() {    const date = ref('');    const show = ref(false);    const formatDate = (date) => `${date.getMonth() + 1}/${date.getDate()}`;    const onConfirm = (values) => {      const [start, end] = values;      show.value = false;      date.value = `${formatDate(start)} - ${formatDate(end)}`;    };    return {      date,      show,      onConfirm,    };  },};
    Tips: 默认情况下,日期区间的起止时间不能为同一天,可以通过设置 allow-same-day 属性来允许选择同一天。

    快捷选择

    将 show-confirm 设置为 false 可以隐藏确认按钮,这种情况下选择完成后会立即触发 confirm 事件。 快捷选择1

    快捷选择2

    <van-calendar v-model:show="show" :show-confirm="false" />

    自定义颜色

    通过 color 属性可以自定义日历的颜色,对选中日期和底部按钮生效。

    自定义颜色

    <van-calendar v-model:show="show" color="#1989fa" />

    自定义日期范围

    通过 min-date 和 max-date 定义日历的范围。

    定义日期范围

    <van-calendar v-model:show="show" :min-date="minDate" :max-date="maxDate" />
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    return {      show,      minDate: new Date(2010, 0, 1),      maxDate: new Date(2010, 0, 31),    };  },};

    自定义按钮文字

    通过 confirm-text 设置按钮文字,通过 confirm-disabled-text 设置按钮禁用时的文字。

    自定义按钮文字

    <van-calendar  v-model:show="show"  type="range"  confirm-text="完成"  confirm-disabled-text="请选择结束时间"/>

    自定义日期文案

    通过传入 formatter 函数来对日历上每一格的内容进行格式化。

    自定义日期文案

    <van-calendar v-model:show="show" type="range" :formatter="formatter" />
    export default {  setup() {    const formatter = (day) => {      const month = day.date.getMonth() + 1;      const date = day.date.getDate();      if (month === 5) {        if (date === 1) {          day.topInfo = '劳动节';        } else if (date === 4) {          day.topInfo = '青年节';        } else if (date === 11) {          day.text = '今天';        }      }      if (day.type === 'start') {        day.bottomInfo = '入住';      } else if (day.type === 'end') {        day.bottomInfo = '离店';      }      return day;    };    return {      formatter,    };  },};

    自定义弹出位置

    通过 position 属性自定义弹出层的弹出位置,可选值为 top、left、right。

    自定义弹出位置

    <van-calendar v-model:show="show" :round="false" position="right" />

    日期区间最大范围

    选择日期区间时,可以通过 max-range 属性来指定最多可选天数,选择的范围超过最多可选天数时,会弹出相应的提示文案。

    日期区间最大范围

    <van-calendar type="range" :max-range="3" :style="{ height: '500px' }" />

    自定义周起始日

    通过 first-day-of-week 属性设置一周从哪天开始。

    自定义周起始日

    <van-calendar first-day-of-week="1" />

    平铺展示

    将 poppable 设置为 false,日历会直接展示在页面内,而不是以弹层的形式出现。

    平铺展示

    <van-calendar  title="日历"  :poppable="false"  :show-confirm="false"  :style="{ height: '500px' }"/>

    API

    Props

    参数说明类型默认值
    type选择类型:
    single 表示选择单个日期,
    multiple 表示选择多个日期,
    range 表示选择日期区间
    stringsingle
    title日历标题string日期选择
    color主题色,对底部按钮和选中日期生效string#ee0a24
    min-date可选择的最小日期Date当前日期
    max-date可选择的最大日期Date当前日期的六个月后
    default-date默认选中的日期,type 为 multiple 或 range 时为数组,传入 null 表示默认不选择Date | Date[] | null今天
    row-height日期行高number | string64
    formatter日期格式化函数(day: Day) => Day-
    poppable是否以弹层的形式展示日历booleantrue
    lazy-render是否只渲染可视区域的内容booleantrue
    show-mark是否显示月份背景水印booleantrue
    show-title是否展示日历标题booleantrue
    show-subtitle是否展示日历副标题(年月)booleantrue
    show-confirm是否展示确认按钮booleantrue
    readonly是否为只读状态,只读状态下不能选择日期booleanfalse
    confirm-text确认按钮的文字string确定
    confirm-disabled-text确认按钮处于禁用状态时的文字string确定
    first-day-of-week设置周起始日0-60

    Calendar Poppable Props

    当 Calendar 的 poppable 为 true 时,支持以下 props:

    参数说明类型默认值
    v-model:show是否显示日历弹窗booleanfalse
    position弹出位置,可选值为 top right leftstringbottom
    round是否显示圆角弹窗booleantrue
    close-on-popstate是否在页面回退时自动关闭booleantrue
    close-on-click-overlay是否在点击遮罩层后关闭booleantrue
    safe-area-inset-bottom是否开启底部安全区适配booleantrue
    teleport指定挂载的节点,用法示例string | Element-

    Calendar Range Props

    当 Calendar 的 type 为 range 时,支持以下 props:

    参数说明类型默认值
    max-range日期区间最多可选天数number | string无限制
    range-prompt范围选择超过最多可选天数时的提示文案string选择天数不能超过 xx 天
    show-range-prompt范围选择超过最多可选天数时,是否展示提示文案booleantrue
    allow-same-day是否允许日期范围的起止时间为同一天booleanfalse

    Calendar Multiple Props

    当 Calendar 的 type 为 multiple 时,支持以下 props:

    参数说明类型默认值
    max-range日期最多可选天数number | string无限制
    range-prompt选择超过最多可选天数时的提示文案string选择天数不能超过 xx 天

    Day 数据结构

    日历中的每个日期都对应一个 Day 对象,通过formatter属性可以自定义 Day 对象的内容

    键名说明类型
    date日期对应的 Date 对象Date
    type日期类型,可选值为 selectedstartmiddleenddisabledstring
    text中间显示的文字string
    topInfo上方的提示信息string
    bottomInfo下方的提示信息string
    className额外类名string

    Events

    事件名说明回调参数
    select点击并选中任意日期时触发value: Date | Date[]
    confirm日期选择完成后触发,若 show-confirm 为 true,则点击确认按钮后触发value: Date | Date[]
    open打开弹出层时触发-
    close关闭弹出层时触发-
    opened打开弹出层且动画结束后触发-
    closed关闭弹出层且动画结束后触发-
    unselect当日历组件的 type 为 multiple 时,取消选中日期时触发value: Date
    month-show当某个月份进入可视区域时触发{ date: Date, title: string }
    over-range范围选择超过最多可选天数时触发-
    click-subtitle v3.1.3点击日历副标题时触发event: MouseEvent

    Slots

    名称说明参数
    title自定义标题-
    subtitle v3.1.3自定义日历副标题-
    footer自定义底部区域内容-
    top-info v3.0.17自定义日期上方的提示信息day: Day
    bottom-info v3.0.17自定义日期下方的提示信息day: Day

    方法

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

    方法名说明参数返回值
    reset将选中的日期重置到指定日期,未传参时会重置到默认日期date?: Date | Date[]-
    scrollToDate滚动到某个日期date: Date-

    主题定制

    样式变量

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

    名称默认值描述
    --van-calendar-background-colorvar(--van-white)-
    --van-calendar-popup-height80%-
    --van-calendar-header-box-shadow0 2px 10px rgba(125, 126, 128, 0.16)-
    --van-calendar-header-title-height44px-
    --van-calendar-header-title-font-sizevar(--van-font-size-lg)-
    --van-calendar-header-subtitle-font-sizevar(--van-font-size-md)-
    --van-calendar-weekdays-height30px-
    --van-calendar-weekdays-font-sizevar(--van-font-size-sm)-
    --van-calendar-month-title-font-sizevar(--van-font-size-md)-
    --van-calendar-month-mark-colorfade(var(--van-gray-2), 80%)-
    --van-calendar-month-mark-font-size160px-
    --van-calendar-day-height64px-
    --van-calendar-day-font-sizevar(--van-font-size-lg)-
    --van-calendar-range-edge-colorvar(--van-white)-
    --van-calendar-range-edge-background-colorvar(--van-danger-color)-
    --van-calendar-range-middle-colorvar(--van-danger-color)-
    --van-calendar-range-middle-background-opacity0.1-
    --van-calendar-selected-day-size54px-
    --van-calendar-selected-day-colorvar(--van-white)-
    --van-calendar-info-font-sizevar(--van-font-size-xs)-
    --van-calendar-info-line-heightvar(--van-line-height-xs)-
    --van-calendar-selected-day-background-colorvar(--van-danger-color)-
    --van-calendar-day-disabled-colorvar(--van-gray-5)-
    --van-calendar-confirm-button-height36px-
    --van-calendar-confirm-button-margin7px 0-

    常见问题

    在 iOS 系统上初始化组件失败?

    如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。

    对此问题的详细解释:stackoverflow


    介绍

    级联选择框,用于多层级数据的选择,典型场景为省市区选择。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Cascader } from 'vant';const app = createApp();app.use(Cascader);

    代码演示

    基础用法

    级联选择组件可以搭配 Field 和 Popup 组件使用,示例如下:

    基础用法

    <van-field  v-model="state.fieldValue"  is-link  readonly  label="地区"  placeholder="请选择所在地区"  @click="state.show = true"/><van-popup v-model:show="state.show" round position="bottom">  <van-cascader    v-model="state.cascaderValue"    title="请选择所在地区"    :options="options"    @close="state.show = false"    @finish="onFinish"  /></van-popup>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      show: false,      fieldValue: '',      cascaderValue: '',    });    // 选项列表,children 代表子选项,支持多级嵌套    const options = [      {        text: '浙江省',        value: '330000',        children: [{ text: '杭州市', value: '330100' }],      },      {        text: '江苏省',        value: '320000',        children: [{ text: '南京市', value: '320100' }],      },    ];    // 全部选项选择完毕后,会触发 finish 事件    const onFinish = ({ selectedOptions }) => {      state.show = false;      state.fieldValue = selectedOptions.map((option) => option.text).join('/');    };    return {      state,      options,      onFinish,    };  },};

    自定义颜色

    通过 active-color 属性来设置选中状态的高亮颜色。

    定义颜色

    <van-cascader  v-model="state.cascaderValue"  title="请选择所在地区"  :options="options"  active-color="#1989fa"  @close="state.show = false"  @finish="onFinish"/>

    异步加载选项

    可以监听 change 事件并动态设置 options,实现异步加载选项。

    异步加载选项

    <van-field  v-model="state.fieldValue"  is-link  readonly  label="地区"  placeholder="请选择所在地区"  @click="state.show = true"/><van-popup v-model:show="state.show" round position="bottom">  <van-cascader    v-model="state.cascaderValue"    title="请选择所在地区"    :options="state.options"    @close="state.show = false"    @change="onChange"    @finish="onFinish"  /></van-popup>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      show: false,      fieldValue: '',      cascaderValue: '',      options: [        {          text: '浙江省',          value: '330000',          children: [],        },      ],    });    const onChange = ({ value }) => {      if (value === state.options[0].value) {        setTimeout(() => {          state.options[0].children = [            { text: '杭州市', value: '330100' },            { text: '宁波市', value: '330200' },          ];        }, 500);      }    };    const onFinish = ({ selectedOptions }) => {      state.show = false;      state.fieldValue = selectedOptions.map((option) => option.text).join('/');    };    return {      state,      onChange,      onFinish,    };  },};

    自定义字段名

    通过 field-names 属性可以自定义 options 里的字段名称。

    自定义字段名

    <van-cascader  v-model="code"  title="请选择所在地区"  :options="options"  :field-names="fieldNames"/>
    import { ref } from 'vue';export default {  setup() {    const code = ref('');    const fieldNames = {      text: 'name',      value: 'code',      children: 'items',    };    const options = [      {        name: '浙江省',        code: '330000',        items: [{ name: '杭州市', code: '330100' }],      },      {        name: '江苏省',        code: '320000',        items: [{ name: '南京市', code: '320100' }],      },    ];    return {      code,      options,      fieldNames,    };  },};

    API

    Props

    参数说明类型默认值
    title顶部标题string-
    value选中项的值string | number-
    options可选项数据源Option[][]
    placeholder未选中时的提示文案string请选择
    active-color选中状态的高亮颜色string#ee0a24
    swipeable v3.0.11是否开启手势左右滑动切换booleanfalse
    closeable是否显示关闭图标booleantrue
    close-icon v3.0.10关闭图标名称或图片链接stringcross
    field-names v3.0.4自定义 options 结构中的字段object{ text: 'text', value: 'value', children: 'children' }

    Option 数据结构

    options 属性是一个由对象构成的数组,数组中的每个对象配置一个可选项,对象可以包含以下值:

    键名说明类型
    text选项文字(必填)string
    value选项对应的值(必填)string | number
    color v3.1.0选项文字颜色string
    children子选项列表Option[]
    disabled v3.1.2是否禁用选项boolean
    className v3.1.0为对应列添加额外的 classstring | Array | object

    Events

    事件说明回调参数
    change选中项变化时触发{ value, selectedOptions, tabIndex }
    finish全部选项选择完成后触发{ value, selectedOptions, tabIndex }
    close点击关闭图标时触发-
    click-tab点击标签时触发tabIndex: number, title: string

    Slots

    名称说明参数
    title自定义顶部标题-
    option v3.1.4自定义选项文字{ option: Option, selected: boolean }

    主题定制

    样式变量

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

    名称默认值描述
    --van-cascader-header-height48px-
    --van-cascader-header-padding0 var(--van-padding-md)-
    --van-cascader-title-font-sizevar(--van-font-size-lg)-
    --van-cascader-title-line-height20px-
    --van-cascader-close-icon-size22px-
    --van-cascader-close-icon-colorvar(--van-gray-5)-
    --van-cascader-close-icon-active-colorvar(--van-gray-6)-
    --van-cascader-selected-icon-size18px-
    --van-cascader-tabs-height48px-
    --van-cascader-active-colorvar(--van-danger-color)-
    --van-cascader-options-height384px-
    --van-cascader-option-disabled-colorvan(--van-gray-5)-
    --van-cascader-tab-colorvar(--van-text-color)-
    --van-cascader-unselected-tab-colorvar(--van-gray-6)-


    介绍

    在一组备选项中进行多选。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Checkbox, CheckboxGroup } from 'vant';const app = createApp();app.use(Checkbox);app.use(CheckboxGroup);

    代码演示

    基础用法

    通过 v-model 绑定复选框的勾选状态。

    基础用法

    <van-checkbox v-model="checked">复选框</van-checkbox>
    import { ref } from 'vue';export default {  setup() {    const checked = ref(true);    return { checked };  },};

    禁用状态

    通过设置 disabled 属性可以禁用复选框。

    禁用状态

    <van-checkbox v-model="checked" disabled>复选框</van-checkbox>

    自定义形状

    将 shape 属性设置为 square,复选框的形状会变成方形。

    自定义形状

    <van-checkbox v-model="checked" shape="square">复选框</van-checkbox>

    自定义颜色

    通过 checked-color 属性设置选中状态的图标颜色。

    自定义颜色

    <van-checkbox v-model="checked" checked-color="#ee0a24">复选框</van-checkbox>

    自定义大小

    通过 icon-size 属性可以自定义图标的大小。

    自定义大小

    <van-checkbox v-model="checked" icon-size="24px">复选框</van-checkbox>

    自定义图标

    通过 icon 插槽自定义图标,可以通过 slotProps 判断是否为选中状态.

    自定义图标

    <van-checkbox v-model="checked">  自定义图标  <template #icon="props">    <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" />  </template></van-checkbox><style>  .img-icon {    height: 20px;  }</style>
    import { ref } from 'vue';export default {  setup() {    const checked = ref(true);    return {      checked,      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

    禁用文本点击

    设置 label-disabled 属性后,点击图标以外的内容不会触发复选框切换。

    禁用文本点击

    <van-checkbox v-model="checked" label-disabled>复选框</van-checkbox>

    复选框组

    复选框可以与复选框组一起使用,复选框组通过 v-model 数组绑定复选框的勾选状态。

    复选框组

    <van-checkbox-group v-model="checked">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox></van-checkbox-group>
    import { ref } from 'vue';export default {  setup() {    const checked = ref(['a', 'b']);    return { checked };  },};

    水平排列

    将 direction 属性设置为 horizontal 后,复选框组会变成水平排列。

    水平排列

    <van-checkbox-group v-model="checked" direction="horizontal">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox></van-checkbox-group>
    import { ref } from 'vue';export default {  setup() {    const checked = ref([]);    return { checked };  },};

    限制最大可选数

    通过 max 属性可以限制复选框组的最大可选数。

    限制最大可选数

    <van-checkbox-group v-model="checked" :max="2">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox>  <van-checkbox name="c">复选框 c</van-checkbox></van-checkbox-group>

    全选与反选

    通过 CheckboxGroup 实例上的 toggleAll 方法可以实现全选与反选。

    全选与反选

    <van-checkbox-group v-model="checked" ref="checkboxGroup">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox>  <van-checkbox name="c">复选框 c</van-checkbox></van-checkbox-group><van-button type="primary" @click="checkAll">全选</van-button><van-button type="primary" @click="toggleAll">反选</van-button>
    import { ref } from 'vue';export default {  setup() {    const checked = ref([]);    const checkboxGroup = ref(null);    const checkAll = () => {      checkboxGroup.value.toggleAll(true);    }    const toggleAll = () => {      checkboxGroup.value.toggleAll();    },    return {      checked,      checkAll,      toggleAll,      checkboxGroup,    };  },};

    搭配单元格组件使用

    此时你需要再引入 Cell 和 CellGroup 组件,并通过 Checkbox 实例上的 toggle 方法触发切换。

    搭配单元格使用

    <van-checkbox-group v-model="checked">  <van-cell-group>    <van-cell      v-for="(item, index) in list"      clickable      :key="item"      :title="`复选框 ${item}`"      @click="toggle(index)"    >      <template #right-icon>        <van-checkbox          :name="item"          :ref="el => checkboxRefs[index] = el"          @click.stop        />      </template>    </van-cell>  </van-cell-group></van-checkbox-group>
    import { ref, onBeforeUpdate } from 'vue';export default {  setup() {    const checked = ref([]);    const checkboxRefs = ref([]);    const toggle = (index) => {      checkboxRefs.value[index].toggle();    };    onBeforeUpdate(() => {      checkboxRefs.value = [];    });    return {      list: ['a', 'b'],      toggle,      checked,      checkboxRefs,    };  },};

    API

    Checkbox Props

    参数说明类型默认值
    v-model是否为选中状态booleanfalse
    name标识符any-
    shape形状,可选值为 squarestringround
    disabled是否禁用复选框booleanfalse
    label-disabled是否禁用复选框文本点击booleanfalse
    label-position文本位置,可选值为 leftstringright
    icon-size图标大小,默认单位为 pxnumber | string20px
    checked-color选中状态颜色string#1989fa
    bind-group是否与复选框组绑定booleantrue

    CheckboxGroup Props

    参数说明类型默认值
    v-model所有选中项的标识符any[]-
    disabled是否禁用所有复选框booleanfalse
    max最大可选数,0 为无限制number | string0
    direction排列方向,可选值为 horizontalstringvertical
    icon-size所有复选框的图标大小,默认单位为 pxnumber | string20px
    checked-color所有复选框的选中状态颜色string#1989fa

    Checkbox Events

    事件名说明回调参数
    change当绑定值变化时触发的事件checked: boolean
    click点击复选框时触发event: MouseEvent

    CheckboxGroup Events

    事件名说明回调参数
    change当绑定值变化时触发的事件names: any[]

    Checkbox Slots

    名称说明参数
    default自定义文本-
    icon自定义图标{ checked: boolean, disabled: boolean }

    CheckboxGroup 方法

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

    方法名说明参数返回值
    toggleAll切换所有复选框,传 true 为选中,false 为取消选中,不传参为取反options?: boolean | object-

    toggleAll 方法示例

    const { checkboxGroup } = this.$refs;// 全部反选checkboxGroup.toggleAll();// 全部选中checkboxGroup.toggleAll(true);// 全部取消checkboxGroup.toggleAll(false);// 全部反选,并跳过禁用的复选框checkboxGroup.toggleAll({  skipDisabled: true,});// 全部选中,并跳过禁用的复选框checkboxGroup.toggleAll({  checked: true,  skipDisabled: true,});

    Checkbox 方法

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

    方法名说明参数返回值
    toggle切换选中状态,传 true 为选中,false 为取消选中,不传参为取反checked?: boolean-

    主题定制

    样式变量

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

    名称默认值描述
    --van-checkbox-size20px-
    --van-checkbox-border-colorvar(--van-gray-5)-
    --van-checkbox-transition-durationvar(--van-animation-duration-fast)-
    --van-checkbox-label-marginvar(--van-padding-xs)-
    --van-checkbox-label-colorvar(--van-text-color)-
    --van-checkbox-checked-icon-colorvar(--van-primary-color)-
    --van-checkbox-disabled-icon-colorvar(--van-gray-5)-
    --van-checkbox-disabled-label-colorvar(--van-gray-5)-
    --van-checkbox-disabled-background-colorvar(--van-border-color)-


    介绍

    时间选择器,支持日期、年月、时分等维度,通常与弹出层组件配合使用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { DatetimePicker } from 'vant';const app = createApp();app.use(DatetimePicker);

    代码演示

    选择年月日

    DatetimePicker 通过 type 属性来定义需要选择的时间类型,type 为 date 表示选择年月日。通过 min-date 和 max-date 属性可以确定可选的时间范围。

    选择年月日

    <van-datetime-picker  v-model="currentDate"  type="date"  title="选择年月日"  :min-date="minDate"  :max-date="maxDate"/>
    import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date(2021, 0, 17));    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate,    };  },};

    选择年月

    将 type 设置为 year-month 即可选择年份和月份。通过传入 formatter 函数,可以对选项文字进行格式化处理。

    选择年月

    <van-datetime-picker  v-model="currentDate"  type="year-month"  title="选择年月"  :min-date="minDate"  :max-date="maxDate"  :formatter="formatter"/>
    import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    const formatter = (type, val) => {      if (type === 'year') {        return `${val}年`;      }      if (type === 'month') {        return `${val}月`;      }      return val;    };    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      formatter,      currentDate,    };  },};

    选择月日

    将 type 设置为 month-day 即可选择月份和日期。

    选择月日

    <van-datetime-picker  v-model="currentDate"  type="month-day"  title="选择月日"  :min-date="minDate"  :max-date="maxDate"  :formatter="formatter"/>
    import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    const formatter = (type, val) => {      if (type === 'month') {        return `${val}月`;      }      if (type === 'day') {        return `${val}日`;      }      return val;    };    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      formatter,      currentDate,    };  },};

    选择时间

    将 type 设置为 time 即可选择时间(小时和分钟)。

    选择时间

    <van-datetime-picker  v-model="currentTime"  type="time"  title="选择时间"  :min-hour="10"  :max-hour="20"/>
    import { ref } from 'vue';export default {  setup() {    const currentTime = ref('12:00');    return { currentTime };  },};

    选择完整时间

    将 type 设置为 datetime 即可选择完整时间,包括年月日和小时、分钟。

    选择完整时间

    <van-datetime-picker  v-model="currentDate"  type="datetime"  title="选择完整时间"  :min-date="minDate"  :max-date="maxDate"/>
    import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate,    };  },};

    选择年月日小时

    将 type 设置为 datehour 即可选择日期和小时,包括年月日和小时。

    选择年月日时

    <van-datetime-picker  v-model="currentDate"  type="datehour"  title="选择年月日小时"  :min-date="minDate"  :max-date="maxDate"/>
    import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate,    };  },};

    选项过滤器

    通过传入 filter 函数,可以对选项数组进行过滤,实现自定义时间间隔。

    选项过滤器

    <van-datetime-picker v-model="currentTime" type="time" :filter="filter" />
    import { ref } from 'vue';export default {  setup() {    const currentTime = ref('12:00');    const filter = (type, options) => {      if (type === 'minute') {        return options.filter((option) => Number(option) % 5 === 0);      }      return options;    };    return {      filter,      currentTime,    };  },};

    自定义列排序

    自定义列排序

    <van-datetime-picker  v-model="currentDate"  type="date"  title="自定义列排序"  :columns-order="['month', 'day', 'year']"  :formatter="formatter"/>
    import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    const formatter = (type, val) => {      if (type === 'year') {        return val + '年';      }      if (type === 'month') {        return val + '月';      }      if (type === 'day') {        return val + '日';      }      return val;    };    return {      formatter,      currentDate,    };  },};

    API

    Props

    参数说明类型默认值
    type时间类型,可选值为 date time
    year-month month-day datehour
    stringdatetime
    title顶部栏标题string''
    confirm-button-text确认按钮文字string确认
    cancel-button-text取消按钮文字string取消
    show-toolbar是否显示顶部栏booleantrue
    loading是否显示加载状态booleanfalse
    readonly是否为只读状态,只读状态下无法切换选项booleanfalse
    filter选项过滤函数(type: string, values: string[]) => string[]-
    formatter选项格式化函数(type: string, value: string) => string-
    columns-order自定义列排序数组, 子项可选值为
    yearmonthdayhourminute
    string[]-
    item-height选项高度,支持 px vw vh rem 单位,默认 pxnumber | string44
    visible-item-count可见的选项个数number | string6
    swipe-duration快速滑动时惯性滚动的时长,单位msnumber | string1000

    DatePicker Props

    当时间选择器类型为 date 或 datetime 时,支持以下 props:

    参数说明类型默认值
    min-date可选的最小时间,精确到分钟Date十年前
    max-date可选的最大时间,精确到分钟Date十年后

    TimePicker Props

    当时间选择器类型为 time 时,支持以下 props:

    参数说明类型默认值
    min-hour可选的最小小时number | string0
    max-hour可选的最大小时number | string23
    min-minute可选的最小分钟number | string0
    max-minute可选的最大分钟number | string59

    Events

    事件名说明回调参数
    change当值变化时触发的事件value: 当前选中的时间
    confirm点击完成按钮时触发的事件value: 当前选中的时间
    cancel点击取消按钮时触发的事件-

    Slots

    名称说明参数
    default自定义整个顶部栏的内容-
    title自定义标题内容-
    confirm自定义确认按钮内容-
    cancel自定义取消按钮内容-
    option自定义选项内容option: string | object
    columns-top自定义选项上方内容-
    columns-bottom自定义选项下方内容-

    方法

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

    方法名说明参数返回值
    getPicker获取 Picker 实例,用于调用 Picker 的实例方法--

    常见问题

    设置 min-date 或 max-date 后出现页面卡死的情况?

    请注意不要在模板中直接使用类似min-date="new Date()"的写法,这样会导致每次渲染组件时传入一个新的 Date 对象,而传入新的数据会触发下一次渲染,从而陷入死循环。

    正确的做法是将min-date作为一个数据定义在data函数中。

    在 iOS 系统上初始化组件失败?

    如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。

    对此问题的详细解释:stackoverflow

    在桌面端无法操作组件?

    参见桌面端适配

    是否有年份或月份选择器?

    如果仅需要选择年份或者月份,建议直接使用 Picker 组件。


    介绍

    用户可以在文本框内输入或编辑文字。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Field, CellGroup } from 'vant';const app = createApp();app.use(Field);app.use(CellGroup);

    代码演示

    基础用法

    可以通过 v-model 双向绑定输入框的值,通过 placeholder 设置占位提示文字。

    基础用法

    <!-- 可以使用 CellGroup 作为容器 --><van-cell-group inset>  <van-field v-model="value" label="文本" placeholder="请输入用户名" /></van-cell-group>
    import { ref } from 'vue';export default {  setup() {    const value = ref('');    return { value };  },};

    自定义类型

    根据 type 属性定义不同类型的输入框,默认值为 text。

    自定义类型

    <van-cell-group inset>  <!-- 输入任意文本 -->  <van-field v-model="state.text" label="文本" />  <!-- 输入手机号,调起手机号键盘 -->  <van-field v-model="state.tel" type="tel" label="手机号" />  <!-- 允许输入正整数,调起纯数字键盘 -->  <van-field v-model="state.digit" type="digit" label="整数" />  <!-- 允许输入数字,调起带符号的纯数字键盘 -->  <van-field v-model="state.number" type="number" label="数字" />  <!-- 输入密码 -->  <van-field v-model="state.password" type="password" label="密码" /></van-cell-group>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      tel: '',      text: '',      digit: '',      number: '',      password: '',    });    return { state };  },};

    禁用输入框

    通过 readonly 将输入框设置为只读状态,通过 disabled 将输入框设置为禁用状态。

    禁用输入框

    <van-cell-group inset>  <van-field label="文本" model-value="输入框只读" readonly />  <van-field label="文本" model-value="输入框已禁用" disabled /></van-cell-group>

    显示图标

    通过 left-icon 和 right-icon 配置输入框两侧的图标,通过设置 clearable 在输入过程中展示清除图标。

    显示图标

    <van-cell-group inset>  <van-field    v-model="state.value1"    label="文本"    left-icon="smile-o"    right-icon="warning-o"    placeholder="显示图标"  />  <van-field    v-model="state.value2"    clearable    label="文本"    left-icon="music-o"    placeholder="显示清除图标"  /></van-cell-group>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value1: '',      value2: '123',    });    return { state };  },};

    错误提示

    设置 required 属性表示这是一个必填项,可以配合 error 或 error-message 属性显示对应的错误提示。

    错误提示

    <van-cell-group inset>  <van-field    v-model="username"    error    required    label="用户名"    placeholder="请输入用户名"  />  <van-field    v-model="phone"    required    label="手机号"    placeholder="请输入手机号"    error-message="手机号格式错误"  /></van-cell-group>

    插入按钮

    通过 button 插槽可以在输入框尾部插入按钮。

    插入按钮

    <van-cell-group inset>  <van-field    v-model="sms"    center    clearable    label="短信验证码"    placeholder="请输入短信验证码"  >    <template #button>      <van-button size="small" type="primary">发送验证码</van-button>    </template>  </van-field></van-cell-group>

    格式化输入内容

    通过 formatter 属性可以对输入的内容进行格式化,通过 format-trigger 属性可以指定执行格式化的时机,默认在输入时进行格式化。

    格式化输入内容

    <van-cell-group inset>  <van-field    v-model="state.value1"    label="文本"    :formatter="formatter"    placeholder="在输入时执行格式化"  />  <van-field    v-model="state.value2"    label="文本"    :formatter="formatter"    format-trigger="onBlur"    placeholder="在失焦时执行格式化"  /></van-cell-group>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value1: '',      value2: '',    });    // 过滤输入的数字    const formatter = (value) => value.replace(/d/g, '');    return {      state,      formatter,    };  },};

    高度自适应

    对于 textarea,可以通过 autosize 属性设置高度自适应。

    高度自适应

    <van-cell-group inset>  <van-field    v-model="message"    rows="1"    autosize    label="留言"    type="textarea"    placeholder="请输入留言"  /></van-cell-group>

    显示字数统计

    设置 maxlength 和 show-word-limit 属性后会在底部显示字数统计。

    字数统计

    <van-cell-group inset>  <van-field    v-model="message"    rows="2"    autosize    label="留言"    type="textarea"    maxlength="50"    placeholder="请输入留言"    show-word-limit  /></van-cell-group>

    输入框内容对齐

    通过 input-align 属性可以设置输入框内容的对齐方式,可选值为 center、right。

    输入框内容对齐

    <van-cell-group inset>  <van-field    v-model="value"    label="文本"    placeholder="输入框内容右对齐"    input-align="right"  /></van-cell-group>

    API

    Props

    参数说明类型默认值
    v-model当前输入的值number | string-
    label输入框左侧文本string-
    name名称,提交表单的标识符string-
    type输入框类型, 可选值为 tel digit
    number textarea password 等
    stringtext
    size大小,可选值为 largestring-
    maxlength输入的最大字符数number | string-
    placeholder输入框占位提示文字string-
    border是否显示内边框booleantrue
    disabled是否禁用输入框booleanfalse
    readonly是否为只读状态,只读状态下无法输入内容booleanfalse
    colon是否在 label 后面添加冒号booleanfalse
    required是否显示表单必填星号booleanfalse
    center是否使内容垂直居中booleanfalse
    clearable是否启用清除图标,点击清除图标后会清空输入框booleanfalse
    clear-icon v3.0.12清除图标名称或图片链接stringclear
    clear-trigger显示清除图标的时机,always 表示输入框不为空时展示,
    focus 表示输入框聚焦且不为空时展示
    stringfocus
    clickable是否开启点击反馈booleanfalse
    is-link是否展示右侧箭头并开启点击反馈booleanfalse
    autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
    show-word-limit是否显示字数统计,需要设置 maxlength 属性booleanfalse
    error是否将输入内容标红booleanfalse
    error-message底部错误提示文案,为空时不展示string-
    error-message-align错误提示文案对齐方式,可选值为 center rightstringleft
    formatter输入内容格式化函数(val: string) => string-
    format-trigger格式化函数触发的时机,可选值为 onBlurstringonChange
    arrow-direction箭头方向,可选值为 left up downstringright
    label-class左侧文本额外类名string | Array | object-
    label-width左侧文本宽度,默认单位为 pxnumber | string6.2em
    label-align左侧文本对齐方式,可选值为 center rightstringleft
    input-align输入框对齐方式,可选值为 center rightstringleft
    autosize是否自适应内容高度,只对 textarea 有效,
    可传入对象,如 { maxHeight: 100, minHeight: 50 },
    单位为px
    boolean | objectfalse
    left-icon左侧图标名称或图片链接string-
    right-icon右侧图标名称或图片链接string-
    icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
    rules表单校验规则,详见 Form 组件Rule[]-
    autocomplete v3.0.3input 标签原生的自动完成属性string-

    Events

    事件说明回调参数
    update:model-value输入框内容变化时触发value: string (当前输入的值)
    focus输入框获得焦点时触发event: Event
    blur输入框失去焦点时触发event: Event
    clear点击清除按钮时触发event: MouseEvent
    click点击组件时触发event: MouseEvent
    click-input点击输入区域时触发event: MouseEvent
    click-left-icon点击左侧图标时触发event: MouseEvent
    click-right-icon点击右侧图标时触发event: MouseEvent

    方法

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

    方法名说明参数返回值
    focus获取输入框焦点--
    blur取消输入框焦点--

    Slots

    名称说明
    label自定义输入框左侧文本
    input自定义输入框,使用此插槽后,与输入框相关的属性和事件将失效。
    在 Form 组件进行表单校验时,会使用 input 插槽中子组件的 value,而不是 Field 组件的 value
    left-icon自定义输入框头部图标
    right-icon自定义输入框尾部图标
    button自定义输入框尾部按钮
    extra自定义输入框最右侧的额外内容

    主题定制

    样式变量

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

    名称默认值描述
    --van-field-label-width6.2em-
    --van-field-label-colorvar(--van-gray-7)-
    --van-field-label-margin-rightvar(--van-padding-sm)-
    --van-field-input-text-colorvar(--van-text-color)-
    --van-field-input-error-text-colorvar(--van-danger-color)-
    --van-field-input-disabled-text-colorvar(--van-gray-5)-
    --van-field-placeholder-text-colorvar(--van-gray-5)-
    --van-field-icon-size16px-
    --van-field-clear-icon-size16px-
    --van-field-clear-icon-colorvar(--van-gray-5)-
    --van-field-right-icon-colorvar(--van-gray-6)-
    --van-field-error-message-colorvar(--van-danger-color)-
    --van-field-error-message-text-color12px-
    --van-field-text-area-min-height60px-
    --van-field-word-limit-colorvar(--van-gray-7)-
    --van-field-word-limit-font-sizevar(--van-font-size-sm)-
    --van-field-word-limit-line-height16px-
    --van-field-disabled-text-colorvar(--van-gray-5)-
    --van-field-required-mark-colorvar(--van-red)-

    常见问题

    设置 type 为 number 后,为什么 input 标签的类型仍为 text?

    HTML 原生的 type="number" 属性在 iOS 和 Android 系统上都存在一定问题,比如 maxlength 属性不生效、无法获取到完整的输入内容等。因此设置 type 为 number 时,Field 不会使用原生的 type="number" 属性,而是用现代浏览器支持的 inputmode 属性来控制输入键盘的类型。

    在桌面端点击清除按钮无效?

    清除按钮监听是的移动端 Touch 事件,参见桌面端适配


    介绍

    用于数据录入、校验,支持输入框、单选框、复选框、文件上传等类型,需要与 Field 输入框 组件搭配使用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Form, Field, CellGroup } from 'vant';const app = createApp();app.use(Form);app.use(Field);app.use(CellGroup);

    代码演示

    基础用法

    在表单中,每个 Field 组件 代表一个表单项,使用 Field 的 rules 属性定义校验规则。

    基础用法

    <van-form @submit="onSubmit">  <van-cell-group inset>    <van-field      v-model="state.username"      name="用户名"      label="用户名"      placeholder="用户名"      :rules="[{ required: true, message: '请填写用户名' }]"    />    <van-field      v-model="state.password"      type="password"      name="密码"      label="密码"      placeholder="密码"      :rules="[{ required: true, message: '请填写密码' }]"    />  </van-cell-group>  <div style="margin: 16px;">    <van-button round block type="primary" native-type="submit">      提交    </van-button>  </div></van-form>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      username: '',      password: '',    });    const onSubmit = (values) => {      console.log('submit', values);    };    return {      state,      onSubmit,    };  },};

    校验规则

    通过 rules 定义表单校验规则,所有可用字段见下方表格

    校验规则

    <van-form @failed="onFailed">  <van-cell-group inset>    <!-- 通过 pattern 进行正则校验 -->    <van-field      v-model="state.value1"      name="pattern"      placeholder="正则校验"      :rules="[{ pattern, message: '请输入正确内容' }]"    />    <!-- 通过 validator 进行函数校验 -->    <van-field      v-model="state.value2"      name="validator"      placeholder="函数校验"      :rules="[{ validator, message: '请输入正确内容' }]"    />    <!-- 通过 validator 返回错误提示 -->    <van-field      v-model="state.value3"      name="validatorMessage"      placeholder="校验函数返回错误提示"      :rules="[{ validator: validatorMessage }]"    />    <!-- 通过 validator 进行异步函数校验 -->    <van-field      v-model="state.value4"      name="asyncValidator"      placeholder="异步函数校验"      :rules="[{ validator: asyncValidator, message: '请输入正确内容' }]"    />  </van-cell-group>  <div style="margin: 16px;">    <van-button round block type="primary" native-type="submit">      提交    </van-button>  </div></van-form>
    import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const state = reactive({      value1: '',      value2: '',      value3: '',      value4: '',    });    const pattern = /d{6}/;    // 校验函数返回 true 表示校验通过,false 表示不通过    const validator = (val) => /1d{10}/.test(val);    // 校验函数可以直接返回一段错误提示    const validatorMessage = (val) => `${val} 不合法,请重新输入`;    // 校验函数可以返回 Promise,实现异步校验    const asyncValidator = (val) =>      new Promise((resolve) => {        Toast.loading('验证中...');        setTimeout(() => {          Toast.clear();          resolve(/d{6}/.test(val));        }, 1000);      });    const onFailed = (errorInfo) => {      console.log('failed', errorInfo);    };    return {      state,      pattern,      onFailed,      validator,      asyncValidator,    };  },};

    表单项类型 - 开关

    在表单中使用 Switch 组件

    开关

    <van-field name="switch" label="开关">  <template #input>    <van-switch v-model="checked" size="20" />  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const checked = ref(false);    return { checked };  },};

    表单项类型 - 复选框

    在表单中使用 Checkbox 组件

    复选框

    <van-field name="checkbox" label="复选框">  <template #input>    <van-checkbox v-model="checked" shape="square" />  </template></van-field><van-field name="checkboxGroup" label="复选框组">  <template #input>    <van-checkbox-group v-model="groupChecked" direction="horizontal">      <van-checkbox name="1" shape="square">复选框 1</van-checkbox>      <van-checkbox name="2" shape="square">复选框 2</van-checkbox>    </van-checkbox-group>  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const checked = ref(false);    const groupChecked = ref([]);    return {      checked,      groupChecked,    };  },};

    表单项类型 - 单选框

    在表单中使用 Radio 组件

    单选框

    <van-field name="radio" label="单选框">  <template #input>    <van-radio-group v-model="checked" direction="horizontal">      <van-radio name="1">单选框 1</van-radio>      <van-radio name="2">单选框 2</van-radio>    </van-radio-group>  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const checked = ref('1');    return { checked };  },};

    表单项类型 - 步进器

    在表单中使用 Stepper 组件

    步进器

    <van-field name="stepper" label="步进器">  <template #input>    <van-stepper v-model="value" />  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const value = ref(1);    return { value };  },};

    表单项类型 - 评分

    在表单中使用 Rate 组件

    评分

    <van-field name="rate" label="评分">  <template #input>    <van-rate v-model="value" />  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const value = ref(3);    return { value };  },};

    表单项类型 - 滑块

    在表单中使用 Slider 组件

    滑块

    <van-field name="slider" label="滑块">  <template #input>    <van-slider v-model="value" />  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const value = ref(50);    return { value };  },};

    表单项类型 - 文件上传

    在表单中使用 Uploader 组件

    文件上传

    <van-field name="uploader" label="文件上传">  <template #input>    <van-uploader v-model="value" />  </template></van-field>
    import { ref } from 'vue';export default {  setup() {    const value = ref([{ url: 'https://img.yzcdn.cn/vant/leaf.jpg' }]);    return { value };  },};

    表单项类型 - 选择器

    在表单中使用 Picker 组件

    选择器

    <van-field  v-model="state.value"  readonly  clickable  name="picker"  label="选择器"  placeholder="点击选择城市"  @click="state.showPicker = true"/><van-popup v-model:show="state.showPicker" position="bottom">  <van-picker    :columns="columns"    @confirm="onConfirm"    @cancel="state.showPicker = false"  /></van-popup>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showPicker: false,    });    const columns = ['杭州', '宁波', '温州', '嘉兴', '湖州'];    const onConfirm = (value) => {      state.value = value;      state.showPicker = false;    };    return {      state,      columns,      onConfirm,    };  },};

    表单项类型 - 时间选择器

    在表单中使用 DatetimePicker 组件

    时间选择器

    <van-field  v-model="state.value"  readonly  clickable  name="datetimePicker"  label="时间选择"  placeholder="点击选择时间"  @click="state.showPicker = true"/><van-popup v-model:show="state.showPicker" position="bottom">  <van-datetime-picker    type="time"    @confirm="onConfirm"    @cancel="state.showPicker = false"  /></van-popup>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showPicker: false,    });    const onConfirm = (value) => {      state.value = value;      state.showPicker = false;    };    return {      state,      onConfirm,    };  },};

    表单项类型 - 省市区选择器

    在表单中使用 Area 组件

    地区选择器

    <van-field  v-model="state.value"  readonly  clickable  name="area"  label="地区选择"  placeholder="点击选择省市区"  @click="state.showArea = true"/><van-popup v-model:show="state.showArea" position="bottom">  <van-area    :area-list="areaList"    @confirm="onConfirm"    @cancel="state.showArea = false"  /></van-popup>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showArea: false,    });    const onConfirm = (value) => {      state.showArea = false;      state.value = values        .filter((item) => !!item)        .map((item) => item.name)        .join('/');    };    return {      state,      areaList: {}, // 数据格式见 Area 组件文档      onConfirm,    };  },};

    表单项类型 - 日历

    在表单中使用 Calendar 组件

    日期选择

    <van-field  v-model="state.value"  readonly  clickable  name="calendar"  label="日历"  placeholder="点击选择日期"  @click="state.showCalendar = true"/><van-calendar v-model:show="state.showCalendar" @confirm="onConfirm" />
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showCalendar: false,    });    const onConfirm = (date) => {      state.value = `${date.getMonth() + 1}/${date.getDate()}`;      state.showCalendar = false;    };    return {      state,      onConfirm,    };  },};

    API

    Props

    参数说明类型默认值
    label-width表单项 label 宽度,默认单位为pxnumber | string6.2em
    label-align表单项 label 对齐方式,可选值为 center rightstringleft
    input-align输入框对齐方式,可选值为 center rightstringleft
    error-message-align错误提示文案对齐方式,可选值为 center rightstringleft
    validate-trigger表单校验触发时机,可选值为 onChangeonSubmit,详见下表stringonBlur
    colon是否在 label 后面添加冒号booleanfalse
    disabled是否禁用表单中的所有输入框booleanfalse
    readonly是否将表单中的所有输入框设置为只读状态booleanfalse
    validate-first是否在某一项校验不通过时停止校验booleanfalse
    scroll-to-error是否在提交表单且校验不通过时滚动至错误的表单项booleanfalse
    show-error是否在校验不通过时标红输入框booleanfalse
    show-error-message是否在校验不通过时在输入框下方展示错误提示booleantrue
    submit-on-enter是否在按下回车键时提交表单booleantrue
    表单项的 API 参见:Field 组件

    Rule 数据结构

    使用 Field 的rules属性可以定义校验规则,可选属性如下:

    键名说明类型
    required是否为必选字段boolean
    message错误提示文案string | (value, rule) => string
    validator通过函数进行校验(value, rule) => boolean | string | Promise
    pattern通过正则表达式进行校验RegExp
    trigger本项规则的触发时机,可选值为 onChangeonBlurstring
    formatter格式化函数,将表单项的值转换后进行校验(value, rule) => any

    validate-trigger 可选值

    通过 validate-trigger 属性可以自定义表单校验的触发时机。

    描述
    onSubmit仅在提交表单时触发校验
    onBlur在提交表单和输入框失焦时触发校验
    onChange在提交表单和输入框内容变化时触发校验

    Events

    事件名说明回调参数
    submit提交表单且验证通过后触发values: object
    failed提交表单且验证不通过后触发errorInfo: { values: object, errors: object[] }

    方法

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

    方法名说明参数返回值
    submit提交表单,与点击提交按钮的效果等价--
    validate验证表单,支持传入 name 来验证单个或部分表单项name?: string | string[]Promise
    resetValidation重置表单项的验证提示,支持传入 name 来重置单个或部分表单项name?: string | string[]-
    scrollToField滚动到对应表单项的位置,默认滚动到顶部,第二个参数传 false 可滚动至底部name: string, alignToTop: boolean-

    Slots

    名称说明
    default表单内容


    介绍

    虚拟数字键盘,可以配合密码输入框组件或自定义的输入框组件使用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { NumberKeyboard } from 'vant';const app = createApp();app.use(NumberKeyboard);

    代码演示

    默认样式

    数字键盘提供了 input、delete、blur 事件,分别对应输入内容、删除内容和失去焦点的动作。

    默认样式

    <van-cell @touchstart.stop="show = true">弹出默认键盘</van-cell><van-number-keyboard  :show="show"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const show = ref(true);    const onInput = (value) => Toast(value);    const onDelete = () => Toast('删除');    return {      show,      onInput,      onDelete,    };  },};
    点击键盘以外的区域时,键盘会自动收起,通过阻止元素上的 touchstart 事件冒泡可以避免键盘收起。

    带右侧栏的键盘

    将 theme 属性设置为 custom 来展示键盘的右侧栏,常用于输入金额的场景。

    右侧键盘

    <van-number-keyboard  :show="show"  theme="custom"  extra-key="."  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

    身份证号键盘

    通过 extra-key 属性可以设置左下角按键内容,比如需要输入身份证号时,可以将 extra-key 设置为 X。

    身份证号键盘

    <van-cell plain type="primary" @touchstart.stop="show = true">  弹出身份证号键盘</van-cell><van-number-keyboard  :show="show"  extra-key="X"  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

    键盘标题

    通过 title 属性可以设置键盘标题。

    带标题的键盘

    <van-cell plain type="primary" @touchstart.stop="show = true">  弹出带标题的键盘</van-cell><van-number-keyboard  :show="show"  title="键盘标题"  extra-key="."  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

    配置多个按键

    当 theme 为 custom 时,支持以数组的形式配置两个 extra-key。

    配置多个按键

    <van-cell plain type="primary" @touchstart.stop="show = true">  弹出配置多个按键的键盘</van-cell><van-number-keyboard  :show="show"  :extra-key="['00', '.']"  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

    随机数字键盘

    通过 random-key-order 属性可以随机排序数字键盘,常用于安全等级较高的场景。

    随机数字键盘

    <van-cell @touchstart.stop="show = true"> 弹出配置随机数字的键盘 </van-cell><van-number-keyboard  :show="show"  random-key-order  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

    双向绑定

    可以通过 v-model 绑定键盘当前输入值,并通过 maxlength 属性来限制输入长度。

    双向绑定

    <van-field v-model="value" readonly clickable @touchstart.stop="show = true" /><van-number-keyboard  v-model="value"  :show="show"  :maxlength="6"  @blur="show = false"/>
    import { ref } from 'vue';export default {  setup() {    const show = ref(true);    const value = ref('');    return {      show,      value,    };  },};

    API

    Props

    参数说明类型默认值
    v-model当前输入值string-
    show是否显示键盘boolean-
    title键盘标题string-
    theme样式风格,可选值为 customstringdefault
    maxlength输入值最大长度number | string-
    transition是否开启过场动画booleantrue
    z-index键盘 z-index 层级number | string100
    extra-key底部额外按键的内容string | string[]''
    close-button-text关闭按钮文字,空则不展示string-
    delete-button-text删除按钮文字,空则展示删除图标string-
    close-button-loading是否将关闭按钮设置为加载中状态,仅在 theme="custom" 时有效booleanfalse
    show-delete-key是否展示删除图标booleantrue
    blur-on-close v3.0.6是否在点击关闭按钮时触发 blur 事件booleantrue
    hide-on-click-outside是否在点击外部时收起键盘booleantrue
    teleport指定挂载的节点,用法示例string | Element-
    safe-area-inset-bottom是否开启底部安全区适配booleantrue
    random-key-order是否将通过随机顺序展示按键booleanfalse

    Events

    事件名说明回调参数
    input点击按键时触发key: 按键内容
    delete点击删除键时触发-
    close点击关闭按钮时触发-
    blur点击关闭按钮或非键盘区域时触发-
    show键盘完全弹出时触发-
    hide键盘完全收起时触发-

    Slots

    名称说明
    delete自定义删除按键内容
    extra-key自定义左下角按键内容
    title-left自定义标题栏左侧内容

    样式变量

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

    名称默认值描述
    --van-number-keyboard-background-colorvar(--van-gray-2)-
    --van-number-keyboard-key-height48px-
    --van-number-keyboard-key-font-size28px-
    --van-number-keyboard-key-active-colorvar(--van-gray-3)-
    --van-number-keyboard-delete-font-sizevar(--van-font-size-lg)-
    --van-number-keyboard-title-colorvar(--van-gray-7)-
    --van-number-keyboard-title-height34px-
    --van-number-keyboard-title-font-sizevar(--van-font-size-lg)-
    --van-number-keyboard-close-padding0 var(--van-padding-md)-
    --van-number-keyboard-close-colorvar(--van-text-link-color)-
    --van-number-keyboard-close-font-sizevar(--van-font-size-md)-
    --van-number-keyboard-button-text-colorvar(--van-white)-
    --van-number-keyboard-button-background-colorvar(--van-primary-color)-
    --van-number-keyboard-z-index100-

    常见问题

    在桌面端无法操作组件?

    参见桌面端适配


    介绍

    带网格的输入框组件,可以用于输入密码、短信验证码等场景,通常与数字键盘组件配合使用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { PasswordInput, NumberKeyboard } from 'vant';const app = createApp();app.use(PasswordInput);app.use(NumberKeyboard);

    代码演示

    基础用法

    搭配数字键盘组件来实现密码输入功能。


    <!-- 密码输入框 --><van-password-input  :value="value"  :focused="showKeyboard"  @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard  v-model="value"  :show="showKeyboard"  @blur="showKeyboard = false"/>
    import { ref } from 'vue';export default {  setup() {    const value = ref('123');    const showKeyboard = ref(true);    return {      value,      showKeyboard,    };  },};

    自定义长度

    通过 length 属性来设置密码长度。


    <van-password-input  :value="value"  :length="4"  :focused="showKeyboard"  @focus="showKeyboard = true"/>

    格子间距

    通过 gutter 属性来设置格子之间的间距。


    <van-password-input  :value="value"  :gutter="10"  :focused="showKeyboard"  @focus="showKeyboard = true"/>

    明文展示

    将 mask 设置为 false 可以明文展示输入的内容,适用于短信验证码等场景。


    <van-password-input  :value="value"  :mask="false"  :focused="showKeyboard"  @focus="showKeyboard = true"/>

    提示信息

    通过 info 属性设置提示信息,通过 error-info 属性设置错误提示,例如当输入六位时提示密码错误。


    <van-password-input  :value="value"  info="密码为 6 位数字"  :error-info="errorInfo"  :focused="showKeyboard"  @focus="showKeyboard = true"/><van-number-keyboard  v-model="value"  :show="showKeyboard"  @blur="showKeyboard = false"/>
    import { ref, watch } from 'vue';export default {  setup() {    const value = ref('123');    const errorInfo = ref('');    const showKeyboard = ref(true);    watch(value, (newVal) => {      if (newVal.length === 6 && newVal !== '123456') {        errorInfo.value = '密码错误';      } else {        errorInfo.value = '';      }    });    return {      value,      errorInfo,      showKeyboard,    };  },};

    API

    Props

    参数说明类型默认值
    value密码值string''
    info输入框下方文字提示string-
    error-info输入框下方错误提示string-
    length密码最大长度number | string6
    gutter输入框格子之间的间距,如 20px 2em,默认单位为pxnumber | string0
    mask是否隐藏密码内容booleantrue
    focused是否已聚焦,聚焦时会显示光标booleanfalse

    Events

    事件名说明回调参数
    focus输入框聚焦时触发-

    样式变量

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

    名称默认值描述
    --van-password-input-height50px-
    --van-password-input-margin0 var(--van-padding-md)-
    --van-password-input-font-size20px-
    --van-password-input-border-radius6px-
    --van-password-input-background-colorvar(--van-white)-
    --van-password-input-info-colorvar(--van-gray-6)-
    --van-password-input-info-font-sizevar(--van-font-size-md)-
    --van-password-input-error-info-colorvar(--van-danger-color)-
    --van-password-input-dot-size10px-
    --van-password-input-dot-colorvar(--van-black)-
    --van-password-input-cursor-colorvar(--van-text-color)-
    --van-password-input-cursor-width1px-
    --van-password-input-cursor-height40%-
    --van-password-input-cursor-animation-duration1s-


    介绍

    提供多个选项集合供用户选择,支持单列选择和多列级联,通常与弹出层组件配合使用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Picker } from 'vant';const app = createApp();app.use(Picker);

    代码演示

    基础用法

    选项配置

    Picker 组件通过 columns 属性配置选项数据,columns 是一个包含字符串或对象的数组。

    顶部栏

    顶部栏包含标题、确认按钮和取消按钮,点击确认按钮触发 confirm 事件,点击取消按钮触发 cancel 事件。

    基础用法

    <van-picker  title="标题"  :columns="columns"  @confirm="onConfirm"  @cancel="onCancel"  @change="onChange"/>
    import { Toast } from 'vant';export default {  setup() {    const columns = ['杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '金华'];    const onConfirm = (value, index) => {      Toast(`当前值: ${value}, 当前索引: ${index}`);    };    const onChange = (value, index) => {      Toast(`当前值: ${value}, 当前索引: ${index}`);    };    const onCancel = () => Toast('取消');    return {      columns,      onChange,      onCancel,      onConfirm,    };  },};

    默认选中项

    单列选择时,可以通过 default-index 属性设置初始选中项的索引。

    默认选中

    <van-picker title="标题" :columns="columns" :default-index="2" />

    多列选择

    columns 属性可以通过对象数组的形式配置多列选择,对象中可以配置选项数据、初始选中项等,详细格式见下方表格

    多列选择

    <van-picker title="标题" :columns="columns" />
    export default {  setup() {    const columns = [      // 第一列      {        values: ['周一', '周二', '周三', '周四', '周五'],        defaultIndex: 2,      },      // 第二列      {        values: ['上午', '下午', '晚上'],        defaultIndex: 1,      },    ];    return { columns };  },};

    级联选择

    使用 columns 的 children 字段可以实现选项级联的效果。如果级联层级较多,推荐使用 Cascader 级联选项组件

    级联选择

    <van-picker title="标题" :columns="columns" />
    export default {  setup() {    const columns = [      {        text: '浙江',        children: [          {            text: '杭州',            children: [{ text: '西湖区' }, { text: '余杭区' }],          },          {            text: '温州',            children: [{ text: '鹿城区' }, { text: '瓯海区' }],          },        ],      },      {        text: '福建',        children: [          {            text: '福州',            children: [{ text: '鼓楼区' }, { text: '台江区' }],          },          {            text: '厦门',            children: [{ text: '思明区' }, { text: '海沧区' }],          },        ],      },    ];    return { columns };  },};
    级联选择的数据嵌套深度需要保持一致,如果部分选项没有子选项,可以使用空字符串进行占位。

    禁用选项

    选项可以为对象结构,通过设置 disabled 来禁用该选项。

    禁用选项

    <van-picker :columns="columns" />
    export default {  setup() {    const columns = [      { text: '杭州', disabled: true },      { text: '宁波' },      { text: '温州' },    ];    return { columns };  },};

    动态设置选项

    通过 Picker 上的实例方法可以更灵活地控制选择器,比如使用 setColumnValues 方法实现多列联动。

    动态选项设置

    <van-picker ref="picker" :columns="columns" @change="onChange" />
    import { ref } from 'vue';export default {  setup() {    const picker = ref(null);    const cities = {      浙江: ['杭州', '宁波', '温州', '嘉兴', '湖州'],      福建: ['福州', '厦门', '莆田', '三明', '泉州'],    };    const columns = [      { values: Object.keys(cities) },      { values: cities['浙江'] },    ];    const onChange = (values) => {      picker.value.setColumnValues(1, cities[values[0]]);    };    return {      picker,      columns,      onChange,    };  },};

    加载状态

    若选择器数据是异步获取的,可以通过 loading 属性显示加载提示。

    加载状态

    <van-picker :columns="state.columns" :loading="state.loading" />
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      columns: [],      loading: true,    });    setTimeout(() => {      state.loading = false;      state.columns = ['选项'];    }, 1000);    return { state };  },};

    搭配弹出层使用

    在实际场景中,Picker 通常作为用于辅助表单填写,可以搭配 Popup 和 Field 实现该效果。

    搭配弹出层使用

    <van-field  v-model="state.value"  readonly  clickable  label="城市"  placeholder="选择城市"  @click="state.showPicker = true"/><van-popup v-model:show="state.showPicker" round position="bottom">  <van-picker    :columns="columns"    @cancel="state.showPicker = false"    @confirm="onConfirm"  /></van-popup>
    import { reactive } from 'vue';export default {  setup() {    const columns = ['杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '金华'];    const state = reactive({      value: '',      showPicker: false,    });    const onConfirm = (value) => {      state.value = value;      state.showPicker = false;    };    return {      state,      columns,      onConfirm,    };  },};

    自定义 Columns 的结构

    自定义

    <van-picker  :title="标题"  :columns="columns"  :columns-field-names="customFieldName"/>
    export default {  setup() {    const columns = [      {        cityName: '浙江',        cities: [          {            cityName: '杭州',            cities: [{ cityName: '西湖区' }, { cityName: '余杭区' }],          },          {            cityName: '温州',            cities: [{ cityName: '鹿城区' }, { cityName: '瓯海区' }],          },        ],      },      {        cityName: '福建',        cities: [          {            cityName: '福州',            cities: [{ cityName: '鼓楼区' }, { cityName: '台江区' }],          },          {            cityName: '厦门',            cities: [{ cityName: '思明区' }, { cityName: '海沧区' }],          },        ],      },    ];    const customFieldName = {      text: 'cityName',      children: 'cities',    };    return {      columns,      customFieldName,    };  },};

    API

    Props

    参数说明类型默认值
    columns对象数组,配置每一列显示的数据Column[][]
    columns-field-names自定义 columns 结构中的字段object{ text: 'text', values: 'values', children: 'children' }
    title顶部栏标题string-
    confirm-button-text确认按钮文字string确认
    cancel-button-text取消按钮文字string取消
    toolbar-position顶部栏位置,可选值为 bottomstringtop
    loading是否显示加载状态booleanfalse
    show-toolbar是否显示顶部栏booleantrue
    allow-html是否允许选项内容中渲染 HTMLbooleanfalse
    default-index单列选择时,默认选中项的索引number | string0
    item-height选项高度,支持 px vw vh rem 单位,默认 pxnumber | string44
    visible-item-count可见的选项个数number | string6
    swipe-duration快速滑动时惯性滚动的时长,单位 msnumber | string1000

    Events

    当选择器有多列时,事件回调参数会返回数组。

    事件名说明回调参数
    confirm点击完成按钮时触发单列:选中值,选中值对应的索引
    多列:所有列选中值,所有列选中值对应的索引
    cancel点击取消按钮时触发单列:选中值,选中值对应的索引
    多列:所有列选中值,所有列选中值对应的索引
    change选项改变时触发单列:选中值,选中值对应的索引
    多列:所有列选中值,当前列对应的索引

    Slots

    名称说明参数
    toolbar v3.1.2自定义整个顶部栏的内容-
    title自定义标题内容-
    confirm自定义确认按钮内容-
    cancel自定义取消按钮内容-
    option自定义选项内容option: string | object
    columns-top自定义选项上方内容-
    columns-bottom自定义选项下方内容-

    Column 数据结构

    当传入多列数据时,columns 为一个对象数组,数组中的每一个对象配置每一列,每一列有以下 key:

    键名说明类型
    values列中对应的备选值Array<string | number>
    defaultIndex初始选中项的索引,默认为 0number
    className为对应列添加额外的类名string | Array | object
    children级联选项Column

    方法

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

    方法名说明参数返回值
    getValues获取所有列选中的值-values
    setValues设置所有列选中的值values-
    getIndexes获取所有列选中值对应的索引-indexes
    setIndexes设置所有列选中值对应的索引indexes-
    getColumnValue获取对应列选中的值columnIndexvalue
    setColumnValue设置对应列选中的值columnIndex, value-
    getColumnIndex获取对应列选中项的索引columnIndexoptionIndex
    setColumnIndex设置对应列选中项的索引columnIndex, optionIndex-
    getColumnValues获取对应列中所有选项columnIndexvalues
    setColumnValues设置对应列中所有选项columnIndex, values-
    confirm停止惯性滚动并触发 confirm 事件--

    样式变量

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

    名称默认值描述
    --van-picker-background-colorvar(--van-white)-
    --van-picker-toolbar-height44px-
    --van-picker-title-font-sizevar(--van-font-size-lg)-
    --van-picker-title-line-heightvar(--van-line-height-md)-
    --van-picker-action-padding0 var(--van-padding-md)-
    --van-picker-action-font-sizevar(--van-font-size-md)-
    --van-picker-confirm-action-colorvar(--van-text-link-color)-
    --van-picker-cancel-action-colorvar(--van-gray-6)-
    --van-picker-option-padding0 var(--van-padding-base)-
    --van-picker-option-font-sizevar(--van-font-size-lg)-
    --van-picker-option-text-colorvar(--van-black)-
    --van-picker-option-disabled-opacity0.3-
    --van-picker-loading-icon-colorvar(--van-primary-color)-
    --van-picker-loading-mask-colorrgba(255, 255, 255, 0.9)-

    常见问题

    在桌面端无法操作组件?

    参见桌面端适配


    介绍

    在一组备选项中进行单选。

    实例演示

    引入

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

    import { createApp } from 'vue';import { RadioGroup, Radio } from 'vant';const app = createApp();app.use(Radio);app.use(RadioGroup);

    代码演示

    基础用法

    通过 v-model 绑定值当前选中项的 name。


    <van-radio-group v-model="checked">  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>
    import { ref } from 'vue';export default {  setup() {    const checked = ref('1');    return { checked };  },};

    水平排列

    将 direction 属性设置为 horizontal 后,单选框组会变成水平排列。


    <van-radio-group v-model="checked" direction="horizontal">  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>

    禁用状态

    通过 disabled 属性禁止选项切换,在 Radio 上设置 disabled 可以禁用单个选项。


    <van-radio-group v-model="checked" disabled>  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>

    自定义形状

    将 shape 属性设置为 square,单选框的形状会变成方形。


    <van-radio-group v-model="checked">  <van-radio name="1" shape="square">单选框 1</van-radio>  <van-radio name="2" shape="square">单选框 2</van-radio></van-radio-group>

    自定义颜色

    通过 checked-color 属性设置选中状态的图标颜色。


    <van-radio-group v-model="checked">  <van-radio name="1" checked-color="#ee0a24">单选框 1</van-radio>  <van-radio name="2" checked-color="#ee0a24">单选框 2</van-radio></van-radio-group>

    自定义大小

    通过 icon-size 属性可以自定义图标的大小。


    <van-radio-group v-model="checked">  <van-radio name="1" icon-size="24px">单选框 1</van-radio>  <van-radio name="2" icon-size="24px">单选框 2</van-radio></van-radio-group>

    自定义图标

    通过 icon 插槽自定义图标,并通过 slotProps 判断是否为选中状态。


    <van-radio-group v-model="checked">  <van-radio name="1">    单选框 1    <template #icon="props">      <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" />    </template>  </van-radio>  <van-radio name="2">    单选框 2    <template #icon="props">      <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" />    </template>  </van-radio></van-radio-group><style>  .img-icon {    height: 20px;  }</style>
    import { ref } from 'vue';export default {  setup() {    const checked = ref('1');    return {      checked,      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

    禁用文本点击

    设置 label-disabled 属性后,点击图标以外的内容不会触发单选框切换。


    <van-radio-group v-model="checked">  <van-radio name="1" label-disabled>单选框 1</van-radio>  <van-radio name="2" label-disabled>单选框 2</van-radio></van-radio-group>

    与 Cell 组件一起使用

    此时你需要再引入 Cell 和 CellGroup 组件。


    <van-radio-group v-model="checked">  <van-cell-group>    <van-cell title="单选框 1" clickable @click="checked = '1'">      <template #right-icon>        <van-radio name="1" />      </template>    </van-cell>    <van-cell title="单选框 2" clickable @click="checked = '2'">      <template #right-icon>        <van-radio name="2" />      </template>    </van-cell>  </van-cell-group></van-radio-group>

    API

    Radio Props

    参数说明类型默认值
    name标识符any-
    shape形状,可选值为 squarestringround
    disabled是否为禁用状态booleanfalse
    label-disabled是否禁用文本内容点击booleanfalse
    label-position文本位置,可选值为 leftstringright
    icon-size图标大小,默认单位为pxnumber | string20px
    checked-color选中状态颜色string#1989fa

    RadioGroup Props

    参数说明类型默认值
    v-model当前选中项的标识符any-
    disabled是否禁用所有单选框booleanfalse
    direction排列方向,可选值为horizontalstringvertical
    icon-size所有单选框的图标大小,默认单位为pxnumber | string20px
    checked-color所有单选框的选中状态颜色string#1989fa

    Radio Events

    事件名说明回调参数
    click点击单选框时触发event: MouseEvent

    RadioGroup Events

    事件名说明回调参数
    change当绑定值变化时触发的事件name: string

    Radio Slots

    名称说明参数
    default自定义文本-
    icon自定义图标{ checked: boolean, disabled: boolean }

    样式变量

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

    名称默认值描述
    --van-radio-size20px-
    --van-radio-border-colorvar(--van-gray-5)-
    --van-radio-transition-durationvar(--van-animation-duration-fast)-
    --van-radio-label-marginvar(--van-padding-xs)-
    --van-radio-label-colorvar(--van-text-color)-
    --van-radio-checked-icon-colorvar(--van-primary-color)-
    --van-radio-disabled-icon-colorvar(--van-gray-5)-
    --van-radio-disabled-label-colorvar(--van-gray-5)-
    --van-radio-disabled-background-colorvar(--van-border-color)-


    介绍

    用于对事物进行评级操作。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Rate } from 'vant';const app = createApp();app.use(Rate);

    代码演示

    基础用法

    通过 v-model 来绑定当前评分值。


    <van-rate v-model="value" />
    import { ref } from 'vue';export default {  setup() {    const value = ref(3);    return { value };  },};

    自定义图标

    通过 icon 属性设置选中时的图标,void-icon 属性设置未选中时的图标。


    <van-rate v-model="value" icon="like" void-icon="like-o" />

    自定义样式

    通过 size 属性设置图标大小,color 属性设置选中时的颜色,void-color 设置未选中时的颜色。


    <van-rate  v-model="value"  :size="25"  color="#ffd21e"  void-icon="star"  void-color="#eee"/>

    半星

    设置 allow-half 属性后可以选中半星。


    <van-rate v-model="value" allow-half />
    import { ref } from 'vue';export default {  setup() {    const value = ref(2.5);    return { value };  },};

    自定义数量

    通过 count 属性设置评分总数。


    <van-rate v-model="value" :count="6" />

    禁用状态

    通过 disabled 属性来禁用评分。


    <van-rate v-model="value" disabled />

    只读状态

    通过 readonly 属性将评分设置为只读状态。


    <van-rate v-model="value" readonly />

    只读状态显示小数

    设置 readonly 和 allow-half 属性后,Rate 组件可以展示任意小数结果。


    <van-rate v-model="value" readonly allow-half />
    import { ref } from 'vue';export default {  setup() {    const value = ref(3.3);    return { value };  },};

    监听 change 事件

    评分变化时,会触发 change 事件。


    <van-rate v-model="value" @change="onChange" />
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(3);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      onChange,    };  },};

    API

    Props

    参数说明类型默认值
    v-model当前分值number-
    count图标总数number | string5
    size图标大小,默认单位为pxnumber | string20px
    gutter图标间距,默认单位为pxnumber | string4px
    color选中时的颜色string#ee0a24
    void-color未选中时的颜色string#c8c9cc
    disabled-color禁用时的颜色string#c8c9cc
    icon选中时的图标名称或图片链接stringstar
    void-icon未选中时的图标名称或图片链接stringstar-o
    icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
    allow-half是否允许半选booleanfalse
    readonly是否为只读状态,只读状态下无法修改评分booleanfalse
    disabled是否禁用评分booleanfalse
    touchable是否可以通过滑动手势选择评分booleantrue

    Events

    事件名说明回调参数
    change当前分值变化时触发的事件当前分值

    样式变量

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

    名称默认值描述
    --van-rate-icon-size20px-
    --van-rate-icon-guttervar(--van-padding-base)-
    --van-rate-icon-void-colorvar(--van-gray-5)-
    --van-rate-icon-full-colorvar(--van-danger-color)-
    --van-rate-icon-disabled-colorvar(--van-gray-5)-


    介绍

    用于搜索场景的输入框组件。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Search } from 'vant';const app = createApp();app.use(Search);

    代码演示

    基础用法

    v-model 用于控制搜索框中的文字,background 可以自定义搜索框外部背景色。


    <van-search v-model="value" placeholder="请输入搜索关键词" />
    import { ref } from 'vue';export default {  setup() {    const value = ref('');    return { value };  },};

    事件监听

    Search 组件提供了 search 和 cancel 事件,search 事件在点击键盘上的搜索/回车按钮后触发,cancel 事件在点击搜索框右侧取消按钮时触发。


    <form action="/">  <van-search    v-model="value"    show-action    placeholder="请输入搜索关键词"    @search="onSearch"    @cancel="onCancel"  /></form>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref('');    const onSearch = (val) => Toast(val);    const onCancel = () => Toast('取消');    return {      value,      onSearch,      onCancel,    };  },};
    Tips: 在 van-search 外层增加 form 标签,且 action 不为空,即可在 iOS 输入法中显示搜索按钮。

    搜索框内容对齐

    通过 input-align 属性设置搜索框内容的对齐方式,可选值为 center、right。


    <van-search  v-model="value"  placeholder="请输入搜索关键词"  input-align="center"/>

    禁用搜索框

    通过 disabled 属性禁用搜索框。


    <van-search v-model="value" disabled placeholder="请输入搜索关键词" />

    自定义背景色

    通过 background 属性可以设置搜索框外部的背景色,通过 shape 属性设置搜索框的形状,可选值为 round。


    <van-search  v-model="value"  shape="round"  background="#4fc08d"  placeholder="请输入搜索关键词"/>

    自定义按钮

    使用 action 插槽可以自定义右侧按钮的内容。使用插槽后,cancel 事件将不再触发。


    <van-search  v-model="value"  show-action  label="地址"  placeholder="请输入搜索关键词"  @search="onSearch">  <template #action>    <div @click="onSearch">搜索</div>  </template></van-search>

    API

    Props

    参数说明类型默认值
    label搜索框左侧文本string-
    shape搜索框形状,可选值为 roundstringsquare
    background搜索框外部背景色string#f2f2f2
    maxlength输入的最大字符数number | string-
    placeholder占位提示文字string-
    clearable是否启用清除图标,点击清除图标后会清空输入框booleantrue
    clear-icon v3.0.12清除图标名称或图片链接stringclear
    clear-trigger显示清除图标的时机,always 表示输入框不为空时展示,
    focus 表示输入框聚焦且不为空时展示
    stringfocus
    autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
    show-action是否在搜索框右侧显示取消按钮booleanfalse
    action-text取消按钮文字boolean取消
    disabled是否禁用输入框booleanfalse
    readonly是否将输入框设为只读状态,只读状态下无法输入内容booleanfalse
    error是否将输入内容标红booleanfalse
    error-message底部错误提示文案,为空时不展示string-
    formatter v3.0.12输入内容格式化函数(val: string) => string-
    format-trigger v3.0.12格式化函数触发的时机,可选值为 onBlurstringonChange
    input-align输入框内容对齐方式,可选值为 center rightstringleft
    left-icon输入框左侧图标名称或图片链接stringsearch
    right-icon输入框右侧图标名称或图片链接string-

    Events

    事件名说明回调参数
    search确定搜索时触发value: string (当前输入的值)
    update:model-value输入框内容变化时触发value: string (当前输入的值)
    focus输入框获得焦点时触发event: Event
    blur输入框失去焦点时触发event: Event
    click-input点击输入区域时触发event: MouseEvent
    clear点击清除按钮后触发event: MouseEvent
    cancel点击取消按钮时触发-

    方法

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

    方法名说明参数返回值
    focus获取输入框焦点--
    blur取消输入框焦点--

    Slots

    名称说明
    left自定义左侧内容(搜索框外)
    action自定义右侧内容(搜索框外),设置show-action属性后展示
    label自定义左侧文本(搜索框内)
    left-icon自定义左侧图标(搜索框内)
    right-icon自定义右侧图标(搜索框内)

    样式变量

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

    名称默认值描述
    --van-search-padding10px var(--van-padding-sm)-
    --van-search-background-colorvar(--van-white)-
    --van-search-content-background-colorvar(--van-gray-1)-
    --van-search-input-height34px-
    --van-search-label-padding0 5px-
    --van-search-label-colorvar(--van-text-color)-
    --van-search-label-font-sizevar(--van-font-size-md)-
    --van-search-left-icon-colorvar(--van-gray-6)-
    --van-search-action-padding0 var(--van-padding-xs)-
    --van-search-action-text-colorvar(--van-text-color)-
    --van-search-action-font-sizevar(--van-font-size-md)-

    常见问题

    在桌面端点击清除按钮无效?

    清除按钮监听是的移动端 Touch 事件,参见桌面端适配


    介绍

    滑动输入条,用于在给定的范围内选择一个值。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Slider } from 'vant';const app = createApp();app.use(Slider);

    代码演示

    基础用法


    <van-slider v-model="value" @change="onChange" />
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(50);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      onChange,    };  },};

    双滑块

    添加 range 属性就可以开启双滑块模式,确保 value 的值是一个数组。


    <van-slider v-model="value" range @change="onChange" />
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    // 双滑块模式时,值必须是数组    const value = ref([10, 50]);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      onChange,    };  },};

    指定选择范围


    <van-slider v-model="value" :min="-50" :max="50" />

    禁用


    <van-slider v-model="value" disabled />

    指定步长


    <van-slider v-model="value" :step="10" />

    自定义样式


    <van-slider v-model="value" bar-height="4px" active-color="#ee0a24" />

    自定义按钮


    <van-slider v-model="value" active-color="#ee0a24">  <template #button>    <div class="custom-button">{{ value }}</div>  </template></van-slider><style>  .custom-button {    width: 26px;    color: #fff;    font-size: 10px;    line-height: 18px;    text-align: center;    background-color: #ee0a24;    border-radius: 100px;  }</style>

    垂直方向

    设置 vertical 属性后,滑块会垂直展示,且高度为 100% 父元素高度。


    <div :style="{ height: '150px' }">  <van-slider v-model="value" vertical @change="onChange" />  <van-slider    v-model="value2"    range    vertical    style="margin-left: 100px;"    @change="onChange"  /></div>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(50);    const value2 = ref([10, 50]);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      value2,      onChange,    };  },};

    API

    Props

    参数说明类型默认值
    v-model当前进度百分比,在双滑块模式下为数组格式number | [number, number]0
    max最大值number | string100
    min最小值number | string0
    step步长number | string1
    bar-height进度条高度,默认单位为 pxnumber | string2px
    button-size滑块按钮大小,默认单位为 pxnumber | string24px
    active-color进度条激活态颜色string#1989fa
    inactive-color进度条非激活态颜色string#e5e5e5
    range是否开启双滑块模式booleanfalse
    disabled是否禁用滑块booleanfalse
    readonly v3.0.5是否为只读状态,只读状态下无法修改滑块的值booleanfalse
    vertical是否垂直展示booleanfalse

    Events

    事件名说明回调参数
    update:model-value进度变化时实时触发value: number
    change进度变化且结束拖动后触发value: number
    drag-start开始拖动时触发event: TouchEvent
    drag-end结束拖动时触发event: TouchEvent

    Slots

    名称说明参数
    button自定义滑块按钮{ value: number }
    left-button v3.1.3自定义左侧滑块按钮(双滑块模式下){ value: number }
    right-button v3.1.3自定义右侧滑块按钮 (双滑块模式下){ value: number }

    样式变量

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

    名称默认值描述
    --van-slider-active-background-colorvar(--van-primary-color)-
    --van-slider-inactive-background-colorvar(--van-gray-3)-
    --van-slider-disabled-opacityvar(--van-disabled-opacity)-
    --van-slider-bar-height2px-
    --van-slider-button-width24px-
    --van-slider-button-height24px-
    --van-slider-button-border-radius50%-
    --van-slider-button-background-colorvar(--van-white)-
    --van-slider-button-box-shadow0 1px 2px rgba(0, 0, 0, 0.5)-


    介绍

    步进器由增加按钮、减少按钮和输入框组成,用于在一定范围内输入、调整数字。

    实例演示

    引入

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


    import { createApp } from 'vue';import { Stepper } from 'vant';const app = createApp();app.use(Stepper);

    代码演示

    基础用法

    通过 v-model 绑定输入值,可以通过 change 事件监听到输入值的变化。

    <van-stepper v-model="value" />
    import { ref } from 'vue';export default {  setup() {    const value = ref(1);    return { value };  },};

    步长设置

    通过 step 属性设置每次点击增加或减少按钮时变化的值,默认为 1。

    <van-stepper v-model="value" step="2" />

    限制输入范围

    通过 min 和 max 属性限制输入值的范围。

    <van-stepper v-model="value" min="5" max="8" />

    限制输入整数

    设置 integer 属性后,输入框将限制只能输入整数。

    <van-stepper v-model="value" integer />

    禁用状态

    通过设置 disabled 属性来禁用步进器,禁用状态下无法点击按钮或修改输入框。

    <van-stepper v-model="value" disabled />

    禁用输入框

    通过设置 disable-input 属性来禁用输入框,此时按钮仍然可以点击。

    <van-stepper v-model="value" disable-input />

    固定小数位数

    通过设置 decimal-length 属性可以保留固定的小数位数。

    <van-stepper v-model="value" step="0.2" :decimal-length="1" />

    自定义大小

    通过 input-width 属性设置输入框宽度,通过 button-size 属性设置按钮大小和输入框高度。

    <van-stepper v-model="value" input-width="40px" button-size="32px" />

    异步变更

    通过 before-change 属性可以在输入值变化前进行校验和拦截。

    <van-stepper v-model="value" :before-change="beforeChange" />
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(1);    const beforeChange = (value) => {      Toast.loading({ forbidClick: true });      return new Promise((resolve) => {        setTimeout(() => {          Toast.clear();          // 在 resolve 函数中返回 true 或 false          resolve(true);        }, 500);      });    };    return {      value,      beforeChange,    };  },};

    圆角风格

    将 theme 设置为 round 来展示圆角风格的步进器。

    <van-stepper v-model="value" theme="round" button-size="22" disable-input />

    API

    Props

    参数说明类型默认值
    v-model当前输入的值number | string-
    min最小值number | string1
    max最大值number | string-
    default-value初始值,当 v-model 为空时生效number | string1
    step步长,每次点击时改变的值number | string1
    name标识符,可以在 change 事件回调参数中获取number | string-
    input-width输入框宽度,默认单位为 pxnumber | string32px
    button-size按钮大小以及输入框高度,默认单位为 pxnumber | string28px
    decimal-length固定显示的小数位数number | string-
    theme样式风格,可选值为 roundstring-
    placeholder输入框占位提示文字string-
    integer是否只允许输入整数booleanfalse
    disabled是否禁用步进器booleanfalse
    disable-plus是否禁用增加按钮booleanfalse
    disable-minus是否禁用减少按钮booleanfalse
    disable-input是否禁用输入框booleanfalse
    before-change输入值变化前的回调函数,返回 false 可阻止输入,支持返回 Promise(value: number | string) => boolean | Promise<boolean>false
    show-plus是否显示增加按钮booleantrue
    show-minus是否显示减少按钮booleantrue
    show-input是否显示输入框booleantrue
    long-press是否开启长按手势booleantrue
    allow-empty是否允许输入的值为空booleanfalse

    Events

    事件名说明回调参数
    change当绑定值变化时触发的事件value: string, detail: { name: string }
    overlimit点击不可用的按钮时触发-
    plus点击增加按钮时触发-
    minus点击减少按钮时触发-
    focus输入框聚焦时触发event: Event
    blur输入框失焦时触发event: Event

    样式变量

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

    名称默认值描述
    --van-stepper-active-color#e8e8e8-
    --van-stepper-background-colorvar(--van-active-color)-
    --van-stepper-button-icon-colorvar(--van-text-color)-
    --van-stepper-button-disabled-colorvar(--van-background-color)-
    --van-stepper-button-disabled-icon-colorvar(--van-gray-5)-
    --van-stepper-button-round-theme-colorvar(--van-danger-color)-
    --van-stepper-input-width32px-
    --van-stepper-input-height28px-
    --van-stepper-input-font-sizevar(--van-font-size-md)-
    --van-stepper-input-line-heightnormal-
    --van-stepper-input-text-colorvar(--van-text-color)-
    --van-stepper-input-disabled-text-colorvar(--van-gray-5)-
    --van-stepper-input-disabled-background-colorvar(--van-active-color)-
    --van-stepper-border-radiusvar(--van-border-radius-md)-

    常见问题

    为什么 value 有时候会变成 string 类型?

    这是因为用户输入过程中可能出现小数点或空值,比如 1.,这种情况下组件会抛出字符串类型。

    如果希望 value 保持 number 类型,可以在 v-model 上添加 number 修饰符:

    <van-stepper v-model.number="value" />


    介绍

    用于在打开和关闭状态之间进行切换。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Switch } from 'vant';const app = createApp();app.use(Switch);

    代码演示

    基础用法

    通过 v-model 绑定开关的选中状态,true 表示开,false 表示关。

    <van-switch v-model="checked" />
    import { ref } from 'vue';export default {  setup() {    const checked = ref(true);    return { checked };  },};

    禁用状态

    通过 disabled 属性来禁用开关,禁用状态下开关不可点击。

    <van-switch v-model="checked" disabled />

    加载状态

    通过 loading 属性设置开关为加载状态,加载状态下开关不可点击。

    <van-switch v-model="checked" loading />

    自定义大小

    通过 size 属性自定义开关的大小。

    <van-switch v-model="checked" size="24px" />

    自定义颜色

    active-color 属性表示打开时的背景色,inactive-color 表示关闭时的背景色。

    <van-switch v-model="checked" active-color="#ee0a24" inactive-color="#dcdee0" />

    异步控制

    需要异步控制开关时,可以使用 modelValue 属性和 update:model-value 事件代替 v-model,并在事件回调函数中手动处理开关状态。

    <van-switch :model-value="checked" @update:model-value="onUpdateValue" />
    import { ref } from 'vue';import { Dialog } from 'vant';export default {  setup() {    const checked = ref(true);    const onUpdateValue = (newValue) => {      Dialog.confirm({        title: '提醒',        message: '是否切换开关?',      }).then(() => {        checked.value = newValue;      });    };    return {      checked,      onUpdateValue,    };  },};

    搭配单元格使用

    <van-cell center title="标题">  <template #right-icon>    <van-switch v-model="checked" size="24" />  </template></van-cell>

    API

    Props

    参数说明类型默认值
    v-model开关选中状态anyfalse
    loading是否为加载状态booleanfalse
    disabled是否为禁用状态booleanfalse
    size开关尺寸,默认单位为pxnumber | string30px
    active-color打开时的背景色string#1989fa
    inactive-color关闭时的背景色stringwhite
    active-value打开时对应的值anytrue
    inactive-value关闭时对应的值anyfalse

    Events

    事件名说明回调参数
    change开关状态切换时触发value: any
    click点击时触发event: MouseEvent

    样式变量

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

    名称默认值描述
    --van-switch-size30px-
    --van-switch-width2em-
    --van-switch-height1em-
    --van-switch-node-size1em-
    --van-switch-node-background-colorvar(--van-white)-
    --van-switch-node-box-shadow0 3px 1px 0 rgba(0, 0, 0, 0.05)-
    --van-switch-background-colorvar(--van-white)-
    --van-switch-on-background-colorvar(--van-primary-color)-
    --van-switch-transition-durationvar(--van-animation-duration-base)-
    --van-switch-disabled-opacityvar(--van-disabled-opacity)-
    --van-switch-bordervar(--van-border-width-base) solid rgba(0, 0, 0, 0.1)-


    介绍

    用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图和上传进度。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Uploader } from 'vant';const app = createApp();app.use(Uploader);

    代码演示

    基础用法

    文件上传完毕后会触发 after-read 回调函数,获取到对应的 file 对象。

    <van-uploader :after-read="afterRead" />
    export default {  setup() {    const afterRead = (file) => {      // 此时可以自行将文件上传至服务器      console.log(file);    };    return {      afterRead,    };  },};

    文件预览

    通过 v-model 可以绑定已经上传的文件列表,并展示文件列表的预览图。

    <van-uploader v-model="fileList" multiple />
    import { ref } from 'vue';export default {  setup() {    const fileList = ref([      { url: 'https://img.yzcdn.cn/vant/leaf.jpg' },      // Uploader 根据文件后缀来判断是否为图片文件      // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明      { url: 'https://cloud-image', isImage: true },    ]);    return {      fileList,    };  },};

    上传状态

    通过 status 属性可以标识上传状态,uploading 表示上传中,failed 表示上传失败,done 表示上传完成。

    <van-uploader v-model="fileList" :after-read="afterRead" />
    import { ref } from 'vue';export default {  setup() {    const fileList = ref([      {        url: 'https://img.yzcdn.cn/vant/leaf.jpg',        status: 'uploading',        message: '上传中...',      },      {        url: 'https://img.yzcdn.cn/vant/tree.jpg',        status: 'failed',        message: '上传失败',      },    ]);    const afterRead = (file) => {      file.status = 'uploading';      file.message = '上传中...';      setTimeout(() => {        file.status = 'failed';        file.message = '上传失败';      }, 1000);    };    return {      fileList,      afterRead,    };  },};

    限制上传数量

    通过 max-count 属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。

    <van-uploader v-model="fileList" multiple :max-count="2" />
    import { ref } from 'vue';export default {  setup() {    const fileList = ref([]);    return {      fileList,    };  },};

    限制上传大小

    通过 max-size 属性可以限制上传文件的大小,超过大小的文件会被自动过滤,这些文件信息可以通过 oversize 事件获取。

    <van-uploader multiple :max-size="500 * 1024" @oversize="onOversize" />
    import { Toast } from 'vant';export default {  setup() {    const onOversize = (file) => {      console.log(file);      Toast('文件大小不能超过 500kb');    };    return {      onOversize,    };  },};

    如果需要针对不同类型的文件来作出不同的大小限制,可以在 max-size 属性中传入一个函数,在函数中通过 file.type 区分文件类型,返回 true 表示超出限制,false 表示未超出限制。

    <van-uploader multiple :max-size="isOverSize" />
    import { Toast } from 'vant';export default {  setup() {    const isOverSize = (file) => {      const maxSize = file.type === 'image/jpeg' ? 500 * 1024 : 1000 * 1024;      return file.size >= maxSize;    };    return {      isOverSize,    };  },};

    自定义上传样式

    通过默认插槽可以自定义上传区域的样式。

    <van-uploader>  <van-button icon="plus" type="primary">上传文件</van-button></van-uploader>

    自定义预览样式

    通过 preview-cover 插槽可以自定义覆盖在预览区域上方的内容。

    <van-uploader v-model="fileList">  <template #preview-cover="{ file }">    <div class="preview-cover van-ellipsis">{{ file.name }}</div>  </template></van-uploader><style>  .preview-cover {    position: absolute;    bottom: 0;    box-sizing: border-box;    width: 100%;    padding: 4px;    color: #fff;    font-size: 12px;    text-align: center;    background: rgba(0, 0, 0, 0.3);  }</style>

    上传前置处理

    通过传入 beforeRead 函数可以在上传前进行校验和处理,返回 true 表示校验通过,返回 false 表示校验失败。支持返回 Promise 对 file 对象进行自定义处理,例如压缩图片。

    <van-uploader :before-read="beforeRead" />
    import { Toast } from 'vant';export default {  setup() {    // 返回布尔值    const beforeRead = (file) => {      if (file.type !== 'image/jpeg') {        Toast('请上传 jpg 格式图片');        return false;      }      return true;    };    // 返回 Promise    const asyncBeforeRead = (file) => {      return new Promise((resolve, reject) => {        if (file.type !== 'image/jpeg') {          Toast('请上传 jpg 格式图片');          reject();        } else {          const img = new File(['foo'], 'bar.jpg', {            type: 'image/jpeg',          });          resolve(img);        }      });    };    return {      beforeRead,      asyncBeforeRead,    };  },};

    禁用文件上传

    通过 disabled 属性禁用文件上传。

    <van-uploader disabled />

    自定义单个图片预览

    在 v-model 数组中设置单个预览图片属性,支持 imageFit deletable previewSize beforeDelete。

    <van-uploader v-model="fileList" :deletable="false" />
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const fileList = ref([      { url: 'https://img.yzcdn.cn/vant/leaf.jpg' },      {        url: 'https://img.yzcdn.cn/vant/sand.jpg',        deletable: true,        beforeDelete: () => {          Toast('自定义单个预览图片的事件和样式');        },      },      {        url: 'https://img.yzcdn.cn/vant/tree.jpg',        deletable: true,        imageFit: 'contain',        previewSize: 120,      },    ]);    return { fileList };  },};

    API

    Props

    参数说明类型默认值
    v-model已上传的文件列表FileListItem[]-
    accept允许上传的文件类型,详细说明stringimage/*
    name标识符,可以在回调函数的第二项参数中获取number | string-
    preview-size预览图和上传区域的尺寸,默认单位为 pxnumber | string80px
    preview-image是否在上传完成后展示预览图booleantrue
    preview-full-image是否在点击预览图后展示全屏图片预览booleantrue
    preview-options全屏图片预览的配置项,可选值见 ImagePreviewobject-
    multiple是否开启图片多选,部分安卓机型不支持booleanfalse
    disabled是否禁用文件上传booleanfalse
    readonly v3.1.5是否将上传区域设置为只读状态booleanfalse
    deletable是否展示删除按钮booleantrue
    show-upload是否展示上传区域booleantrue
    lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
    capture图片选取模式,可选值为 camera (直接调起摄像头)string-
    after-read文件读取完成后的回调函数Function-
    before-read文件读取前的回调函数,返回 false 可终止文件读取,
    支持返回 Promise
    Function-
    before-delete文件删除前的回调函数,返回 false 可终止文件读取,
    支持返回 Promise
    Function-
    max-size v3.0.17文件大小限制,单位为 bytenumber | string | (file: File) => boolean-
    max-count文件上传数量限制number | string-
    result-type文件读取结果类型,可选值为 file textstringdataUrl
    upload-text上传区域文字提示string-
    image-fit预览图裁剪模式,可选值见 Image 组件stringcover
    upload-icon上传区域图标名称或图片链接stringphotograph
    注意:accept、capture 和 multiple 为浏览器 input 标签的原生属性,移动端各种机型对这些属性的支持程度有所差异,因此在不同机型和 WebView 下可能出现一些兼容性问题。

    Events

    事件名说明回调参数
    oversize文件大小超过限制时触发同 after-read
    click-upload v3.1.5点击上传区域时触发event: MouseEvent
    click-preview点击预览图时触发同 after-read
    close-preview关闭全屏图片预览时触发-
    delete删除文件预览时触发同 after-read

    Slots

    名称说明参数
    default自定义上传区域-
    preview-cover自定义覆盖在预览区域上方的内容item: FileListItem

    回调参数

    before-read、after-read、before-delete 执行时会传递以下回调参数:

    参数名说明类型
    filefile 对象object
    detail额外信息,包含 name 和 index 字段object

    ResultType 可选值

    result-type 字段表示文件读取结果的类型,上传大文件时,建议使用 file 类型,避免卡顿。

    描述
    file结果仅包含 File 对象
    text结果包含 File 对象,以及文件的文本内容
    dataUrl结果包含 File 对象,以及文件对应的 base64 编码

    方法

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

    方法名说明参数返回值
    closeImagePreview关闭全屏的图片预览--
    chooseFile主动调起文件选择,由于浏览器安全限制,只有在用户触发操作的上下文中调用才有效--

    类型定义

    通过 UploaderInstance 获取 Uploader 实例的类型定义。

    import { ref } from 'vue';import type { UploaderInstance } from 'vant';const uploaderRef = ref<UploaderInstance>();uploaderRef.value?.chooseFile();

    样式变量

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

    名称默认值描述
    --van-uploader-size80px-
    --van-uploader-icon-size24px-
    --van-uploader-icon-colorvar(--van-gray-4)-
    --van-uploader-text-colorvar(--van-gray-6)-
    --van-uploader-text-font-sizevar(--van-font-size-sm)-
    --van-uploader-upload-background-colorvar(--van-gray-1)-
    --van-uploader-upload-active-colorvar(--van-active-color)-
    --van-uploader-delete-colorvar(--van-white)-
    --van-uploader-delete-icon-size14px-
    --van-uploader-delete-background-colorrgba(0, 0, 0, 0.7)-
    --van-uploader-file-background-colorvar(--van-background-color)-
    --van-uploader-file-icon-size20px-
    --van-uploader-file-icon-colorvar(--van-gray-7)-
    --van-uploader-file-name-padding0 var(--van-padding-base)-
    --van-uploader-file-name-margin-topvar(--van-padding-xs)-
    --van-uploader-file-name-font-sizevar(--van-font-size-sm)-
    --van-uploader-file-name-text-colorvar(--van-gray-7)-
    --van-uploader-mask-text-colorvar(--van-white)-
    --van-uploader-mask-background-colorfade(var(--van-gray-8), 88%)-
    --van-uploader-mask-icon-size22px-
    --van-uploader-mask-message-font-sizevar(--van-font-size-sm)-
    --van-uploader-mask-message-line-heightvar(--van-line-height-xs)-
    --van-uploader-loading-icon-size22px-
    --van-uploader-loading-icon-colorvar(--van-white)-
    --van-uploader-disabled-opacityvar(--van-disabled-opacity)-

    常见问题

    拍照上传的图片被旋转 90 度?

    部分手机在拍照上传时会出现图片被旋转 90 度的问题,这个问题可以通过 compressorjs 或其他开源库进行处理。

    compressorjs 是一个开源的图片处理库,提供了图片压缩、图片旋转等能力。

    示例

    使用 compressorjs 进行处理的示例代码如下:

    <van-uploader :before-read="beforeRead" />
    import Compressor from 'compressorjs';export default {  setup() {    const beforeRead = (file) => {      return new Promise((resolve) => {        // compressorjs 默认开启 checkOrientation 选项        // 会将图片修正为正确方向        new Compressor(file, {          success: resolve,          error(err) {            console.log(err.message);          },        });      });    };    return {      beforeRead,    };  },};

    上传 HEIC/HEIF 格式的图片后无法展示?

    目前 Chrome、Safari 等浏览器不支持展示 HEIC/HEIF 格式的图片,因此上传后无法在 Uploader 组件中进行预览。

    [HEIF] 格式的兼容性请参考 caniuse


    介绍

    底部弹起的模态面板,包含与当前情境相关的多个选项。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ActionSheet } from 'vant';const app = createApp();app.use(ActionSheet);

    代码演示

    基础用法

    动作面板通过 actions 属性来定义选项,actions 属性是一个由对象构成的数组,数组中的每个对象配置一列,对象格式见文档下方表格。

    <van-cell is-link title="基础用法" @click="show = true" /><van-action-sheet v-model:show="show" :actions="actions" @select="onSelect" />
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const show = ref(false);    const actions = [      { name: '选项一' },      { name: '选项二' },      { name: '选项三' },    ];    const onSelect = (item) => {      // 默认情况下点击选项时不会自动收起      // 可以通过 close-on-click-action 属性开启自动收起      show.value = false;      Toast(item.name);    };    return {      show,      actions,      onSelect,    };  },};

    展示取消按钮

    设置 cancel-text 属性后,会在底部展示取消按钮,点击后关闭当前面板并触发 cancel 事件。

    <van-action-sheet  v-model:show="show"  :actions="actions"  cancel-text="取消"  close-on-click-action  @cancel="onCancel"/>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const show = ref(false);    const actions = [      { name: '选项一' },      { name: '选项二' },      { name: '选项三' },    ];    const onCancel = () => Toast('取消');    return {      show,      actions,      onCancel,    };  },};

    展示描述信息

    通过 description 可以在菜单顶部显示描述信息,通过选项的 subname 属性可以在选项文字的右侧展示描述信息。

    <van-action-sheet  v-model:show="show"  :actions="actions"  cancel-text="取消"  description="这是一段描述信息"  close-on-click-action/>
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const actions = [      { name: '选项一' },      { name: '选项二' },      { name: '选项三', subname: '描述信息' },    ];    return {      show,      actions,    };  },};

    选项状态

    可以通过 loading 和 disabled 将选项设置为加载状态或禁用状态,或者通过color设置选项的颜色

    <van-action-sheet  v-model:show="show"  :actions="actions"  cancel-text="取消"  close-on-click-action/>
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const actions = [      { name: '着色选项', color: '#ee0a24' },      { name: '禁用选项', disabled: true },      { name: '加载选项', loading: true },    ];    return {      show,      actions,    };  },};

    自定义面板

    通过插槽可以自定义面板的展示内容,同时可以使用title属性展示标题栏

    <van-action-sheet v-model:show="show" title="标题">  <div class="content">内容</div></van-action-sheet><style>  .content {    padding: 16px 16px 160px;  }</style>

    API

    Props

    参数说明类型默认值
    v-model:show是否显示动作面板booleanfalse
    actions面板选项列表Action[][]
    title顶部标题string-
    cancel-text取消按钮文字string-
    description选项上方的描述信息string-
    closeable是否显示关闭图标booleantrue
    close-icon关闭图标名称或图片链接stringcross
    duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
    round是否显示圆角booleantrue
    overlay是否显示遮罩层booleantrue
    overlay-class自定义遮罩层类名string | Array | object-
    overlay-style自定义遮罩层样式object-
    lock-scroll是否锁定背景滚动booleantrue
    lazy-render是否在显示弹层时才渲染节点booleantrue
    close-on-popstate是否在页面回退时自动关闭booleanfalse
    close-on-click-action是否在点击选项后关闭booleanfalse
    close-on-click-overlay是否在点击遮罩层后关闭booleantrue
    safe-area-inset-bottom是否开启底部安全区适配booleantrue
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-
    before-close v3.1.4关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-

    Action 数据结构

    actions 属性是一个由对象构成的数组,数组中的每个对象配置一列,对象可以包含以下值:

    键名说明类型
    name标题string
    subname二级标题string
    color选项文字颜色string
    className为对应列添加额外的 classstring | Array | object
    loading是否为加载状态boolean
    disabled是否为禁用状态boolean
    callback点击时触发的回调函数action: Action

    Events

    事件名说明回调参数
    select点击选项时触发,禁用或加载状态下不会触发action: Action, index: number
    cancel点击取消按钮时触发-
    open打开面板时触发-
    close关闭面板时触发-
    opened打开面板且动画结束后触发-
    closed关闭面板且动画结束后触发-
    click-overlay点击遮罩层时触发event: MouseEvent

    Slots

    名称说明
    default自定义面板的展示内容
    description自定义描述文案
    cancel v3.0.10自定义取消按钮内容

    样式变量

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

    名称默认值描述
    --van-action-sheet-max-height80%-
    --van-action-sheet-header-height48px-
    --van-action-sheet-header-font-sizevar(--van-font-size-lg)-
    --van-action-sheet-description-colorvar(--van-gray-6)-
    --van-action-sheet-description-font-sizevar(--van-font-size-md)-
    --van-action-sheet-description-line-heightvar(--van-line-height-md)-
    --van-action-sheet-item-backgroundvar(--van-white)-
    --van-action-sheet-item-font-sizevar(--van-font-size-lg)-
    --van-action-sheet-item-line-heightvar(--van-line-height-lg)-
    --van-action-sheet-item-text-colorvar(--van-text-color)-
    --van-action-sheet-item-disabled-text-colorvar(--van-gray-5)-
    --van-action-sheet-subname-colorvar(--van-gray-6)-
    --van-action-sheet-subname-font-sizevar(--van-font-size-sm)-
    --van-action-sheet-subname-line-heightvar(--van-line-height-sm)-
    --van-action-sheet-close-icon-size22px-
    --van-action-sheet-close-icon-colorvar(--van-gray-5)-
    --van-action-sheet-close-icon-active-colorvar(--van-gray-6)-
    --van-action-sheet-close-icon-padding0 var(--van-padding-md)-
    --van-action-sheet-cancel-text-colorvar(--van-gray-7)-
    --van-action-sheet-cancel-padding-topvar(--van-padding-xs)-
    --van-action-sheet-cancel-padding-colorvar(--van-background-color)-
    --van-action-sheet-loading-icon-size22px-


    Dialog 弹出框

    介绍

    弹出模态框,常用于消息提示、消息确认,或在当前页面内完成特定的交互操作,支持函数调用和组件调用两种方式。

    实例演示

    函数调用

    Dialog 是一个函数,调用后会直接在页面中弹出相应的模态框。

    import { Dialog } from 'vant';Dialog({ message: '提示' });

    组件调用

    通过组件调用 Dialog 时,可以通过下面的方式进行注册:

    import { createApp } from 'vue';import { Dialog } from 'vant';// 全局注册const app = createApp();app.use(Dialog);// 局部注册export default {  components: {    [Dialog.Component.name]: Dialog.Component,  },};

    代码演示

    消息提示

    用于提示一些消息,只包含一个确认按钮。

    Dialog.alert({  title: '标题',  message: '弹窗内容',}).then(() => {  // on close});Dialog.alert({  message: '弹窗内容',}).then(() => {  // on close});

    消息确认

    用于确认消息,包含取消和确认按钮。

    Dialog.confirm({  title: '标题',  message: '弹窗内容',})  .then(() => {    // on confirm  })  .catch(() => {    // on cancel  });

    圆角按钮风格

    将 theme 选项设置为 round-button 可以展示圆角按钮风格的弹窗。

    Dialog.alert({  title: '标题',  message: '弹窗内容',  theme: 'round-button',}).then(() => {  // on close});Dialog.alert({  message: '弹窗内容',  theme: 'round-button',}).then(() => {  // on close});

    异步关闭

    通过 beforeClose 属性可以传入一个回调函数,在弹窗关闭前进行特定操作。

    const beforeClose = (action) =>  new Promise((resolve) => {    setTimeout(() => {      if (action === 'confirm') {        resolve(true);      } else {        // 拦截取消操作        resolve(false);      }    }, 1000);  });Dialog.confirm({  title: '标题',  message: '弹窗内容',  beforeClose,});

    全局方法

    通过 app.use 全局注册 Dialog 组件后,会自动在 app 的所有子组件上挂载 $dialog 方法,在所有组件内部都可以直接调用此方法。

    export default {  mounted() {    this.$dialog.alert({      message: '弹窗内容',    });  },};
    Tips: 由于 setup 选项中无法访问 this,因此不能使用上述方式,请通过 import 引入。

    组件调用

    如果需要在弹窗内嵌入组件或其他自定义内容,可以使用组件调用的方式。

    <van-dialog v-model:show="show" title="标题" show-cancel-button>  <img src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow"  /></van-dialog>
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    return { show };  },};

    API

    方法

    方法名说明参数返回值
    Dialog展示弹窗options: DialogOptionsPromise<void>
    Dialog.alert展示消息提示弹窗options: DialogOptionsPromise<void>
    Dialog.confirm展示消息确认弹窗options: DialogOptionsPromise<void>
    Dialog.setDefaultOptions修改默认配置,对所有 Dialog 生效options: DialogOptionsvoid
    Dialog.resetDefaultOptions重置默认配置,对所有 Dialog 生效-void
    Dialog.close关闭弹窗-void

    DialogOptions

    通过函数调用 Dialog 时,支持传入以下选项:

    参数说明类型默认值
    title标题string-
    width弹窗宽度,默认单位为 pxnumber | string320px
    message文本内容,支持通过   换行string | () => JSX.ELement-
    messageAlign内容对齐方式,可选值为 left rightstringcenter
    theme样式风格,可选值为 round-buttonstringdefault
    className自定义类名string | Array | object-
    showConfirmButton是否展示确认按钮booleantrue
    showCancelButton是否展示取消按钮booleanfalse
    confirmButtonText确认按钮文案string确认
    confirmButtonColor确认按钮颜色string#ee0a24
    cancelButtonText取消按钮文案string取消
    cancelButtonColor取消按钮颜色stringblack
    overlay是否展示遮罩层booleantrue
    overlayClass自定义遮罩层类名string | Array | object-
    overlayStyle自定义遮罩层样式object-
    closeOnPopstate是否在页面回退时自动关闭booleantrue
    closeOnClickOverlay是否在点击遮罩层后关闭弹窗booleanfalse
    lockScroll是否锁定背景滚动booleantrue
    allowHtml是否允许 message 内容中渲染 HTMLbooleanfalse
    beforeClose关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-
    transition动画类名,等价于 transition 的 name 属性string-
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Elementbody

    Props

    通过组件调用 Dialog 时,支持以下 Props:

    参数说明类型默认值
    v-model:show是否显示弹窗boolean-
    title标题string-
    width弹窗宽度,默认单位为 pxnumber | string320px
    message文本内容,支持通过   换行string | () => JSX.ELement-
    message-align内容水平对齐方式,可选值为 left rightstringcenter
    theme样式风格,可选值为 round-buttonstringdefault
    show-confirm-button是否展示确认按钮booleantrue
    show-cancel-button是否展示取消按钮booleanfalse
    confirm-button-text确认按钮文案string确认
    confirm-button-color确认按钮颜色string#ee0a24
    cancel-button-text取消按钮文案string取消
    cancel-button-color取消按钮颜色stringblack
    overlay是否展示遮罩层booleantrue
    overlay-class自定义遮罩层类名string-
    overlay-style自定义遮罩层样式object-
    close-on-popstate是否在页面回退时自动关闭booleantrue
    close-on-click-overlay是否在点击遮罩层后关闭弹窗booleanfalse
    lazy-render是否在显示弹层时才渲染节点booleantrue
    lock-scroll是否锁定背景滚动booleantrue
    allow-html是否允许 message 内容中渲染 HTMLbooleanfalse
    before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-
    transition动画类名,等价于 transition 的 name 属性string-
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-

    Events

    通过组件调用 Dialog 时,支持以下事件:

    事件说明回调参数
    confirm点击确认按钮时触发-
    cancel点击取消按钮时触发-
    open打开弹窗时触发-
    close关闭弹窗时触发-
    opened打开弹窗且动画结束后触发-
    closed关闭弹窗且动画结束后触发-

    Slots

    通过组件调用 Dialog 时,支持以下插槽:

    名称说明
    default自定义内容
    title自定义标题
    footer v3.0.10自定义底部按钮区域

    样式变量

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

    名称默认值描述
    --van-dialog-width320px-
    --van-dialog-small-screen-width90%-
    --van-dialog-font-sizevar(--van-font-size-lg)-
    --van-dialog-transitionvar(--van-animation-duration-base)-
    --van-dialog-border-radius16px-
    --van-dialog-background-colorvar(--van-white)-
    --van-dialog-header-font-weightvar(--van-font-weight-bold)-
    --van-dialog-header-line-height24px-
    --van-dialog-header-padding-top26px-
    --van-dialog-header-isolated-paddingvar(--van-padding-lg) 0-
    --van-dialog-message-paddingvar(--van-padding-lg)-
    --van-dialog-message-font-sizevar(--van-font-size-md)-
    --van-dialog-message-line-heightvar(--van-line-height-md)-
    --van-dialog-message-max-height60vh-
    --van-dialog-has-title-message-text-colorvar(--van-gray-7)-
    --van-dialog-has-title-message-padding-topvar(--van-padding-xs)-
    --van-dialog-button-height48px-
    --van-dialog-round-button-height36px-
    --van-dialog-confirm-button-text-colorvar(--van-danger-color)-

    常见问题

    在 beforeRouteLeave 里调用 Dialog 无法展示?

    将 closeOnPopstate 属性设置为 false 即可。

    Dialog.alert({  title: '标题',  message: '弹窗内容',  closeOnPopstate: false,}).then(() => {  // on close});

    在 JSX 中渲染 Dialog 组件无法展示?

    请注意 Dialog 是一个函数,Dialog.Component 才是 Dialog 对应的组件。JSX 调用弹窗的正确姿势如下:

    export default {  setup() {    const show = ref(false);    return () => <Dialog.Component v-model={[show, 'show']} />;  },};


    介绍

    向下弹出的菜单列表。

    实例演示

    引入

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

    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="padding: 5px 16px;">      <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菜单展开方向,可选值为upstringdown
    z-index菜单栏 z-index 层级number | string10
    duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.2
    overlay是否显示遮罩层booleantrue
    close-on-click-overlay是否在点击遮罩层后关闭菜单booleantrue
    close-on-click-outside是否在点击外部元素后关闭菜单booleantrue

    DropdownItem Props

    参数说明类型默认值
    v-model当前选中项对应的 valuenumber | string-
    title菜单项标题string当前选中项文字
    options选项数组Option[][]
    disabled是否禁用菜单booleanfalse
    lazy-render是否在首次展开时才渲染菜单内容booleantrue
    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-height48px-
    --van-dropdown-menu-background-colorvar(--van-white)-
    --van-dropdown-menu-box-shadow0 2px 12px fade(var(--van-gray-7), 12)-
    --van-dropdown-menu-title-font-size15px-
    --van-dropdown-menu-title-text-colorvar(--van-text-color)-
    --van-dropdown-menu-title-active-text-colorvar(--van-danger-color)-
    --van-dropdown-menu-title-disabled-text-colorvar(--van-gray-6)-
    --van-dropdown-menu-title-padding0 var(--van-padding-xs)-
    --van-dropdown-menu-title-line-heightvar(--van-line-height-lg)-
    --van-dropdown-menu-option-active-colorvar(--van-danger-color)-
    --van-dropdown-menu-content-max-height80%-
    --van-dropdown-item-z-index10-

    常见问题

    父元素设置 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>


    介绍

    加载图标,用于表示加载中的过渡状态。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Loading } from 'vant';const app = createApp();app.use(Loading);

    代码演示

    加载类型

    通过 type 属性可以设置加载图标的类型,默认为 circular,可选值为 spinner。

    <van-loading /><van-loading type="spinner" />

    自定义颜色

    通过 color 属性设置加载图标的颜色。

    <van-loading color="#1989fa" /><van-loading type="spinner" color="#1989fa" />

    自定义大小

    通过 size 属性设置加载图标的大小,默认单位为 px。

    <van-loading size="24" /><van-loading type="spinner" size="24px" />

    加载文案

    可以使用默认插槽在图标的右侧插入加载文案。

    <van-loading size="24px">加载中...</van-loading>

    垂直排列

    设置 vertical 属性后,图标和文案会垂直排列。

    <van-loading size="24px" vertical>加载中...</van-loading>

    自定义文案颜色

    通过 color 或者 text-color 属性设置加载文案的颜色。

    <!-- 可修改文案和加载图标的颜色 --><van-loading color="#0094ff" /><!-- 只修改文案颜色 --><van-loading text-color="#0094ff" />

    API

    Props

    参数说明类型默认值
    color颜色string#c9c9c9
    type类型,可选值为 spinnerstringcircular
    size加载图标大小,默认单位为 pxnumber | string30px
    text-size文字大小,默认单位为 pxnumber | string14px
    text-color文字颜色string#c9c9c9
    vertical是否垂直排列图标和文字内容booleanfalse

    Slots

    名称说明
    default加载文案

    样式变量

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

    名称默认值描述
    --van-loading-text-colorvar(--van-gray-6)-
    --van-loading-text-font-sizevar(--van-font-size-md)-
    --van-loading-spinner-colorvar(--van-gray-5)-
    --van-loading-spinner-size30px-
    --van-loading-spinner-animation-duration0.8s-


    介绍

    在页面顶部展示消息提示,支持函数调用和组件调用两种方式。

    实例演示

    函数调用

    Notify 是一个函数,调用后会直接在页面中弹出相应的消息提示。

    import { Notify } from 'vant';Notify('通知内容');

    组件调用

    通过组件调用 Notify 时,可以通过下面的方式进行注册:

    import { createApp } from 'vue';import { Notify } from 'vant';// 全局注册const app = createApp();app.use(Notify);// 局部注册export default {  components: {    [Notify.Component.name]: Notify.Component,  },};

    代码演示

    基础用法

    Notify('通知内容');

    通知类型

    支持 primary、success、warning、danger 四种通知类型,默认为 danger。

    // 主要通知Notify({ type: 'primary', message: '通知内容' });// 成功通知Notify({ type: 'success', message: '通知内容' });// 危险通知Notify({ type: 'danger', message: '通知内容' });// 警告通知Notify({ type: 'warning', message: '通知内容' });

    自定义通知

    自定义消息通知的颜色和展示时长。

    Notify({  message: '自定义颜色',  color: '#ad0000',  background: '#ffe1e1',});Notify({  message: '自定义时长',  duration: 1000,});

    全局方法

    通过 app.use 全局注册 Notify 组件后,会自动在 app 的所有子组件上挂载 $notify 方法,便于在组件内调用。

    export default {  mounted() {    this.$notify('提示文案');  },};
    Tips: 由于 setup 选项中无法访问 this,因此不能使用上述方式,请通过 import 引入。

    组件调用

    如果需要在 Notify 内嵌入组件或其他自定义内容,可以使用组件调用的方式。

    <van-button type="primary" text="组件调用" @click="showNotify" /><van-notify v-model:show="show" type="success">  <van-icon name="bell" style="margin-right: 4px;" />  <span>通知内容</span></van-notify>
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const showNotify = () => {      show.value = true;      setTimeout(() => {        show.value = false;      }, 2000);    };    return {      show,      showNotify,    };  },};

    API

    方法

    方法名说明参数返回值
    Notify展示提示options | messagenotify 实例
    Notify.clear关闭提示-void
    Notify.setDefaultOptions修改默认配置,对所有 Notify 生效optionsvoid
    Notify.resetDefaultOptions重置默认配置,对所有 Notify 生效-void

    Options

    参数说明类型默认值
    type类型,可选值为 primary success warningstringdanger
    message展示文案,支持通过 换行string-
    duration展示时长(ms),值为 0 时,notify 不会消失number | string3000
    color字体颜色stringwhite
    background背景颜色string-
    className自定义类名string | Array | object-
    lockScroll v3.0.7是否锁定背景滚动booleanfalse
    onClick点击时的回调函数(event: MouseEvent): void-
    onOpened完全展示后的回调函数() => void-
    onClose关闭时的回调函数() => void-

    样式变量

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

    名称默认值描述
    --van-notify-text-colorvar(--van-white)-
    --van-notify-paddingvar(--van-padding-xs) var(--van-padding-md)-
    --van-notify-font-sizevar(--van-font-size-md)-
    --van-notify-line-heightvar(--van-line-height-md)-
    --van-notify-primary-background-colorvar(--van-primary-color)-
    --van-notify-success-background-colorvar(--van-success-color)-
    --van-notify-danger-background-colorvar(--van-danger-color)-
    --van-notify-warning-background-colorvar(--van-warning-color)-


    介绍

    创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Overlay } from 'vant';const app = createApp();app.use(Overlay);

    代码演示

    基础用法

    <van-button type="primary" text="显示遮罩层" @click="show = true" /><van-overlay :show="show" @click="show = false" />
    import { ref } from 'vue';export default {  setup() {    const show = ref(false);    return { show };  },};

    嵌入内容

    通过默认插槽可以在遮罩层上嵌入任意内容。

    <van-overlay :show="show" @click="show = false">  <div class="wrapper" @click.stop>    <div class="block" />  </div></van-overlay><style>  .wrapper {    display: flex;    align-items: center;    justify-content: center;    height: 100%;  }  .block {    width: 120px;    height: 120px;    background-color: #fff;  }</style>

    API

    Props

    参数说明类型默认值
    show是否展示遮罩层booleanfalse
    z-indexz-index 层级number | string1
    duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
    class-name自定义类名string-
    custom-style自定义样式object-
    lock-scroll是否锁定背景滚动,锁定时蒙层里的内容也将无法滚动booleantrue

    Events

    事件名说明回调参数
    click点击时触发event: MouseEvent

    Slots

    名称说明
    default默认插槽,用于在遮罩层上方嵌入内容

    样式变量

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

    名称默认值描述
    --van-overlay-z-index1-
    --van-overlay-background-colorrgba(0, 0, 0, 0.7)-


    介绍

    用于提供下拉刷新的交互操作。

    实例演示

    引入

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

    import { createApp } from 'vue';import { PullRefresh } from 'vant';const app = createApp();app.use(PullRefresh);

    代码演示

    基础用法

    下拉刷新时会触发 refresh 事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将 v-model 设置为 false,表示加载完成。

    <van-pull-refresh v-model="state.loading" @refresh="onRefresh">  <p>刷新次数: {{ state.count }}</p></van-pull-refresh>
    import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const state = reactive({      count: 0,      loading: false,    });    const onRefresh = () => {      setTimeout(() => {        Toast('刷新成功');        state.loading = false;        state.count++;      }, 1000);    };    return {      state,      onRefresh,    };  },};

    成功提示

    通过 success-text 可以设置刷新成功后的顶部提示文案。

    <van-pull-refresh  v-model="isLoading"  success-text="刷新成功"  @refresh="onRefresh">  <p>刷新次数: {{ count }}</p></van-pull-refresh>

    自定义提示

    通过插槽可以自定义下拉刷新过程中的提示内容。

    <van-pull-refresh v-model="isLoading" :head-height="80" @refresh="onRefresh">  <!-- 下拉提示,通过 scale 实现一个缩放效果 -->  <template #pulling="props">    <img      class="doge"      src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"       :style="{ transform: `scale(${props.distance / 80})` }"    />  </template>  <!-- 释放提示 -->  <template #loosing>    <img class="doge" src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"  />  </template>  <!-- 加载提示 -->  <template #loading>    <img class="doge" src="https://img.yzcdn.cn/vant/doge-fire.jpg" rel="external nofollow"  />  </template>  <p>刷新次数: {{ count }}</p></van-pull-refresh><style>  .doge {    width: 140px;    height: 72px;    margin-top: 8px;    border-radius: 4px;  }</style>

    API

    Props

    参数说明类型默认值
    v-model是否处于加载中状态boolean-
    pulling-text下拉过程提示文案string下拉即可刷新...
    loosing-text释放过程提示文案string释放即可刷新...
    loading-text加载过程提示文案string加载中...
    success-text刷新成功提示文案string-
    success-duration刷新成功提示展示时长(ms)number | string500
    animation-duration动画时长number | string300
    head-height顶部内容高度number | string50
    pull-distance v3.0.8触发下拉刷新的距离number | string与 head-height 一致
    disabled是否禁用下拉刷新booleanfalse

    Events

    事件名说明回调参数
    refresh下拉刷新时触发-

    Slots

    名称说明参数
    default自定义内容-
    normal非下拉状态时顶部内容-
    pulling下拉过程中顶部内容{ distance: 当前下拉距离 }
    loosing释放过程中顶部内容{ distance: 当前下拉距离 }
    loading加载过程中顶部内容{ distance: 当前下拉距离 }
    success刷新成功提示内容-

    样式变量

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

    名称默认值描述
    --van-pull-refresh-head-height50px-
    --van-pull-refresh-head-font-sizevar(--van-font-size-md)-
    --van-pull-refresh-head-text-colorvar(--van-gray-6)-
    --van-pull-refresh-loading-icon-size16px-

    常见问题

    PullRefresh 的内容未填满屏幕时,只有一部分区域可以下拉?

    默认情况下,下拉区域的高度是和内容高度保持一致的,如果需要让下拉区域始终为全屏,可以给 PullRefresh 设置一个与屏幕大小相等的最小高度:

    <van-pull-refresh style="min-height: 100vh;" />

    PullRefresh 的触发条件是?

    PullRefresh 的触发条件是「父级滚动元素的滚动条在顶部位置」。

    • 如果最近一个可滚动的父级元素是 window,则要求 window.pageYOffset === 0。
    • 如果最近一个可滚动的父级元素是 Element,则要求 Element.scrollTop === 0。

    在桌面端无法操作组件?

    参见桌面端适配


    介绍

    底部弹起的分享面板,用于展示各分享渠道对应的操作按钮,不含具体的分享逻辑。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ShareSheet } from 'vant';const app = createApp();app.use(ShareSheet);

    代码演示

    基础用法

    分享面板通过 options 属性来定义分享选项,数组的每一项是一个对象,对象格式见文档下方表格。

    <van-cell title="显示分享面板" @click="showShare = true" /><van-share-sheet  v-model:show="showShare"  title="立即分享给好友"  :options="options"  @select="onSelect"/>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const showShare = ref(false);    const options = [      { name: '微信', icon: 'wechat' },      { name: '微博', icon: 'weibo' },      { name: '复制链接', icon: 'link' },      { name: '分享海报', icon: 'poster' },      { name: '二维码', icon: 'qrcode' },    ];    const onSelect = (option) => {      Toast(option.name);      showShare.value = false;    };    return {      options,      onSelect,      showShare,    };  },};

    展示多行选项

    当分享选项的数量较多时,可以将 options 定义为数组嵌套的格式,每个子数组会作为一行选项展示。

    <van-share-sheet  v-model:show="showShare"  title="立即分享给好友"  :options="options"/>
    import { ref } from 'vue';export default {  setup() {    const showShare = ref(false);    const options = [      [        { name: '微信', icon: 'wechat' },        { name: '朋友圈', icon: 'wechat-moments' },        { name: '微博', icon: 'weibo' },        { name: 'QQ', icon: 'qq' },      ],      [        { name: '复制链接', icon: 'link' },        { name: '分享海报', icon: 'poster' },        { name: '二维码', icon: 'qrcode' },        { name: '小程序码', icon: 'weapp-qrcode' },      ],    ];    return {      options,      showShare,    };  },};

    自定义图标

    除了使用内置的几种图标外,可以直接在 icon 中传入图片 URL 来使用自定义的图标。

    <van-share-sheet v-model:show="showShare" :options="options" />
    import { ref } from 'vue';export default {  setup() {    const showShare = ref(false);    const options = [      {        name: '名称',        icon: 'https://img.yzcdn.cn/vant/custom-icon-fire.png',      },      {        name: '名称',        icon: 'https://img.yzcdn.cn/vant/custom-icon-light.png',      },      {        name: '名称',        icon: 'https://img.yzcdn.cn/vant/custom-icon-water.png',      },    ];    return {      options,      showShare,    };  },};

    展示描述信息

    通过 description 属性可以设置标题下方的描述文字, 在 options 内设置 description 属性可以添加分享选项描述。

    <van-share-sheet  v-model:show="showShare"  :options="options"  title="立即分享给好友"  description="描述信息"/>
    import { ref } from 'vue';export default {  setup() {    const showShare = ref(false);    const options = [      { name: '微信', icon: 'wechat' },      { name: '微博', icon: 'weibo' },      { name: '复制链接', icon: 'link', description: '描述信息' },      { name: '分享海报', icon: 'poster' },      { name: '二维码', icon: 'qrcode' },    ];    return {      options,      showShare,    };  },};

    API

    Props

    参数说明类型默认值
    v-model:show是否显示分享面板booleanfalse
    options分享选项Option[][]
    title顶部标题string-
    cancel-text取消按钮文字,传入空字符串可以隐藏按钮string'取消'
    description标题下方的辅助描述文字string-
    duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
    overlay是否显示遮罩层booleantrue
    overlay-class自定义遮罩层类名string | Array | object-
    overlay-style自定义遮罩层样式object-
    lock-scroll是否锁定背景滚动booleantrue
    lazy-render是否在显示弹层时才渲染内容booleantrue
    close-on-popstate是否在页面回退时自动关闭booleantrue
    close-on-click-overlay是否在点击遮罩层后关闭booleantrue
    safe-area-inset-bottom是否开启底部安全区适配booleantrue
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-
    before-close v3.1.4关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-

    Option 数据结构

    options 属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:

    键名说明类型
    name分享渠道名称string
    description分享选项描述string
    icon图标,可选值为 wechat weibo qq link qrcode poster weapp-qrcode wechat-moments,支持传入图片 URLstring
    className分享选项类名string

    Events

    事件名说明回调参数
    select点击分享选项时触发option: Option, index: number
    cancel点击取消按钮时触发-
    open打开面板时触发-
    close关闭面板时触发-
    opened打开面板且动画结束后触发-
    closed关闭面板且动画结束后触发-
    click-overlay点击遮罩层时触发event: MouseEvent

    Slots

    名称说明
    title自定义顶部标题
    description自定义描述文字
    cancel v3.0.10自定义取消按钮内容

    样式变量

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

    名称默认值描述
    --van-share-sheet-header-paddingvar(--van-padding-sm) var(--van-padding-md) var(--van-padding-base)-
    --van-share-sheet-title-colorvar(--van-text-color)-
    --van-share-sheet-title-font-sizevar(--van-font-size-md)-
    --van-share-sheet-title-line-heightvar(--van-line-height-md)-
    --van-share-sheet-description-colorvar(--van-gray-6)-
    --van-share-sheet-description-font-sizevar(--van-font-size-sm)-
    --van-share-sheet-description-line-height16px-
    --van-share-sheet-icon-size48px-
    --van-share-sheet-option-name-colorvar(--van-gray-7)-
    --van-share-sheet-option-name-font-sizevar(--van-font-size-sm)-
    --van-share-sheet-option-description-colorvar(--van-gray-5)-
    --van-share-sheet-option-description-font-sizevar(--van-font-size-sm)-
    --van-share-sheet-cancel-button-font-sizevar(--van-font-size-lg)-
    --van-share-sheet-cancel-button-height48px-
    --van-share-sheet-cancel-button-backgroundvar(--van-white)-

    常见问题

    如何实现分享逻辑?

    在不同的 App 或浏览器中,存在各式各样的分享接口或分享方式,因此 ShareSheet 组件不提供具体的分享逻辑,需要开发者根据业务场景自行实现。

    微信内分享

    由于微信未提供分享相关的 API,需要引导用户点击右上角进行分享。

    App 内分享

    可以通过 JSBridge 调用原生应用的 SDK 进行分享。

    分享海报或二维码

    可以通过 Popup 组件以弹层的形式展示图片,然后引导用户保存图片进行分享。


    介绍

    可以左右滑动来展示操作按钮的单元格组件。

    实例演示

    引入

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

    import { createApp } from 'vue';import { SwipeCell } from 'vant';const app = createApp();app.use(SwipeCell);

    代码演示

    基础用法

    SwipeCell 组件提供了 left 和 right 两个插槽,用于定义两侧滑动区域的内容。

    <van-swipe-cell>  <template #left>    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template #right>    <van-button square type="danger" text="删除" />    <van-button square type="primary" text="收藏" />  </template></van-swipe-cell>

    自定义内容

    SwipeCell 可以嵌套任意内容,比如嵌套一个商品卡片。

    <van-swipe-cell>  <van-card    num="2"    price="2.00"    desc="描述信息"    title="商品标题"    class="goods-card"    thumb="https://img.yzcdn.cn/vant/cat.jpeg"  />  <template #right>    <van-button square text="删除" type="danger" class="delete-button" />  </template></van-swipe-cell><style>  .goods-card {    margin: 0;    background-color: @white;  }  .delete-button {    height: 100%;  }</style>

    异步关闭

    通过传入 before-close 回调函数,可以自定义两侧滑动内容关闭时的行为。

    <van-swipe-cell :before-close="beforeClose">  <template #left>    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template #right>    <van-button square type="danger" text="删除" />  </template></van-swipe-cell>
    import { Dialog } from 'vant';export default {  setup() {    // position 为关闭时点击的位置    const beforeClose = ({ position }) => {      switch (position) {        case 'left':        case 'cell':        case 'outside':          return true;        case 'right':          return new Promise((resolve) => {            Dialog.confirm({              title: '确定删除吗?',            }).then(resolve);          });      }    };    return { beforeClose };  },};

    API

    Props

    参数说明类型默认值
    name标识符,可以在事件参数中获取到number | string''
    left-width指定左侧滑动区域宽度,单位为 pxnumber | stringauto
    right-width指定右侧滑动区域宽度,单位为 pxnumber | stringauto
    before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(args) => boolean | Promise<boolean>-
    disabled是否禁用滑动booleanfalse
    stop-propagation是否阻止滑动事件冒泡booleanfalse

    Slots

    名称说明
    default默认显示的内容
    left左侧滑动区域的内容
    right右侧滑动区域的内容

    Events

    事件名说明回调参数
    click点击时触发position: 'left' | 'right' | 'cell' | 'outside'
    open打开时触发{ name: string | number, position: 'left' | 'right' }
    close关闭时触发{ name: string | number, position: 'left' | 'right' | 'cell' | 'outside' }

    beforeClose 参数

    beforeClose 的第一个参数为对象,对象中包含以下属性:

    参数名说明类型
    name标识符string | number
    position关闭时的点击位置'left' | 'right' | 'cell' | 'outside'

    方法

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

    方法名说明参数返回值
    open打开单元格侧边栏position: left | right-
    close收起单元格侧边栏--

    类型定义

    通过 SwipeCellInstance 获取 SwipeCell 实例的类型定义。

    import { ref } from 'vue';import type { SwipeCellInstance } from 'vant';const swipeCellRef = ref<SwipeCellInstance>();swipeCellRef.value?.close();

    样式变量

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

    名称默认值描述
    --van-switch-cell-padding-topvar(--van-cell-vertical-padding) - 1px-
    --van-switch-cell-padding-bottomvar(--van-cell-vertical-padding) - 1px-
    --van-switch-cell-large-padding-topvar(--van-cell-large-vertical-padding) - 1px-
    --van-switch-cell-large-padding-bottomvar(--van-cell-large-vertical-padding) - 1px-

    常见问题

    在桌面端无法操作组件?

    参见桌面端适配



    介绍

    在右上角展示徽标数字或小红点。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Badge } from 'vant';const app = createApp();app.use(Badge);

    代码演示

    基础用法

    设置 content 属性后,Badge 会在子元素的右上角显示对应的徽标,也可以通过 dot 来显示小红点。

    <van-badge :content="5">  <div class="child" /></van-badge><van-badge :content="10">  <div class="child" /></van-badge><van-badge content="Hot">  <div class="child" /></van-badge><van-badge dot>  <div class="child" /></van-badge><style>  .child {    width: 40px;    height: 40px;    background: #f2f3f5;    border-radius: 4px;  }</style>

    最大值

    设置 max 属性后,当 content 的数值超过最大值时,会自动显示为 {max}+。

    <van-badge :content="20" max="9">  <div class="child" /></van-badge><van-badge :content="50" max="20">  <div class="child" /></van-badge><van-badge :content="200" max="99">  <div class="child" /></van-badge>

    自定义颜色

    通过 color 属性来设置徽标的颜色。

    <van-badge :content="5" color="#1989fa">  <div class="child" /></van-badge><van-badge :content="10" color="#1989fa">  <div class="child" /></van-badge><van-badge dot color="#1989fa">  <div class="child" /></van-badge>

    自定义徽标内容

    通过 content 插槽可以自定义徽标的内容,比如插入一个图标。

    <van-badge>  <div class="child" />  <template #content>    <van-icon name="success" class="badge-icon" />  </template></van-badge><van-badge>  <div class="child" />  <template #content>    <van-icon name="cross" class="badge-icon" />  </template></van-badge><van-badge>  <div class="child" />  <template #content>    <van-icon name="down" class="badge-icon" />  </template></van-badge>
    .badge-icon {  display: block;  font-size: 10px;  line-height: 16px;}

    独立展示

    当 Badge 没有子元素时,会作为一个独立的元素进行展示。

    <van-badge :content="20" /><van-badge :content="200" max="99" />

    API

    Props

    参数说明类型默认值
    content徽标内容number | string-
    color徽标背景颜色string#ee0a24
    dot是否展示为小红点booleanfalse
    max最大值,超过最大值会显示 {max}+,仅当 content 为数字时有效number | string-
    offset v3.0.5设置徽标的偏移量,数组的两项分别对应水平和垂直方向的偏移量,默认单位为 px[number | string, number | string]-
    show-zero v3.0.10当 content 为数字 0 时,是否展示徽标booleantrue

    Slots

    名称说明
    default徽标包裹的子元素
    content自定义徽标内容

    样式变量

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

    名称默认值描述
    --van-badge-size16px-
    --van-badge-colorvar(--van-white)-
    --van-badge-padding0 3px-
    --van-badge-font-sizevar(--van-font-size-sm)-
    --van-badge-font-weightvar(--van-font-weight-bold)-
    --van-badge-border-widthvar(--van-border-width-base)-
    --van-badge-background-colorvar(--van-danger-color)-
    --van-badge-dot-colorvar(--van-danger-color)-
    --van-badge-dot-size8px-
    --van-badge-font-family-apple-system-font, Helvetica Neue, Arial, sans-serif-


    介绍

    圆环形的进度条组件,支持进度渐变动画。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Circle } from 'vant';const app = createApp();app.use(Circle);

    代码演示

    基础用法

    rate 属性表示进度条的目标进度,v-model:current-rate 表示动画过程中的实时进度。当 rate 发生变化时,v-model:current-rate 会以 speed 的速度变化,直至达到 rate 设定的值。

    <van-circle  v-model:current-rate="currentRate"  :rate="30"  :speed="100"  :text="text"/>
    import { ref, computed } from 'vue';export default {  setup() {    const currentRate = ref(0);    const text = computed(() => currentRate.value.toFixed(0) + '%');    return {      text,      currentRate,    };  },};

    宽度定制

    通过 stroke-width 属性来控制进度条宽度。

    <van-circle  v-model:current-rate="currentRate"  :rate="rate"  :stroke-width="60"  text="宽度定制"/>

    颜色定制

    通过 color 属性来控制进度条颜色,layer-color 属性来控制轨道颜色。

    <van-circle  v-model:current-rate="currentRate"  :rate="rate"  layer-color="#ebedf0"  text="颜色定制"/>

    渐变色

    color 属性支持传入对象格式来定义渐变色。

    <van-circle  v-model:current-rate="currentRate"  :rate="rate"  :color="gradientColor"  text="渐变色"/>
    import { ref } from 'vue';export default {  setup() {    const currentRate = ref(0);    const gradientColor = {      '0%': '#3fecff',      '100%': '#6149f6',    };    return {      currentRate,      gradientColor,    };  },};

    逆时针方向

    将 clockwise 设置为 false,进度会从逆时针方向开始。

    <van-circle  v-model:current-rate="currentRate"  :rate="rate"  :clockwise="false"  text="逆时针方向"/>

    大小定制

    通过 size 属性设置圆环直径。

    <van-circle  v-model:current-rate="currentRate"  :rate="rate"  size="120px"  text="大小定制"/>

    API

    Props

    参数说明类型默认值
    v-model:current-rate当前进度number-
    rate目标进度number | string100
    size圆环直径,默认单位为 pxnumber | string100px
    color进度条颜色,传入对象格式可以定义渐变色string | object#1989fa
    layer-color轨道颜色stringwhite
    fill填充颜色stringnone
    speed动画速度(单位为 rate/s)number | string0
    text文字string-
    stroke-width进度条宽度number | string40
    stroke-linecap进度条端点的形状,可选值为 square buttstringround
    clockwise是否顺时针增加booleantrue

    Slots

    名称说明
    default自定义文字内容

    样式变量

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

    名称默认值描述
    --van-circle-size100px-
    --van-circle-colorvar(--van-primary-color)-
    --van-circle-layer-colorvar(--van-white)-
    --van-circle-text-colorvar(--van-text-color)-
    --van-circle-text-font-weightvar(--van-font-weight-bold)-
    --van-circle-text-font-sizevar(--van-font-size-md)-
    --van-circle-text-line-heightvar(--van-line-height-md)-


    介绍

    将一组内容放置在多个折叠面板中,点击面板的标题可以展开或收缩其内容。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Collapse, CollapseItem } from 'vant';const app = createApp();app.use(Collapse);app.use(CollapseItem);

    代码演示

    基础用法

    通过 v-model 控制展开的面板列表,activeNames 为数组格式。

    <van-collapse v-model="activeNames">  <van-collapse-item title="标题1" name="1">内容</van-collapse-item>  <van-collapse-item title="标题2" name="2">内容</van-collapse-item>  <van-collapse-item title="标题3" name="3">内容</van-collapse-item></van-collapse>
    import { ref } from 'vue';export default {  setup() {    const activeNames = ref(['1']);    return { activeNames };  },};

    手风琴

    通过 accordion 可以设置为手风琴模式,最多展开一个面板,此时 activeName 为字符串格式。

    <van-collapse v-model="activeName" accordion>  <van-collapse-item title="标题1" name="1">内容</van-collapse-item>  <van-collapse-item title="标题2" name="2">内容</van-collapse-item>  <van-collapse-item title="标题3" name="3">内容</van-collapse-item></van-collapse>
    import { ref } from 'vue';export default {  setup() {    const activeName = ref('1');    return { activeName };  },};

    禁用状态

    通过 disabled 属性来禁用单个面板。

    <van-collapse v-model="activeNames">  <van-collapse-item title="标题1" name="1">内容</van-collapse-item>  <van-collapse-item title="标题2" name="2" disabled>内容</van-collapse-item>  <van-collapse-item title="标题3" name="3" disabled>内容</van-collapse-item></van-collapse>

    自定义标题内容

    通过 title 插槽可以自定义标题栏的内容。

    <van-collapse v-model="activeNames">  <van-collapse-item name="1">    <template #title>      <div>标题1 <van-icon name="question-o" /></div>    </template>    内容  </van-collapse-item>  <van-collapse-item title="标题2" name="2" icon="shop-o">    内容  </van-collapse-item></van-collapse>
    import { ref } from 'vue';export default {  setup() {    const activeNames = ref(['1']);    return { activeNames };  },};

    API

    Collapse Props

    参数说明类型默认值
    v-model当前展开面板的 name手风琴模式:number | string
    非手风琴模式:(number | string)[]
    -
    accordion是否开启手风琴模式booleanfalse
    border是否显示外边框booleantrue

    Collapse Events

    事件名说明回调参数
    change切换面板时触发activeNames: 类型与 v-model 绑定的值一致

    CollapseItem Props

    参数说明类型默认值
    name唯一标识符,默认为索引值number | stringindex
    icon标题栏左侧图标名称或图片链接string-
    size标题栏大小,可选值为 largestring-
    title标题栏左侧内容number | string-
    value标题栏右侧内容number | string-
    label标题栏描述信息number | string-
    border是否显示内边框booleantrue
    is-link是否展示标题栏右侧箭头并开启点击反馈booleantrue
    disabled是否禁用面板booleanfalse
    readonly v3.0.12是否为只读状态,只读状态下无法操作面板booleanfalse
    title-class左侧标题额外类名string-
    value-class右侧内容额外类名string-
    label-class描述信息额外类名string-

    CollapseItem 方法

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

    方法名说明参数返回值
    toggle切换面试展开状态,传 true 为展开,false 为收起,不传参为切换expand?: boolean-

    类型定义

    通过 CollapseItemInstance 获取 CollapseItem 实例的类型定义。

    import { ref } from 'vue';import type { CollapseItemInstance } from 'vant';const collapseItemRef = ref<CollapseItemInstance>();collapseItemRef.value?.toggle();

    CollapseItem Slots

    名称说明
    default面板内容
    title自定义标题栏左侧内容
    value自定义标题栏右侧内容
    label v3.1.1自定义标题栏描述信息
    icon自定义标题栏左侧图标
    right-icon自定义标题栏右侧图标

    样式变量

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

    名称默认值描述
    --van-collapse-item-transition-durationvar(--van-animation-duration-base)-
    --van-collapse-item-content-paddingvar(--van-padding-sm) var(--van-padding-md)-
    --van-collapse-item-content-font-sizevar(--van-font-size-md)-
    --van-collapse-item-content-line-height1.5-
    --van-collapse-item-content-text-colorvar(--van-gray-6)-
    --van-collapse-item-content-background-colorvar(--van-white)-
    --van-collapse-item-title-disabled-colorvar(--van-gray-5)-


    介绍

    用于实时展示倒计时数值,支持毫秒精度。

    实例演示

    引入

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

    import { createApp } from 'vue';import { CountDown } from 'vant';const app = createApp();app.use(CountDown);

    代码演示

    基础用法

    time 属性表示倒计时总时长,单位为毫秒。

    <van-count-down :time="time" />
    import { ref } from 'vue';export default {  setup() {    const time = ref(30 * 60 * 60 * 1000);    return { time };  },};

    自定义格式

    通过 format 属性设置倒计时文本的内容。

    <van-count-down :time="time" format="DD 天 HH 时 mm 分 ss 秒" />

    毫秒级渲染

    倒计时默认每秒渲染一次,设置 millisecond 属性可以开启毫秒级渲染。

    <van-count-down millisecond :time="time" format="HH:mm:ss:SS" />

    自定义样式

    通过插槽自定义倒计时的样式,timeData 对象格式见下方表格。

    <van-count-down :time="time">  <template #default="timeData">    <span class="block">{{ timeData.hours }}</span>    <span class="colon">:</span>    <span class="block">{{ timeData.minutes }}</span>    <span class="colon">:</span>    <span class="block">{{ timeData.seconds }}</span>  </template></van-count-down><style>  .colon {    display: inline-block;    margin: 0 4px;    color: #ee0a24;  }  .block {    display: inline-block;    width: 22px;    color: #fff;    font-size: 12px;    text-align: center;    background-color: #ee0a24;  }</style>

    手动控制

    通过 ref 获取到组件实例后,可以调用 start、pause、reset 方法。

    <van-count-down  ref="countDown"  millisecond  :time="3000"  :auto-start="false"  format="ss:SSS"  @finish="onFinish"/><van-grid clickable>  <van-grid-item text="开始" icon="play-circle-o" @click="start" />  <van-grid-item text="暂停" icon="pause-circle-o" @click="pause" />  <van-grid-item text="重置" icon="replay" @click="reset" /></van-grid>
    import { Toast } from 'vant';export default {  setup() {    const countDown = ref(null);    const start = () => {      countDown.value.start();    };    const pause = () => {      countDown.value.pause();    };    const reset = () => {      countDown.value.reset();    };    const onFinish = () => Toast('倒计时结束');    return {      start,      pause,      reset,      onFinish,      countDown,    };  },};

    API

    Props

    参数说明类型默认值
    time倒计时时长,单位毫秒number | string0
    format时间格式stringHH:mm:ss
    auto-start是否自动开始倒计时booleantrue
    millisecond是否开启毫秒级渲染booleanfalse

    format 格式

    格式说明
    DD天数
    HH小时
    mm分钟
    ss秒数
    S毫秒(1 位)
    SS毫秒(2 位)
    SSS毫秒(3 位)

    Events

    事件名说明回调参数
    finish倒计时结束时触发-
    change倒计时变化时触发currentTime: CurrentTime

    Slots

    名称说明参数
    default自定义内容currentTime: CurrentTime

    CurrentTime 格式

    名称说明类型
    total剩余总时间(单位毫秒)number
    days剩余天数number
    hours剩余小时number
    minutes剩余分钟number
    seconds剩余秒数number
    milliseconds剩余毫秒number

    方法

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

    方法名说明参数返回值
    start开始倒计时--
    pause暂停倒计时--
    reset重设倒计时,若 auto-start 为 true,重设后会自动开始倒计时--

    类型定义

    通过 CountDownInstance 获取 CountDown 实例的类型定义。

    import { ref } from 'vue';import type { CountDownInstance } from 'vant';const countDownRef = ref<CountDownInstance>();countDownRef.value?.start();

    样式变量

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

    名称默认值描述
    --van-count-down-text-colorvar(--van-text-color)-
    --van-count-down-font-sizevar(--van-font-size-md)-
    --van-count-down-line-heightvar(--van-line-height-md)-

    常见问题

    在 iOS 系统上倒计时不生效?

    如果你遇到了在 iOS 上倒计时不生效的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。

    对此问题的详细解释:stackoverflow


    介绍

    用于将内容分隔为多个区域。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Divider } from 'vant';const app = createApp();app.use(Divider);

    代码演示

    基础用法

    默认渲染一条水平分割线。

    <van-divider />

    展示文字

    通过插槽在可以分割线中间插入内容。

    <van-divider>文字</van-divider>

    内容位置

    通过 content-position 指定内容所在位置。

    <van-divider content-position="left">文字</van-divider><van-divider content-position="right">文字</van-divider>

    虚线

    添加 dashed 属性使分割线渲染为虚线。

    <van-divider dashed>文字</van-divider>

    自定义样式

    可以直接通过 style 属性设置分割线的样式。

    <van-divider  :style="{ color: '#1989fa', borderColor: '#1989fa', padding: '0 16px' }">  文字</van-divider>

    API

    Props

    参数说明类型默认值
    dashed是否使用虚线booleanfalse
    hairline是否使用 0.5px 线booleantrue
    content-position内容位置,可选值为 left rightstringcenter

    Slots

    名称说明
    default内容

    样式变量

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

    名称默认值描述
    --van-divider-marginvar(--van-padding-md) 0-
    --van-divider-text-colorvar(--van-gray-6)-
    --van-divider-font-sizevar(--van-font-size-md)-
    --van-divider-line-height24px-
    --van-divider-border-colorvar(--van-border-color)-
    --van-divider-content-paddingvar(--van-padding-md)-
    --van-divider-content-left-width10%-
    --van-divider-content-right-width10%-


    介绍

    空状态时的占位提示。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Empty } from 'vant';const app = createApp();app.use(Empty);

    代码演示

    基础用法

    <van-empty description="描述文字" />

    图片类型

    Empty 组件内置了多种占位图片类型,可以在不同业务场景下使用。

    <!-- 通用错误 --><van-empty image="error" description="描述文字" /><!-- 网络错误 --><van-empty image="network" description="描述文字" /><!-- 搜索提示 --><van-empty image="search" description="描述文字" />

    自定义图片

    需要自定义图片时,可以在 image 属性中传入任意图片 URL。

    <van-empty  class="custom-image"  image="https://img.yzcdn.cn/vant/custom-empty-image.png"  description="描述文字"/><style>  .custom-image .van-empty__image {    width: 90px;    height: 90px;  }</style>

    底部内容

    通过默认插槽可以在 Empty 组件的下方插入内容。

    <van-empty description="描述文字">  <van-button round type="danger" class="bottom-button">按钮</van-button></van-empty><style>  .bottom-button {    width: 160px;    height: 40px;  }</style>

    API

    Props

    参数说明类型默认值
    image图片类型,可选值为 error network search,支持传入图片 URLstringdefault
    image-size图片大小,默认单位为 pxnumber | string-
    description图片下方的描述文字string-

    Slots

    名称说明
    default自定义底部内容
    image自定义图标
    description自定义描述文字

    样式变量

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

    名称默认值描述
    --van-empty-paddingvar(--van-padding-xl) 0-
    --van-empty-image-size160px-
    --van-empty-description-margin-topvar(--van-padding-md)-
    --van-empty-description-padding0 60px-
    --van-empty-description-colorvar(--van-gray-6)-
    --van-empty-description-font-sizevar(--van-font-size-md)-
    --van-empty-description-line-heightvar(--van-line-height-md)-
    --van-empty-bottom-margin-top24px-


    介绍

    图片放大预览,支持函数调用和组件调用两种方式。

    实例演示

    函数调用

    ImagePreview 是一个函数,调用函数后会直接在页面中展示图片预览界面。

    import { ImagePreview } from 'vant';ImagePreview(['https://img.yzcdn.cn/vant/apple-1.jpg']);

    组件调用

    通过组件调用 ImagePreview 时,可以通过下面的方式进行注册。

    import { createApp } from 'vue';import { ImagePreview } from 'vant';// 全局注册const app = createApp();app.use(ImagePreview);// 局部注册export default {  components: {    [ImagePreview.Component.name]: ImagePreview.Component,  },};

    代码演示

    基础用法

    直接传入图片数组,即可展示图片预览。

    ImagePreview([  'https://img.yzcdn.cn/vant/apple-1.jpg',  'https://img.yzcdn.cn/vant/apple-2.jpg',]);

    指定初始位置

    ImagePreview 支持传入配置对象,并通过 startPosition 选项指定图片的初始位置(索引值)。

    ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  startPosition: 1,});

    展示关闭按钮

    设置 closeable 属性后,会在弹出层的右上角显示关闭图标,并且可以通过 close-icon 属性自定义图标,使用close-icon-position 属性可以自定义图标位置。

    ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  closeable: true,});

    监听关闭事件

    通过 onClose 选项监听图片预览的关闭事件。

    import { Toast } from 'vant';ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  onClose() {    Toast('关闭');  },});

    异步关闭

    通过 beforeClose 属性可以拦截关闭行为。

    const instance = ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  beforeClose: () => false,});setTimeout(() => {  // 调用实例上的 close 方法手动关闭图片预览  instance.close();}, 2000);

    组件调用

    如果需要在图片预览内嵌入组件或其他自定义内容,可以使用组件调用的方式,调用前需要通过 app.use 注册组件。

    <van-image-preview  v-model:show="state.show"  :images="state.images"  @change="onChange">  <template v-slot:index>第{{ index }}页</template></van-image-preview>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      show: false,      index: 0,    });    const onChange = (index) => {      state.index = index;    };    return {      state,      images: [        'https://img.yzcdn.cn/vant/apple-1.jpg',        'https://img.yzcdn.cn/vant/apple-2.jpg',      ],      onChange,    };  },};

    API

    Options

    通过函数调用 ImagePreview 时,支持传入以下选项:

    参数名说明类型默认值
    images需要预览的图片 URL 数组string[][]
    startPosition图片预览起始位置索引number | string0
    swipeDuration动画时长,单位为 msnumber | string300
    showIndex是否显示页码booleantrue
    showIndicators是否显示轮播指示器booleanfalse
    loop是否开启循环播放booleantrue
    onClose关闭时的回调函数Function-
    onChange切换图片时的回调函数,回调参数为当前索引Function-
    onScale缩放图片时的回调函数,回调参数为当前索引和当前缩放值组成的对象Function-
    beforeClose关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(active: number) => boolean | Promise<boolean>-
    closeOnPopstate是否在页面回退时自动关闭booleantrue
    className自定义类名string | Array | object-
    maxZoom手势缩放时,最大缩放比例number | string3
    minZoom手势缩放时,最小缩放比例number | string1/3
    closeable是否显示关闭图标booleanfalse
    closeIcon关闭图标名称或图片链接stringclear
    closeIconPosition关闭图标位置,可选值为 top-left
    bottom-left bottom-right
    stringtop-right
    transition v3.0.8动画类名,等价于 transition 的 name 属性stringvan-fade
    overlay-style v3.0.8自定义遮罩层样式object-
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-

    Props

    通过组件调用 ImagePreview 时,支持以下 Props:

    参数说明类型默认值
    v-model:show是否展示图片预览booleanfalse
    images需要预览的图片 URL 数组string[][]
    start-position图片预览起始位置索引number | string0
    swipe-duration动画时长,单位为 msnumber | string300
    show-index是否显示页码booleantrue
    show-indicators是否显示轮播指示器booleanfalse
    loop是否开启循环播放booleantrue
    before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(active: number) => boolean | Promise<boolean>-
    close-on-popstate是否在页面回退时自动关闭booleantrue
    class-name自定义类名string | Array | object-
    max-zoom手势缩放时,最大缩放比例number | string3
    min-zoom手势缩放时,最小缩放比例number | string1/3
    closeable是否显示关闭图标booleanfalse
    close-icon关闭图标名称或图片链接stringclear
    close-icon-position关闭图标位置,可选值为 top-left
    bottom-left bottom-right
    stringtop-right
    transition v3.0.8动画类名,等价于 transition 的 name 属性stringvan-fade
    overlay-style v3.0.8自定义遮罩层样式object-
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-

    Events

    通过组件调用 ImagePreview 时,支持以下事件:

    事件说明回调参数
    close关闭时触发{ index: 索引, url: 图片链接 }
    closed关闭且且动画结束后触发-
    change切换当前图片时触发index: 当前图片的索引
    scale缩放当前图片时触发{ index: 当前图片的索引, scale: 当前缩放的值 }

    方法

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

    方法名说明参数返回值
    swipeTo 2.9.0切换到指定位置index: number, options: Options-

    Slots

    通过组件调用 ImagePreview 时,支持以下插槽:

    名称说明参数
    index自定义页码内容{ index: 当前图片的索引 }
    cover自定义覆盖在图片预览上方的内容-

    onClose 回调参数

    参数名说明类型
    url当前图片 URLstring
    index当前图片的索引值number

    onScale 回调参数

    参数名说明类型
    index当前图片的索引值number
    scale当前图片的缩放值number

    样式变量

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

    名称默认值描述
    --van-image-preview-index-text-colorvar(--van-white)-
    --van-image-preview-index-font-sizevar(--van-font-size-md)-
    --van-image-preview-index-line-heightvar(--van-line-height-md)-
    --van-image-preview-index-text-shadow0 1px 1px var(--van-gray-8)-
    --van-image-preview-overlay-background-colorrgba(0, 0, 0, 0.9)-
    --van-image-preview-close-icon-size22px-
    --van-image-preview-close-icon-colorvar(--van-gray-5)-
    --van-image-preview-close-icon-active-colorvar(--van-gray-6)-
    --van-image-preview-close-icon-marginvar(--van-padding-md)-
    --van-image-preview-close-icon-z-index1-

    常见问题

    在桌面端无法操作组件?

    参见桌面端适配

    在 JSX 中渲染 ImagePreview 组件无法展示?

    请注意 ImagePreview 是一个函数,ImagePreview.Component 才是 ImagePreview 对应的组件。JSX 调用图片预览的正确姿势如下:

    export default {  setup() {    const show = ref(false);    return () => <ImagePreview.Component v-model={[show, 'show']} />;  },};


    介绍

    当页面需要加载大量内容时,使用懒加载可以实现延迟加载页面可视区域外的内容,从而使页面加载更流畅。

    实例演示

    引入

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

    Lazyload 是 Vue 指令,使用前需要对指令进行注册。

    import { createApp } from 'vue';import { Lazyload } from 'vant';const app = createApp();app.use(Lazyload);// 注册时可以配置额外的选项app.use(Lazyload, {  lazyComponent: true,});

    代码演示

    基础用法

    将 v-lazy 指令的值设置为你需要懒加载的图片。

    <img v-for="img in imageList" v-lazy="img" />
    export default {  setup() {    return {      imageList: [        'https://img.yzcdn.cn/vant/apple-1.jpg',        'https://img.yzcdn.cn/vant/apple-2.jpg',      ],    };  },};

    背景图懒加载

    和图片懒加载不同,背景图懒加载需要使用 v-lazy:background-image,值设置为背景图片的地址,需要注意的是必须声明容器高度。

    <div v-for="img in imageList" v-lazy:background-image="img" />

    组件懒加载

    将需要懒加载的组件放在 lazy-component 标签中,即可实现组件懒加载。

    // 注册时设置`lazyComponent`选项app.use(Lazyload, {  lazyComponent: true,});
    <lazy-component>  <img v-for="img in imageList" v-lazy="img" /></lazy-component>

    API

    Options

    参数说明类型默认值
    loading加载时的图片string-
    error错误时的图片string-
    preload预加载高度的比例string-
    attempt尝试次数number3
    listenEvents监听的事件string[]scroll
    adapter适配器object-
    filter图片 URL 过滤object-
    lazyComponent是否能懒加载模块booleanfalse
    更多内容请参照:vue-lazyload 官方文档

    常见问题

    通过 CDN 引入 Vant 时,没有自动注册 Lazyload 组件?

    由于 Lazyload 组件在注册时可以传入一些配置项,所以我们不会自动注册 Lazyload 组件,需要手动进行注册:

    const app = Vue.createApp();app.use(vant.Lazyload, {  lazyComponent: true,});


    None

    介绍

    用于循环播放展示一组消息通知。

    实例演示

    引入

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

    import { createApp } from 'vue';import { NoticeBar } from 'vant';const app = createApp();app.use(NoticeBar);

    代码演示

    基础用法

    通过 text 属性设置通知栏的内容,通过 left-icon 属性设置通知栏左侧的图标。

    <van-notice-bar  left-icon="volume-o"  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>

    滚动播放

    通知栏的内容长度溢出时会自动开启滚动播放,通过 scrollable 属性可以控制该行为。

    <!-- 文字较短时,通过设置 scrollable 属性开启滚动播放 --><van-notice-bar scrollable text="技术是开发它的人的共同灵魂。" /><!-- 文字较长时,通过禁用 scrollable 属性关闭滚动播放 --><van-notice-bar  :scrollable="false"  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>

    多行展示

    文字较长时,可以通过设置 wrapable 属性来开启多行展示。

    <van-notice-bar  wrapable  :scrollable="false"  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>

    通知栏模式

    通知栏支持 closeable 和 link 两种模式。

    <!-- closeable 模式,在右侧显示关闭按钮 --><van-notice-bar mode="closeable">技术是开发它的人的共同灵魂。</van-notice-bar><!-- link 模式,在右侧显示链接箭头 --><van-notice-bar mode="link">技术是开发它的人的共同灵魂。</van-notice-bar>

    自定义样式

    通过 color 属性设置文本颜色,通过 background 属性设置背景色。

    <van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o">  技术是开发它的人的共同灵魂。</van-notice-bar>

    垂直滚动

    搭配 NoticeBar 和 Swipe 组件可以实现垂直滚动的效果。

    <van-notice-bar left-icon="volume-o" :scrollable="false">  <van-swipe    vertical    class="notice-swipe"    :autoplay="3000"    :show-indicators="false"  >    <van-swipe-item>内容 1</van-swipe-item>    <van-swipe-item>内容 2</van-swipe-item>    <van-swipe-item>内容 3</van-swipe-item>  </van-swipe></van-notice-bar><style>  .notice-swipe {    height: 40px;    line-height: 40px;  }</style>

    API

    Props

    参数说明类型默认值
    mode通知栏模式,可选值为 closeable linkstring''
    text通知文本内容string''
    color通知文本颜色string#f60
    background滚动条背景string#fff7cc
    left-icon左侧图标名称或图片链接string-
    delay动画延迟时间 (s)number | string1
    speed滚动速率 (px/s)number | string60
    scrollable是否开启滚动播放,内容长度溢出时默认开启boolean-
    wrapable是否开启文本换行,只在禁用滚动时生效booleanfalse

    Events

    事件名说明回调参数
    click点击通知栏时触发event: MouseEvent
    close关闭通知栏时触发event: MouseEvent
    replay每当滚动栏重新开始滚动时触发-

    方法

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

    方法名说明参数返回值
    reset v3.1.1重置通知栏到初始状态--

    Slots

    名称内容
    default通知文本内容
    left-icon自定义左侧图标
    right-icon自定义右侧图标

    样式变量

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

    名称默认值描述
    --van-notice-bar-height40px-
    --van-notice-bar-padding0 var(--van-padding-md)-
    --van-notice-bar-wrapable-paddingvar(--van-padding-xs) var(--van-padding-md)-
    --van-notice-bar-text-colorvar(--van-orange-dark)-
    --van-notice-bar-font-sizevar(--van-font-size-md)-
    --van-notice-bar-line-height24px-
    --van-notice-bar-background-colorvar(--van-orange-light)-
    --van-notice-bar-icon-size16px-
    --van-notice-bar-icon-min-width24px-


    介绍

    弹出式的气泡菜单。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Popover } from 'vant';const app = createApp();app.use(Popover);

    代码演示

    基础用法

    当 Popover 弹出时,会基于 reference 插槽的内容进行定位。

    <van-popover v-model:show="showPopover" :actions="actions" @select="onSelect">  <template #reference>    <van-button type="primary">浅色风格</van-button>  </template></van-popover>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const showPopover = ref(false);    // 通过 actions 属性来定义菜单选项    const actions = [      { text: '选项一' },      { text: '选项二' },      { text: '选项三' },    ];    const onSelect = (action) => Toast(action.text);    return {      actions,      onSelect,      showPopover,    };  },};

    深色风格

    Popover 支持浅色和深色两种风格,默认为浅色风格,将 theme 属性设置为 dark 可切换为深色风格。

    <van-popover v-model:show="showPopover" theme="dark" :actions="actions">  <template #reference>    <van-button type="primary">深色风格</van-button>  </template></van-popover>
    import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    const actions = [      { text: '选项一' },      { text: '选项二' },      { text: '选项三' },    ];    return {      actions,      showPopover,    };  },};

    弹出位置

    通过 placement 属性来控制气泡的弹出位置。

    <van-popover placement="top" />

    placement 支持以下值:

    top           # 顶部中间位置top-start     # 顶部左侧位置top-end       # 顶部右侧位置left          # 左侧中间位置left-start    # 左侧上方位置left-end      # 左侧下方位置right         # 右侧中间位置right-start   # 右侧上方位置right-end     # 右侧下方位置bottom        # 底部中间位置bottom-start  # 底部左侧位置bottom-end    # 底部右侧位置

    展示图标

    在 actions 数组中,可以通过 icon 字段来定义选项的图标,支持传入图标名称或图片链接。

    <van-popover v-model:show="showPopover" :actions="actions">  <template #reference>    <van-button type="primary">展示图标</van-button>  </template></van-popover>
    import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    const actions = [      { text: '选项一', icon: 'add-o' },      { text: '选项二', icon: 'music-o' },      { text: '选项三', icon: 'more-o' },    ];    return {      actions,      showPopover,    };  },};

    禁用选项

    在 actions 数组中,可以通过 disabled 字段来禁用某个选项。

    <van-popover v-model:show="showPopover" :actions="actions">  <template #reference>    <van-button type="primary">禁用选项</van-button>  </template></van-popover>
    import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    const actions = [      { text: '选项一', disabled: true },      { text: '选项二', disabled: true },      { text: '选项三' },    ];    return {      actions,      showPopover,    };  },};

    自定义内容

    通过默认插槽,可以在 Popover 内部放置任意内容。

    <van-popover v-model:show="showPopover">  <van-grid    square    clickable    :border="false"    column-num="3"    style="width: 240px;"  >    <van-grid-item      v-for="i in 6"      :key="i"      text="选项"      icon="photo-o"      @click="showPopover = false"    />  </van-grid>  <template #reference>    <van-button type="primary">自定义内容</van-button>  </template></van-popover>
    import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    return { showPopover };  },};

    API

    Props

    参数说明类型默认值
    v-model:show是否展示气泡弹出层booleanfalse
    actions选项列表Action[][]
    placement弹出位置stringbottom
    theme主题风格,可选值为 darkstringlight
    trigger触发方式,可选值为 manualclick
    duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
    offset出现位置的偏移量[number, number][0, 8]
    overlay是否显示遮罩层booleanfalse
    overlay-class v3.0.10自定义遮罩层类名string | Array | object-
    overlay-style v3.0.10自定义遮罩层样式object-
    close-on-click-action是否在点击选项后关闭booleantrue
    close-on-click-outside是否在点击外部元素后关闭菜单booleantrue
    close-on-click-overlay v3.0.10是否在点击遮罩层后关闭菜单booleantrue
    teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Elementbody
    icon-prefix v3.0.17图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon

    Action 数据结构

    actions 属性是一个由对象构成的数组,数组中的每个对象配置一列,对象可以包含以下值:

    键名说明类型
    text选项文字string
    icon文字左侧的图标,支持传入图标名称或图片链接string
    color选项文字颜色string
    disabled是否为禁用状态boolean
    className为对应选项添加额外的类名string | Array | object

    Events

    事件名说明回调参数
    select点击选项时触发action: Action, index: number
    open打开菜单时触发-
    close关闭菜单时触发-
    opened打开菜单且动画结束后触发-
    closed关闭菜单且动画结束后触发-
    click-overlay点击遮罩层时触发event: MouseEvent

    Slots

    名称说明
    default自定义菜单内容
    reference触发 Popover 显示的元素内容

    样式变量

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

    名称默认值描述
    --van-popover-arrow-size6px-
    --van-popover-border-radiusvar(--van-border-radius-lg)-
    --van-popover-action-width128px-
    --van-popover-action-height44px-
    --van-popover-action-font-sizevar(--van-font-size-md)-
    --van-popover-action-line-heightvar(--van-line-height-md)-
    --van-popover-action-icon-size20px-
    --van-popover-light-text-colorvar(--van-text-color)-
    --van-popover-light-background-colorvar(--van-white)-
    --van-popover-light-action-disabled-text-colorvar(--van-gray-5)-
    --van-popover-dark-text-colorvar(--van-white)-
    --van-popover-dark-background-color#4a4a4a-
    --van-popover-dark-action-disabled-text-colorvar(--van-gray-6)-

    常见问题

    Popover 的点击事件无法正确触发?

    这种情况通常是由于项目中引入了 fastclick 库导致的。建议移除 fastclick,或者配置 fastclick 的 ignore 规则



    介绍

    用于展示操作的当前进度。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Progress } from 'vant';const app = createApp();app.use(Progress);

    代码演示

    基础用法

    进度条默认为蓝色,使用 percentage 属性来设置当前进度。

    <van-progress :percentage="50" />

    线条粗细

    通过 stroke-width 可以设置进度条的粗细。

    <van-progress :percentage="50" stroke-width="8" />

    置灰

    设置 inactive 属性后进度条将置灰。

    <van-progress inactive :percentage="50" />

    样式定制

    可以使用 pivot-text 属性自定义文字,color 属性自定义进度条颜色。

    <van-progress pivot-text="橙色" color="#f2826a" :percentage="25" /><van-progress pivot-text="红色" color="#ee0a24" :percentage="50" /><van-progress  :percentage="75"  pivot-text="紫色"  pivot-color="#7232dd"  color="linear-gradient(to right, #be99ff, #7232dd)"/>

    API

    Props

    参数说明类型默认值
    percentage进度百分比number | string0
    stroke-width进度条粗细,默认单位为pxnumber | string4px
    color进度条颜色string#1989fa
    track-color轨道颜色string#e5e5e5
    pivot-text进度文字内容string百分比
    pivot-color进度文字背景色string同进度条颜色
    text-color进度文字颜色stringwhite
    inactive是否置灰booleanfalse
    show-pivot是否显示进度文字booleantrue

    方法

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

    方法名说明参数返回值
    resize外层元素大小变化后,可以调用此方法来触发重绘--

    样式变量

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

    名称默认值描述
    --van-progress-height4px-
    --van-progress-colorvar(--van-primary-color)-
    --van-progress-background-colorvar(--van-gray-3)-
    --van-progress-pivot-padding0 5px-
    --van-progress-pivot-text-colorvar(--van-white)-
    --van-progress-pivot-font-sizevar(--van-font-size-xs)-
    --van-progress-pivot-line-height1.6-
    --van-progress-pivot-background-colorvar(--van-primary-color)-

    常见问题

    组件从隐藏状态切换到显示状态时,渲染不正确?

    Progress 组件在挂载时,会获取自身的宽度,并计算出进度条的样式。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示正确的进度。

    解决方法

    方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

    <!-- Before --><van-progress v-show="show" /><!-- After --><van-progress v-if="show" />

    方法二,调用组件的 resize 方法来主动触发重绘:

    <van-progress v-show="show" ref="progress" />
    this.$refs.progress.resize();


    介绍

    用于在内容加载过程中展示一组占位图形。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Skeleton } from 'vant';const app = createApp();app.use(Skeleton);

    代码演示

    基础用法

    通过 title 属性显示标题占位图,通过 row 属性配置占位段落行数。

    <van-skeleton title :row="3" />

    显示头像

    通过 avatar 属性显示头像占位图。

    <van-skeleton title avatar :row="3" />

    展示子组件

    将 loading 属性设置成 false 表示内容加载完成,此时会隐藏占位图,并显示 Skeleton 的子组件。

    <van-skeleton title avatar :row="3" :loading="loading">  <div>实际内容</div></van-skeleton>
    import { ref, onMounted } from 'vue';export default {  setup() {    const loading = ref(true);    onMounted(() => {      loading.value = false;    });    return {      loading,    };  },};

    API

    Props

    参数说明类型默认值
    row段落占位图行数number | string0
    row-width段落占位图宽度,可传数组来设置每一行的宽度number | string |
    (number | string)[]
    100%
    title是否显示标题占位图booleanfalse
    avatar是否显示头像占位图booleanfalse
    loading是否显示骨架屏,传 false 时会展示子组件内容booleantrue
    animate是否开启动画booleantrue
    round是否将标题和段落显示为圆角风格booleanfalse
    title-width标题占位图宽度number | string40%
    avatar-size头像占位图大小number | string32px
    avatar-shape头像占位图形状,可选值为 squarestringround

    样式变量

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

    名称默认值描述
    --van-skeleton-row-height16px-
    --van-skeleton-row-background-colorvar(--van-active-color)-
    --van-skeleton-row-margin-topvar(--van-padding-sm)-
    --van-skeleton-title-width40%-
    --van-skeleton-avatar-size32px-
    --van-skeleton-avatar-background-colorvar(--van-active-color)-
    --van-skeleton-animation-duration1.2s-


    介绍

    用于展示操作流程的各个环节,让用户了解当前的操作在整体流程中的位置。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Step, Steps } from 'vant';const app = createApp();app.use(Step);app.use(Steps);

    代码演示

    基础用法

    active 属性表示当前步骤的索引,从 0 起计。

    <van-steps :active="active">  <van-step>买家下单</van-step>  <van-step>商家接单</van-step>  <van-step>买家提货</van-step>  <van-step>交易完成</van-step></van-steps>
    import { ref } from 'vue';export default {  setup() {    const active = ref(1);    return { active };  },};

    自定义样式

    可以通过 active-icon 和 active-color 属性设置激活状态下的图标和颜色。

    <van-steps :active="active" active-icon="success" active-color="#38f">  <van-step>买家下单</van-step>  <van-step>商家接单</van-step>  <van-step>买家提货</van-step>  <van-step>交易完成</van-step></van-steps>

    竖向步骤条

    可以通过设置 direction 属性来改变步骤条的显示方向。

    <van-steps direction="vertical" :active="0">  <van-step>    <h3>【城市】物流状态1</h3>    <p>2016-07-12 12:40</p>  </van-step>  <van-step>    <h3>【城市】物流状态2</h3>    <p>2016-07-11 10:00</p>  </van-step>  <van-step>    <h3>快件已发货</h3>    <p>2016-07-10 09:30</p>  </van-step></van-steps>

    API

    Steps Props

    参数说明类型默认值
    active当前步骤对应的索引值number | string0
    direction步骤条方向,可选值为 verticalstringhorizontal
    active-icon当前步骤对应的底部图标,可选值见 Icon 组件stringchecked
    inactive-icon非当前步骤对应的底部图标,可选值见 Icon 组件string-
    finish-icon v3.0.7已完成步骤对应的底部图标,优先级高于 inactive-icon,可选值见 Icon 组件string-
    active-color当前步骤和已完成步骤的颜色string#07c160
    inactive-color未激活步骤的颜色string#969799
    icon-prefix v3.0.15图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon

    Step Slots

    名称说明
    active-icon自定义激活状态图标
    inactive-icon自定义未激活状态图标
    finish-icon v3.0.7自定义已完成步骤对应的底部图标,优先级高于 inactive-icon

    Steps Events

    事件名说明回调参数
    click-step点击步骤的标题或图标时触发index: number

    样式变量

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

    名称默认值描述
    --van-step-text-colorvar(--van-gray-6)-
    --van-step-active-colorvar(--van-success-color)-
    --van-step-process-text-colorvar(--van-text-color)-
    --van-step-font-sizevar(--van-font-size-md)-
    --van-step-line-colorvar(--van-border-color)-
    --van-step-finish-line-colorvar(--van-success-color)-
    --van-step-finish-text-colorvar(--van-text-color)-
    --van-step-icon-size12px-
    --van-step-circle-size5px-
    --van-step-circle-colorvar(--van-gray-6)-
    --van-step-horizontal-title-font-sizevar(--van-font-size-sm)-
    --van-steps-background-colorvar(--van-white)-


    介绍

    Sticky 组件与 CSS 中 position: sticky 属性实现的效果一致,当组件在屏幕范围内时,会按照正常的布局排列,当组件滚出屏幕范围时,始终会固定在屏幕顶部。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Sticky } from 'vant';const app = createApp();app.use(Sticky);

    代码演示

    基础用法

    将内容包裹在 Sticky 组件内即可。

    <van-sticky>  <van-button type="primary">基础用法</van-button></van-sticky>

    吸顶距离

    通过 offset-top 属性可以设置组件在吸顶时与顶部的距离。

    <van-sticky :offset-top="50">  <van-button type="primary">吸顶距离</van-button></van-sticky>

    指定容器

    通过 container 属性可以指定组件的容器,页面滚动时,组件会始终保持在容器范围内,当组件即将超出容器底部时,会固定在容器的底部。

    <div ref="container" style="height: 150px;">  <van-sticky :container="container">    <van-button type="warning">指定容器</van-button>  </van-sticky></div>
    export default {  setup() {    const container = ref(null);    return { container };  },};

    吸底距离

    将 position 设置为 bottom 可以让组件吸附在底部。通过 offset-bottom 属性可以设置组件在吸底时与底部的距离。

    <van-sticky :offset-bottom="50" position="bottom">  <van-button type="primary">吸底距离</van-button></van-sticky>

    API

    Props

    参数说明类型默认值
    position v3.0.6吸附位置,可选值为 bottomstringtop
    offset-top吸顶时与顶部的距离,支持 px vw vh rem 单位,默认 pxnumber | string0
    offset-bottom v3.0.6吸底时与底部的距离,支持 px vw vh rem 单位,默认 pxnumber | string0
    z-index吸顶时的 z-indexnumber | string99
    container容器对应的 HTML 节点Element-

    Events

    事件名说明回调参数
    change v3.0.10当吸顶状态改变时触发isFixed: boolean
    scroll滚动时触发{ scrollTop: number, isFixed: boolean }

    样式变量

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

    名称默认值描述
    --van-sticky-z-index99-


    介绍

    用于循环播放一组图片或内容。

    实例演示

    引入

    通过以下方式来全局注册组件,更多注册方式请参考组件注册import { createApp } from 'vue';

    import { Swipe, SwipeItem } from 'vant';const app = createApp();app.use(Swipe);app.use(SwipeItem);

    代码演示

    基础用法

    每个 SwipeItem 代表一张轮播卡片,可以通过 autoplay 属性设置自动轮播的间隔。

    <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe><style>  .my-swipe .van-swipe-item {    color: #fff;    font-size: 20px;    line-height: 150px;    text-align: center;    background-color: #39a9ed;  }</style>

    懒加载

    当 Swipe 中含有图片时,可以通过 lazy-render 属性来开启懒加载模式。在懒加载模式下,只会渲染当前页和下一页。

    <van-swipe :autoplay="3000" lazy-render>  <van-swipe-item v-for="image in images" :key="image">    <img :src="image" />  </van-swipe-item></van-swipe>
    export default {  setup() {    const images = [      'https://img.yzcdn.cn/vant/apple-1.jpg',      'https://img.yzcdn.cn/vant/apple-2.jpg',    ];    return { images };  },};

    监听 change 事件

    在每一页轮播结束后,会触发 change 事件。

    <van-swipe @change="onChange">  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe>
    import { Toast } from 'vant';export default {  setup() {    const onChange = (index) => Toast('当前 Swipe 索引:' + index);    return { onChange };  },};

    纵向滚动

    设置 vertical 属性后滑块会纵向排列,此时需要指定滑块容器的高度。

    <van-swipe style="height: 200px;" vertical>  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe>

    自定义滑块大小

    滑块默认宽度为 100%,可以通过 width 属性设置单个滑块的宽度。纵向滚动模式下,可以通过 height 属性设置单个滑块的高度。

    <van-swipe :loop="false" :width="300">  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe>
    目前不支持在循环滚动模式下自定义滑块大小,因此需要将 loop 设置为 false。

    自定义指示器

    通过 indicator 插槽可以自定义指示器的样式。

    <van-swipe>  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item>  <template #indicator="{ active }">    <div class="custom-indicator">{{ active + 1 }}/4</div>  </template></van-swipe><style>  .custom-indicator {    position: absolute;    right: 5px;    bottom: 5px;    padding: 2px 5px;    font-size: 12px;    background: rgba(0, 0, 0, 0.1);  }</style>

    API

    Swipe Props

    参数说明类型默认值
    autoplay自动轮播间隔,单位为 msnumber | string-
    duration动画时长,单位为 msnumber | string500
    initial-swipe初始位置索引值number | string0
    width滑块宽度,单位为 pxnumber | stringauto
    height滑块高度,单位为 pxnumber | stringauto
    loop是否开启循环播放booleantrue
    show-indicators是否显示指示器booleantrue
    vertical是否为纵向滚动booleanfalse
    touchable是否可以通过手势滑动booleantrue
    stop-propagation是否阻止滑动事件冒泡booleantrue
    lazy-render是否延迟渲染未展示的轮播booleanfalse
    indicator-color指示器颜色string#1989fa

    Swipe Events

    事件名说明回调参数
    change每一页轮播结束后触发index, 当前页的索引

    SwipeItem Events

    事件名说明回调参数
    click点击时触发event: MouseEvent

    Swipe 方法

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

    方法名说明参数返回值
    prev切换到上一轮播--
    next切换到下一轮播--
    swipeTo切换到指定位置index: number, options: SwipeToOptions-
    resize外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘--

    类型定义

    通过 SwipeInstance 获取 Swipe 实例的类型定义。

    import { ref } from 'vue';import type { SwipeInstance } from 'vant';const swipeRef = ref<SwipeInstance>();swipeRef.value?.next();

    SwipeToOptions 格式

    名称说明类型
    immediate是否跳过动画boolean

    Swipe Slots

    名称说明参数
    default轮播内容-
    indicator v3.0.16自定义指示器{ active: number }

    样式变量

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

    名称默认值描述
    --van-swipe-indicator-size6px-
    --van-swipe-indicator-marginvar(--van-padding-sm)-
    --van-swipe-indicator-active-opacity1-
    --van-swipe-indicator-inactive-opacity0.3-
    --van-swipe-indicator-active-background-colorvar(--van-primary-color)-
    --van-swipe-indicator-inactive-background-colorvar(--van-border-color)-

    常见问题

    滑动轮播时为什么触发了 click 事件?

    这种情况通常是由于项目中引入了 fastclick 库导致的。fastclick 的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。

    将 Swipe 组件的 stop-propagation 属性设置为 false 即可避免该问题。

    在桌面端无法操作组件?

    参见桌面端适配

    Swipe 组件功能太少,无法实现复杂效果?

    Vant 中的 Swipe 组件是比较轻量的,因此功能也比较基础。如果需要更复杂的轮播效果,推荐使用社区里一些优质的轮播库,比如 vue-awesome-swiper

    组件从隐藏状态切换到显示状态时,无法正确渲染?

    Swipe 组件在挂载时,会获取自身的宽度,并计算出轮播图的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法正确计算位置。

    解决方法

    方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

    <!-- Before --><van-swipe v-show="show" /><!-- After --><van-swipe v-if="show" />

    方法二,调用组件的 resize 方法来主动触发重绘:

    <van-swipe v-show="show" ref="swipe" />
    this.$refs.swipe.resize();


    介绍

    用于标记关键词和概括主要内容。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Tag } from 'vant';const app = createApp();app.use(Tag);

    代码演示

    基础用法

    通过 type 属性控制标签颜色。

    <van-tag type="primary">标签</van-tag><van-tag type="success">标签</van-tag><van-tag type="danger">标签</van-tag><van-tag type="warning">标签</van-tag>

    空心样式

    设置 plain 属性设置为空心样式。

    <van-tag plain type="primary">标签</van-tag>

    圆角样式

    通过 round 设置为圆角样式。

    <van-tag round type="primary">标签</van-tag>

    标记样式

    通过 mark 设置为标记样式(半圆角)。

    <van-tag mark type="primary">标签</van-tag>

    可关闭标签

    添加 closeable 属性表示标签是可关闭的,关闭标签时会触发 close 事件,在 close 事件中可以执行隐藏标签的逻辑。

    <van-tag :show="show" closeable size="medium" type="primary" @close="close">  标签</van-tag>
    import { ref } from 'vue';export default {  setup() {    const show = ref(true);    const close = () => {      show.value = false;    };    return {      show,      close,    };  },};

    标签大小

    通过 size 属性调整标签大小。

    <van-tag type="primary">标签</van-tag><van-tag type="primary" size="medium">标签</van-tag><van-tag type="primary" size="large">标签</van-tag>

    自定义颜色

    通过 color 和 text-color 属性设置标签颜色。

    <van-tag color="#7232dd">标签</van-tag><van-tag color="#ffe1e1" text-color="#ad0000">标签</van-tag><van-tag color="#7232dd" plain>标签</van-tag>

    API

    Props

    参数说明类型默认值
    type类型,可选值为 primary success danger warningstringdefault
    size大小, 可选值为 large mediumstring-
    color标签颜色string-
    show是否展示标签booleantrue
    plain是否为空心样式booleanfalse
    round是否为圆角样式booleanfalse
    mark是否为标记样式booleanfalse
    text-color文本颜色,优先级高于 color 属性stringwhite
    closeable是否为可关闭标签booleanfalse

    Slots

    名称说明
    default标签显示内容

    Events

    事件名说明回调参数
    click点击时触发event: MouseEvent
    close关闭标签时触发event: MouseEvent

    样式变量

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

    名称默认值描述
    --van-tag-padding0 var(--van-padding-base)-
    --van-tag-text-colorvar(--van-white)-
    --van-tag-font-sizevar(--van-font-size-sm)-
    --van-tag-border-radius2px-
    --van-tag-line-height16px-
    --van-tag-medium-padding2px 6px-
    --van-tag-large-paddingvar(--van-padding-base) var(--van-padding-xs)-
    --van-tag-large-border-radiusvar(--van-border-radius-md)-
    --van-tag-large-font-sizevar(--van-font-size-md)-
    --van-tag-round-border-radiusvar(--van-border-radius-max)-
    --van-tag-danger-colorvar(--van-danger-color)-
    --van-tag-primary-colorvar(--van-primary-color)-
    --van-tag-success-colorvar(--van-success-color)-
    --van-tag-warning-colorvar(--van-warning-color)-
    --van-tag-default-colorvar(--van-gray-6)-
    --van-tag-plain-background-colorvar(--van-white)-


    介绍

    用于为页面相关操作提供便捷交互。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ActionBar, ActionBarIcon, ActionBarButton } from 'vant';const app = createApp();app.use(ActionBar);app.use(ActionBarIcon);app.use(ActionBarButton);

    代码演示

    基础用法

    <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" @click="onClickIcon" />  <van-action-bar-icon icon="cart-o" text="购物车" @click="onClickIcon" />  <van-action-bar-icon icon="shop-o" text="店铺" @click="onClickIcon" />  <van-action-bar-button type="danger" text="立即购买" @click="onClickButton" /></van-action-bar>
    import { Toast } from 'vant';export default {  setup() {    const onClickIcon = () => Toast('点击图标');    const onClickButton = () => Toast('点击按钮');    return {      onClickIcon,      onClickButton,    };  },};

    徽标提示

    在 ActionBarIcon 组件上设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

    <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" dot />  <van-action-bar-icon icon="cart-o" text="购物车" badge="5" />  <van-action-bar-icon icon="shop-o" text="店铺" badge="12" />  <van-action-bar-button type="warning" text="加入购物车" />  <van-action-bar-button type="danger" text="立即购买" /></van-action-bar>

    自定义图标颜色

    通过 ActionBarIcon 的 color 属性可以自定义图标的颜色。

    <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" color="#ee0a24" />  <van-action-bar-icon icon="cart-o" text="购物车" />  <van-action-bar-icon icon="star" text="已收藏" color="#ff5000" />  <van-action-bar-button type="warning" text="加入购物车" />  <van-action-bar-button type="danger" text="立即购买" /></van-action-bar>

    自定义按钮颜色

    通过 ActionBarButton 的 color 属性可以自定义按钮的颜色,支持传入 linear-gradient 渐变色。

    <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" />  <van-action-bar-icon icon="shop-o" text="店铺" />  <van-action-bar-button color="#be99ff" type="warning" text="加入购物车" />  <van-action-bar-button color="#7232dd" type="danger" text="立即购买" /></van-action-bar>

    API

    ActionBar Props

    参数说明类型默认值
    safe-area-inset-bottom是否开启底部安全区适配booleantrue

    ActionBarIcon Props

    参数说明类型默认值
    text按钮文字string-
    icon图标string-
    color图标颜色string#323233
    icon-class图标额外类名string | Array | object-
    icon-prefix v3.0.17图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon
    dot是否显示图标右上角小红点booleanfalse
    badge图标右上角徽标的内容number | string-
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse

    ActionBarButton Props

    参数说明类型默认值
    text按钮文字string-
    type按钮类型,可选值为 primary info warning dangerstringdefault
    color按钮颜色,支持传入 linear-gradient 渐变色string-
    icon左侧图标名称或图片链接string-
    disabled是否禁用按钮booleanfalse
    loading是否显示为加载状态booleanfalse
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse

    ActionBarIcon Slots

    名称说明
    default文本内容
    icon自定义图标

    ActionBarButton Slots

    名称说明
    default按钮显示内容

    样式变量

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

    名称默认值描述
    --van-action-bar-background-colorvar(--van-white)-
    --van-action-bar-height50px-
    --van-action-bar-icon-width48px-
    --van-action-bar-icon-height100%-
    --van-action-bar-icon-colorvar(--van-text-color)-
    --van-action-bar-icon-size18px-
    --van-action-bar-icon-font-sizevar(--van-font-size-xs)-
    --van-action-bar-icon-active-colorvar(--van-active-color)-
    --van-action-bar-icon-text-colorvar(--van-gray-7)-
    --van-action-bar-icon-background-colorvar(--van-white)-
    --van-action-bar-button-height40px-
    --van-action-bar-button-warning-colorvar(--van-gradient-orange)-
    --van-action-bar-button-danger-colorvar(--van-gradient-red)-


    介绍

    宫格可以在水平方向上把页面分隔成等宽度的区块,用于展示内容或进行页面导航。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Grid, GridItem } from 'vant';const app = createApp();app.use(Grid);app.use(GridItem);

    代码演示

    基础用法

    通过 icon 属性设置格子内的图标,text 属性设置文字内容。

    <van-grid>  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" /></van-grid>

    自定义列数

    默认一行展示四个格子,可以通过 column-num 自定义列数。

    <van-grid :column-num="3">  <van-grid-item v-for="value in 6" :key="value" icon="photo-o" text="文字" /></van-grid>

    自定义内容

    通过插槽可以自定义格子展示的内容。

    <van-grid :border="false" :column-num="3">  <van-grid-item>    <van-image src="https://img.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow"  />  </van-grid-item>  <van-grid-item>    <van-image src="https://img.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow"  />  </van-grid-item>  <van-grid-item>    <van-image src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow"  />  </van-grid-item></van-grid>

    正方形格子

    设置 square 属性后,格子的高度会和宽度保持一致。

    <van-grid square>  <van-grid-item v-for="value in 8" :key="value" icon="photo-o" text="文字" /></van-grid>

    格子间距

    通过 gutter 属性设置格子之间的距离。

    <van-grid :gutter="10">  <van-grid-item v-for="value in 8" :key="value" icon="photo-o" text="文字" /></van-grid>

    内容横排

    将 direction 属性设置为 horizontal,可以让宫格的内容呈横向排列。

    <van-grid direction="horizontal" :column-num="3">  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" /></van-grid>

    页面导航

    通过 to 属性设置 vue-router 跳转链接,通过 url 属性设置 URL 跳转链接。

    <van-grid clickable :column-num="2">  <van-grid-item icon="home-o" text="路由跳转" to="/" />  <van-grid-item icon="search" text="URL 跳转" url="/vant/mobile.html" /></van-grid>

    徽标提示

    设置 dot 属性后,会在图标右上角展示一个小红点。设置 badge 属性后,会在图标右上角展示相应的徽标。

    <van-grid :column-num="2">  <van-grid-item icon="home-o" text="文字" dot />  <van-grid-item icon="search" text="文字" badge="99+" /></van-grid>

    API

    Grid Props

    参数说明类型默认值
    column-num列数number | string4
    icon-size图标大小,默认单位为pxnumber | string28px
    gutter格子之间的间距,默认单位为pxnumber | string0
    border是否显示边框booleantrue
    center是否将格子内容居中显示booleantrue
    square是否将格子固定为正方形booleanfalse
    clickable是否开启格子点击反馈booleanfalse
    direction格子内容排列的方向,可选值为 horizontalstringvertical

    GridItem Props

    参数说明类型默认值
    text文字string-
    icon图标名称或图片链接string-
    icon-prefix图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon
    icon-color图标颜色,等同于 Icon 组件的 color 属性string-
    reverse v3.1.0是否调换图标和文本的位置booleanfalse
    dot是否显示图标右上角小红点booleanfalse
    badge图标右上角徽标的内容number | string-
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse

    GridItem Events

    事件名说明回调参数
    click点击格子时触发event: MouseEvent

    GridItem Slots

    名称说明
    default自定义宫格的所有内容
    icon自定义图标
    text自定义文字

    样式变量

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

    名称默认值描述
    --van-grid-item-content-paddingvar(--van-padding-md) var(--van-padding-xs)-
    --van-grid-item-content-background-colorvar(--van-white)-
    --van-grid-item-content-active-colorvar(--van-active-color)-
    --van-grid-item-icon-size28px-
    --van-grid-item-text-colorvar(--van-gray-7)-
    --van-grid-item-text-font-sizevar(--van-font-size-sm)-


    介绍

    用于列表的索引分类显示和快速定位。

    实例演示

    引入

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

    import { createApp } from 'vue';import { IndexBar, IndexAnchor } from 'vant';const app = createApp();app.use(IndexBar);app.use(IndexAnchor);

    代码演示

    基础用法

    点击索引栏时,会自动跳转到对应的 IndexAnchor 锚点位置。

    <van-index-bar>  <van-index-anchor index="A" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-index-anchor index="B" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  ...</van-index-bar>

    自定义索引列表

    可以通过 index-list 属性自定义展示的索引字符列表。

    <van-index-bar :index-list="indexList">  <van-index-anchor index="1">标题1</van-index-anchor>  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-index-anchor index="2">标题2</van-index-anchor>  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  ...</van-index-bar>
    export default {  setup() {    return {      indexList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],    };  },};

    API

    IndexBar Props

    参数说明类型默认值
    index-list索引字符列表string[] | number[]A-Z
    z-indexz-index 层级number | string1
    sticky是否开启锚点自动吸顶booleantrue
    sticky-offset-top锚点自动吸顶时与顶部的距离number0
    highlight-color索引字符高亮颜色string#ee0a24
    teleport v3.0.19指定索引栏挂载的节点string | Element-

    IndexAnchor Props

    参数说明类型默认值
    index索引字符number | string-

    IndexBar Events

    事件名说明回调参数
    select点击索引栏的字符时触发index: number | string
    change当前高亮的索引字符变化时触发index: number | string

    IndexBar 方法

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

    方法名说明参数返回值
    scrollTo滚动到指定锚点index: number | string-

    IndexAnchor Slots

    名称说明
    default锚点位置显示内容,默认为索引字符

    样式变量

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

    名称默认值描述
    --van-index-bar-sidebar-z-index2-
    --van-index-bar-index-font-sizevar(--van-font-size-xs)-
    --van-index-bar-index-line-heightvar(--van-line-height-xs)-
    --van-index-bar-index-active-colorvar(--van-danger-color)-
    --van-index-anchor-z-index1-
    --van-index-anchor-padding0 var(--van-padding-md)-
    --van-index-anchor-text-colorvar(--van-text-color)-
    --van-index-anchor-font-weightvar(--van-font-weight-bold)-
    --van-index-anchor-font-sizevar(--van-font-size-md)-
    --van-index-anchor-line-height32px-
    --van-index-anchor-background-colortransparent-
    --van-index-anchor-sticky-text-colorvar(--van-danger-color)-
    --van-index-anchor-sticky-background-colorvar(--van-white)-


    介绍

    为页面提供导航功能,常用于页面顶部。

    实例演示

    引入

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

    import { createApp } from 'vue';import { NavBar } from 'vant';const app = createApp();app.use(NavBar);

    代码演示

    基础用法

    <van-nav-bar  title="标题"  left-text="返回"  right-text="按钮"  left-arrow  @click-left="onClickLeft"  @click-right="onClickRight"/>
    import { Toast } from 'vant';export default {  setup() {    const onClickLeft = () => Toast('返回');    const onClickRight = () => Toast('按钮');    return {      onClickLeft,      onClickRight,    };  },};

    使用插槽

    通过插槽自定义导航栏两侧的内容。

    <van-nav-bar title="标题" left-text="返回" left-arrow>  <template #right>    <van-icon name="search" size="18" />  </template></van-nav-bar>

    API

    Props

    参数说明类型默认值
    title标题string''
    left-text左侧文案string''
    right-text右侧文案string''
    left-arrow是否显示左侧箭头booleanfalse
    border是否显示下边框booleantrue
    fixed是否固定在顶部booleanfalse
    placeholder固定在顶部时,是否在标签位置生成一个等高的占位元素booleanfalse
    z-index导航栏 z-indexnumber | string1
    safe-area-inset-top是否开启顶部安全区适配booleanfalse

    Slots

    名称说明
    title自定义标题
    left自定义左侧区域内容
    right自定义右侧区域内容

    Events

    事件名说明回调参数
    click-left点击左侧按钮时触发event: MouseEvent
    click-right点击右侧按钮时触发event: MouseEvent

    样式变量

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

    名称默认值描述
    --van-nav-bar-height46px-
    --van-nav-bar-background-colorvar(--van-white)-
    --van-nav-bar-arrow-size16px-
    --van-nav-bar-icon-colorvar(--van-primary-color)-
    --van-nav-bar-text-colorvar(--van-primary-color)-
    --van-nav-bar-title-font-sizevar(--van-font-size-lg)-
    --van-nav-bar-title-text-colorvar(--van-text-color)-
    --van-nav-bar-z-index1-


    介绍

    数据量过多时,采用分页的形式将数据分隔,每次只加载一个页面。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Pagination } from 'vant';const app = createApp();app.use(Pagination);

    代码演示

    基础用法

    通过 v-model 来绑定当前页码。

    <van-pagination v-model="currentPage" :total-items="24" :items-per-page="5" />
    import { ref } from 'vue';export default {  setup() {    const currentPage = ref(1);    return { currentPage };  },};

    简单模式

    将 mode 设置为 simple 来切换到简单模式,此时分页器不会展示具体的页码按钮。

    <van-pagination v-model="currentPage" :page-count="12" mode="simple" />

    显示省略号

    设置 force-ellipses 后会展示省略号按钮,点击后可以快速跳转。

    <van-pagination  v-model="currentPage"  :total-items="125"  :show-page-size="3"  force-ellipses/>

    自定义按钮

    通过 prev-text、next-text 等插槽来自定义分页按钮的内容。

    <van-pagination v-model="currentPage" :total-items="50" :show-page-size="5">  <template #prev-text>    <van-icon name="arrow-left" />  </template>  <template #next-text>    <van-icon name="arrow" />  </template>  <template #page="{ text }">{{ text }}</template></van-pagination>

    API

    Props

    参数说明类型默认值
    v-model当前页码number-
    mode显示模式,可选值为 simplestringmulti
    prev-text上一页按钮文字string上一页
    next-text下一页按钮文字string下一页
    page-count总页数number | string根据页数计算
    total-items总记录数number | string0
    items-per-page每页记录数number | string10
    show-page-size显示的页码个数number | string5
    force-ellipses是否显示省略号booleanfalse

    Events

    事件名说明回调参数
    change页码改变时触发-

    Slots

    名称描述参数
    page自定义页码{ number: number, text: string, active: boolean }
    prev-text自定义上一页按钮文字-
    next-text自定义下一页按钮文字-

    样式变量

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

    名称默认值描述
    --van-pagination-height40px-
    --van-pagination-font-sizevar(--van-font-size-md)-
    --van-pagination-item-width36px-
    --van-pagination-item-default-colorvar(--van-primary-color)-
    --van-pagination-item-disabled-colorvar(--van-gray-7)-
    --van-pagination-item-disabled-background-colorvar(--van-background-color)-
    --van-pagination-background-colorvar(--van-white)-
    --van-pagination-desc-colorvar(--van-gray-7)-
    --van-pagination-disabled-opacityvar(--van-disabled-opacity)-


    介绍

    垂直展示的导航栏,用于在不同的内容区域之间进行切换。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Sidebar, SidebarItem } from 'vant';const app = createApp();app.use(Sidebar);app.use(SidebarItem);

    代码演示

    基础用法

    通过 v-model 绑定当前选中项的索引。

    <van-sidebar v-model="active">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" /></van-sidebar>
    import { ref } from 'vue';export default {  setup() {    const active = ref(0);    return { active };  },};

    徽标提示

    设置 dot 属性后,会在右上角展示一个小红点;设置 badge 属性后,会在右上角展示相应的徽标。

    <van-sidebar v-model="active">  <van-sidebar-item title="标签名称" dot />  <van-sidebar-item title="标签名称" badge="5" />  <van-sidebar-item title="标签名称" badge="20" /></van-sidebar>

    禁用选项

    通过 disabled 属性禁用选项。

    <van-sidebar v-model="active">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" disabled />  <van-sidebar-item title="标签名称" /></van-sidebar>

    监听切换事件

    设置 change 方法来监听切换导航项时的事件。

    <van-sidebar v-model="active" @change="onChange">  <van-sidebar-item title="标签名 1" />  <van-sidebar-item title="标签名 2" />  <van-sidebar-item title="标签名 3" /></van-sidebar>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const active = ref(0);    const onChange = (index) => Toast(`标签名 ${index + 1}`);    return {      active,      onChange,    };  },};

    API

    Sidebar Props

    参数说明类型默认值
    v-model当前导航项的索引number | string0

    Sidebar Events

    事件名说明回调参数
    change切换导航项时触发index: number

    SidebarItem Props

    参数说明类型默认值
    title内容string''
    dot是否显示右上角小红点booleanfalse
    badge图标右上角徽标的内容number | string-
    disabled是否禁用该项booleanfalse
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse

    SidebarItem Events

    事件名说明回调参数
    click点击时触发index: number

    SidebarItem Slots

    NameDescription
    title自定义标题

    样式变量

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

    名称默认值描述
    --van-sidebar-width80px-
    --van-sidebar-font-sizevar(--van-font-size-md)-
    --van-sidebar-line-heightvar(--van-line-height-md)-
    --van-sidebar-text-colorvar(--van-text-color)-
    --van-sidebar-disabled-text-colorvar(--van-gray-5)-
    --van-sidebar-padding20px var(--van-padding-sm)-
    --van-sidebar-active-colorvar(--van-active-color)-
    --van-sidebar-background-colorvar(--van-background-color)-
    --van-sidebar-selected-font-weightvar(--van-font-weight-bold)-
    --van-sidebar-selected-text-colorvar(--van-text-color)-
    --van-sidebar-selected-border-width4px-
    --van-sidebar-selected-border-height16px-
    --van-sidebar-selected-border-colorvar(--van-danger-color)-
    --van-sidebar-selected-background-colorvar(--van-white)-


    介绍

    选项卡组件,用于在不同的内容区域之间进行切换。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Tab, Tabs } from 'vant';const app = createApp();app.use(Tab);app.use(Tabs);

    代码演示

    基础用法

    通过 v-model:active 绑定当前激活标签对应的索引值,默认情况下启用第一个标签。

    <van-tabs v-model:active="active">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab>  <van-tab title="标签 4">内容 4</van-tab></van-tabs>
    import { ref } from 'vue';export default {  setup() {    const active = ref(2);    return { active };  },};

    通过名称匹配

    在标签指定 name 属性的情况下,v-model:active 的值为当前标签的 name(此时无法通过索引值来匹配标签)。

    <van-tabs v-model:active="activeName">  <van-tab title="标签 1" name="a">内容 1</van-tab>  <van-tab title="标签 2" name="b">内容 2</van-tab>  <van-tab title="标签 3" name="c">内容 3</van-tab></van-tabs>
    import { ref } from 'vue';export default {  setup() {    const activeName = ref('a');    return { activeName };  },};

    标签栏滚动

    标签数量超过 5 个时,标签栏可以在水平方向上滚动,切换时会自动将当前标签居中。

    <van-tabs v-model:active="active">  <van-tab v-for="index in 8" :title="'标签 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

    禁用标签

    设置 disabled 属性即可禁用标签。

    <van-tabs v-model:active="active">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2" disabled>内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab></van-tabs>

    样式风格

    Tab 支持两种样式风格:line 和card,默认为 line 样式,可以通过 type 属性切换样式风格。

    <van-tabs v-model:active="active" type="card">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab></van-tabs>

    点击事件

    点击标签页时,会触发 click-tab 事件。

    <van-tabs v-model:active="active" @click-tab="onClickTab">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab></van-tabs>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const active = ref(0);    const onClickTab = ({ title }) => Toast(title);    return {      active,      onClickTab,    };  },};

    粘性布局

    通过 sticky 属性可以开启粘性布局,粘性布局下,标签页滚动到顶部时会自动吸顶。

    <van-tabs v-model:active="active" sticky>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

    自定义标签

    通过 title 插槽可以自定义标签内容。

    <van-tabs v-model:active="active">  <van-tab v-for="index in 2">    <template #title> <van-icon name="more-o" />选项 </template>    内容 {{ index }}  </van-tab></van-tabs>

    切换动画

    通过 animated 属性可以开启切换标签内容时的转场动画。

    <van-tabs v-model:active="active" animated>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

    滑动切换

    通过 swipeable 属性可以开启滑动切换标签页。

    <van-tabs v-model:active="active" swipeable>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

    滚动导航

    通过 scrollspy 属性可以开启滚动导航模式,该模式下,内容将会平铺展示。

    <van-tabs v-model:active="active" scrollspy sticky>  <van-tab v-for="index in 8" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

    异步切换

    通过 before-change 属性可以在切换标签前执行特定的逻辑。

    <van-tabs v-model:active="active" :before-change="beforeChange">  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>
    import { ref } from 'vue';export default {  setup() {    const active = ref(0);    const beforeChange = (index) => {      // 返回 false 表示阻止此次切换      if (index === 1) {        return false;      }      // 返回 Promise 来执行异步逻辑      return new Promise((resolve) => {        // 在 resolve 函数中返回 true 或 false        resolve(index !== 3);      });    };    return {      beforeChange,    };  },};
    Tips: 通过手势滑动不会触发 before-change 属性。

    API

    Tabs Props

    参数说明类型默认值
    v-model:active绑定当前选中标签的标识符number | string0
    type样式风格类型,可选值为 cardstringline
    color标签主题色string#ee0a24
    background标签栏背景色stringwhite
    duration动画时间,单位秒,设置为 0 可以禁用动画number | string0.3
    line-width底部条宽度,默认单位 pxnumber | string40px
    line-height底部条高度,默认单位 pxnumber | string3px
    animated是否开启切换标签内容时的转场动画booleanfalse
    border是否显示标签栏外边框,仅在 type="line" 时有效booleanfalse
    ellipsis是否省略过长的标题文字booleantrue
    sticky是否使用粘性定位布局booleanfalse
    swipeable是否开启手势左右滑动切换booleanfalse
    lazy-render是否开启延迟渲染(首次切换到标签时才触发内容渲染)booleantrue
    scrollspy是否开启滚动导航booleanfalse
    offset-top粘性定位布局下与顶部的最小距离,支持 px vw vh rem 单位,默认 pxnumber | string0
    swipe-threshold滚动阈值,标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动number | string5
    title-active-color标题选中态颜色string-
    title-inactive-color标题默认态颜色string-
    before-change切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise(name: number | string) => boolean | Promise<boolean>-

    Tab Props

    参数说明类型默认值
    title标题string-
    disabled是否禁用标签booleanfalse
    dot是否在标题右上角显示小红点booleanfalse
    badge图标右上角徽标的内容number | string-
    name标签名称,作为匹配的标识符number | string标签的索引值
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse
    title-style自定义标题样式string | Array | object-
    title-class自定义标题类名string | Array | object-

    Tabs Events

    事件名说明回调参数
    click-tab v3.1.4点击标签时触发{ name: string | number, title: string, event: MouseEvent, disabled: boolean }
    change当前激活的标签改变时触发name: string | number, title: string
    rendered标签内容首次渲染时触发(仅在开启延迟渲染后触发)name: string | number, title: string
    scroll滚动时触发,仅在 sticky 模式下生效{ scrollTop: number, isFixed: boolean }
    提示:click 和 disabled 事件已废弃,请使用 click-tab 事件代替。

    Tabs 方法

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

    方法名说明参数返回值
    resize外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘--
    scrollTo滚动到指定的标签页,在滚动导航模式下可用name: string | number-

    类型定义

    通过 TabsInstance 获取 Tabs 实例的类型定义。

    import { ref } from 'vue';import type { TabsInstance } from 'vant';const tabsRef = ref<TabsInstance>();tabsRef.value?.scrollTo(0);

    Tabs Slots

    名称说明
    nav-left标签栏左侧内容
    nav-right标签栏右侧内容
    nav-bottom v3.1.1标签栏下方内容

    Tab Slots

    名称说明
    default标签页内容
    title自定义标题

    样式变量

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

    名称默认值描述
    --van-tab-text-colorvar(--van-gray-7)-
    --van-tab-active-text-colorvar(--van-text-color)-
    --van-tab-disabled-text-colorvar(--van-gray-5)-
    --van-tab-font-sizevar(--van-font-size-md)-
    --van-tab-line-heightvar(--van-line-height-md)-
    --van-tabs-default-colorvar(--van-danger-color)-
    --van-tabs-line-height44px-
    --van-tabs-card-height30px-
    --van-tabs-nav-background-colorvar(--van-white)-
    --van-tabs-bottom-bar-width40px-
    --van-tabs-bottom-bar-height3px-
    --van-tabs-bottom-bar-colorvar(--van-danger-color)-

    常见问题

    组件从隐藏状态切换到显示状态时,底部条位置错误?

    Tabs 组件在挂载时,会获取自身的宽度,并计算出底部条的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示底部条位置。

    解决方法

    方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

    <!-- Before --><van-tabs v-show="show" /><!-- After --><van-tabs v-if="show" />

    方法二,调用组件的 resize 方法来主动触发重绘:

    <van-tabs v-show="show" ref="tabs" />
    this.$refs.tabs.resize();


    介绍

    底部导航栏,用于在不同页面之间进行切换。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Tabbar, TabbarItem } from 'vant';const app = createApp();app.use(Tabbar);app.use(TabbarItem);

    代码演示

    基础用法

    v-model 默认绑定选中标签的索引值,通过修改 v-model 即可切换选中的标签。

    <van-tabbar v-model="active">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="friends-o">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
    import { ref } from 'vue';export default {  setup() {    const active = ref(0);    return { active };  },};

    通过名称匹配

    在标签指定 name 属性的情况下,v-model 的值为当前标签的 name。

    <van-tabbar v-model="active">  <van-tabbar-item name="home" icon="home-o">标签</van-tabbar-item>  <van-tabbar-item name="search" icon="search">标签</van-tabbar-item>  <van-tabbar-item name="friends" icon="friends-o">标签</van-tabbar-item>  <van-tabbar-item name="setting" icon="setting-o">标签</van-tabbar-item></van-tabbar>
    import { ref } from 'vue';export default {  setup() {    const active = ref('home');    return { active };  },};

    徽标提示

    设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

    <van-tabbar v-model="active">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search" dot>标签</van-tabbar-item>  <van-tabbar-item icon="friends-o" badge="5">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o" badge="20">标签</van-tabbar-item></van-tabbar>

    自定义图标

    通过 icon 插槽自定义图标,可以通过 slot-scope 判断标签是否选中。

    <van-tabbar v-model="active">  <van-tabbar-item badge="3">    <span>自定义</span>    <template #icon="props">      <img :src="props.active ? icon.active : icon.inactive" />    </template>  </van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
    import { ref } from 'vue';export default {  setup() {    const active = ref(0);    const icon = {      active: 'https://img.yzcdn.cn/vant/user-active.png',      inactive: 'https://img.yzcdn.cn/vant/user-inactive.png',    };    return {      icon,      active,    };  },};

    自定义颜色

    通过 active-color 属性设置选中标签的颜色,通过 inactive-color 属性设置未选中标签的颜色。

    <van-tabbar v-model="active" active-color="#ee0a24" inactive-color="#000">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="friends-o">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>

    监听切换事件

    通过 change 事件来监听选中标签的变化。

    <van-tabbar v-model="active" @change="onChange">  <van-tabbar-item icon="home-o">标签 1</van-tabbar-item>  <van-tabbar-item icon="search">标签 2</van-tabbar-item>  <van-tabbar-item icon="friends-o">标签 3</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签 4</van-tabbar-item></van-tabbar>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const active = ref(0);    const onChange = (index) => Toast(`标签 ${index}`);    return {      icon,      onChange,    };  },};

    路由模式

    标签栏支持路由模式,用于搭配 vue-router 使用。路由模式下会匹配页面路径和标签的 to 属性,并自动选中对应的标签。

    <router-view /><van-tabbar route>  <van-tabbar-item replace to="/home" icon="home-o">标签</van-tabbar-item>  <van-tabbar-item replace to="/search" icon="search">标签</van-tabbar-item></van-tabbar>

    API

    Tabbar Props

    参数说明类型默认值
    v-model当前选中标签的名称或索引值number | string0
    fixed是否固定在底部booleantrue
    border是否显示外边框booleantrue
    z-index元素 z-indexnumber | string1
    active-color选中标签的颜色string#1989fa
    inactive-color未选中标签的颜色string#7d7e80
    route是否开启路由模式booleanfalse
    placeholder固定在底部时,是否在标签位置生成一个等高的占位元素booleanfalse
    safe-area-inset-bottom是否开启底部安全区适配,设置 fixed 时默认开启booleanfalse
    before-change切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise(name: number | string) => boolean | Promise<boolean>-

    Tabbar Events

    事件名说明回调参数
    change切换标签时触发active: number | string

    TabbarItem Props

    参数说明类型默认值
    name标签名称,作为匹配的标识符number | string当前标签的索引值
    icon图标名称或图片链接string-
    icon-prefix图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon
    dot是否显示图标右上角小红点booleanfalse
    badge图标右上角徽标的内容number | string-
    url点击后跳转的链接地址string-
    to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
    replace是否在跳转时替换当前页面历史booleanfalse

    TabbarItem Slots

    名称说明参数
    icon自定义图标active: boolean

    样式变量

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

    名称默认值描述
    --van-tabbar-height50px-
    --van-tabbar-z-index1-
    --van-tabbar-background-colorvar(--van-white)-
    --van-tabbar-item-font-sizevar(--van-font-size-sm)-
    --van-tabbar-item-text-colorvar(--van-gray-7)-
    --van-tabbar-item-active-colorvar(--van-primary-color)-
    --van-tabbar-item-active-background-colorvar(--van-white)-
    --van-tabbar-item-line-height1-
    --van-tabbar-item-icon-size22px-
    --van-tabbar-item-icon-margin-bottomvar(--van-padding-base)-


    介绍

    用于从一组相关联的数据集合中进行选择。

    实例演示

    引入

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

    import { createApp } from 'vue';import { TreeSelect } from 'vant';const app = createApp();app.use(TreeSelect);

    代码演示

    单选模式

    item 为分类显示所需的数据,数据格式见下方示例。main-active-index 表示左侧高亮选项的索引,active-id 表示右侧高亮选项的 id。

    <van-tree-select  v-model:active-id="state.activeId"  v-model:main-active-index="state.activeIndex"  :items="items"/>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      activeId: 1,      activeIndex: 0,    });    const items = [      {        text: '浙江',        children: [          { text: '杭州', id: 1 },          { text: '温州', id: 2 },        ],      },      {        text: '江苏',        children: [          { text: '南京', id: 5 },          { text: '无锡', id: 6 },        ],      },    ];    return {      state,      items,    };  },};

    多选模式

    active-id 为数组格式时,可以选中多个右侧选项。

    <van-tree-select  v-model:active-id="state.activeIds"  v-model:main-active-index="state.activeIndex"  :items="items"/>
    import { reactive } from 'vue';export default {  setup() {    const state = reactive({      activeId: [1, 2],      activeIndex: 0,    });    const items = [      {        text: '浙江',        children: [          { text: '杭州', id: 1 },          { text: '温州', id: 2 },        ],      },      {        text: '江苏',        children: [          { text: '南京', id: 5 },          { text: '无锡', id: 6 },        ],      },    ];    return {      state,      items,    };  },};

    自定义内容

    通过 content 插槽可以自定义右侧区域的内容。

    <van-tree-select  v-model:main-active-index="activeIndex"  height="55vw"  :items="items">  <template #content>    <van-image      v-if="activeIndex === 0"      src="https://img.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow"     />    <van-image      v-if="activeIndex === 1"      src="https://img.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow"     />  </template></van-tree-select>
    import { ref } from 'vue';export default {  setup() {    const activeIndex = ref(0);    return {      activeIndex,      items: [{ text: '分组 1' }, { text: '分组 2' }],    };  },};

    徽标提示

    设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

    <van-tree-select  v-model:main-active-index="activeIndex"  height="55vw"  :items="items"/>
    import { ref } from 'vue';export default {  setup() {    const activeIndex = ref(0);    return {      activeIndex,      items: [        { text: '浙江', children: [], dot: true },        { text: '江苏', children: [], badge: 5 },      ],    };  },};

    API

    Props

    参数说明类型默认值
    items分类显示所需的数据Item[][]
    height高度,默认单位为pxnumber | string300
    main-active-index左侧选中项的索引number | string0
    active-id右侧选中项的 id,支持传入数组number | string |
    (number | string)[]
    0
    max右侧项最大选中个数number | stringInfinity
    selected-icon自定义右侧栏选中状态的图标stringsuccess

    Events

    事件名说明回调参数
    click-nav点击左侧导航时触发index:被点击的导航的索引
    click-item点击右侧选择项时触发data: 该点击项的数据

    Slots

    名称说明
    content自定义右侧区域内容

    Item 数据结构

    items 整体为一个数组,数组内包含一系列描述分类的对象,每个分类里,text表示当前分类的名称,children表示分类里的可选项。

    [  {    // 导航名称    text: '所有城市',    // 导航名称右上角徽标    badge: 3,    // 是否在导航名称右上角显示小红点    dot: true,    // 导航节点额外类名    className: 'my-class',    // 该导航下所有的可选项    children: [      {        // 名称        text: '温州',        // id,作为匹配选中状态的标识符        id: 1,        // 禁用选项        disabled: true,      },      {        text: '杭州',        id: 2,      },    ],  },];

    样式变量

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

    名称默认值描述
    --van-tree-select-font-sizevar(--van-font-size-md)-
    --van-tree-select-nav-background-colorvar(--van-background-color)-
    --van-tree-select-content-background-colorvar(--van-white)-
    --van-tree-select-nav-item-padding14px var(--van-padding-sm)-
    --van-tree-select-item-height48px-
    --van-tree-select-item-active-colorvar(--van-danger-color)-
    --van-tree-select-item-disabled-colorvar(--van-gray-5)-
    --van-tree-select-item-selected-size16px-


    介绍

    收货地址编辑组件,用于新建、更新、删除收货地址。

    实例演示

    引入

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

    import { createApp } from 'vue';import { AddressEdit } from 'vant';const app = createApp();app.use(AddressEdit);

    代码演示

    基础用法

    <van-address-edit  :area-list="areaList"  show-postal  show-delete  show-set-default  show-search-result  :search-result="searchResult"  :area-columns-placeholder="['请选择', '请选择', '请选择']"  @save="onSave"  @delete="onDelete"  @change-detail="onChangeDetail"/>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const searchResult = ref([]);    const onSave = () => Toast('save');    const onDelete = () => Toast('delete');    const onChangeDetail = (val) => {      if (val) {        searchResult.value = [          {            name: '黄龙万科中心',            address: '杭州市西湖区',          },        ];      } else {        searchResult.value = [];      }    };    return {      onSave,      onDelete,      areaList,      searchResult,      onChangeDetail,    };  },};

    API

    Props

    参数说明类型默认值
    area-list地区列表object-
    area-columns-placeholder地区选择列占位提示文字string[][]
    area-placeholder地区输入框占位提示文字string选择省 / 市 / 区
    address-info收货人信息初始值AddressInfo{}
    search-result详细地址搜索结果SearchResult[][]
    show-postal是否显示邮政编码booleanfalse
    show-delete是否显示删除按钮booleanfalse
    show-set-default是否显示默认地址栏booleanfalse
    show-search-result是否显示搜索结果booleanfalse
    show-area是否显示地区booleantrue
    show-detail是否显示详细地址booleantrue
    disable-area是否禁用地区选择booleanfalse
    save-button-text保存按钮文字string保存
    delete-button-text删除按钮文字string删除
    detail-rows详细地址输入框行数number | string1
    detail-maxlength详细地址最大长度number | string200
    is-saving是否显示保存按钮加载动画booleanfalse
    is-deleting是否显示删除按钮加载动画booleanfalse
    tel-validator手机号格式校验函数string => boolean-
    tel-maxlength手机号最大长度number | string-
    postal-validator邮政编码格式校验函数string => boolean-
    validator自定义校验函数(key, val) => string-

    Events

    事件名说明回调参数
    save点击保存按钮时触发content:表单内容
    focus输入框聚焦时触发key: 聚焦的输入框对应的 key
    delete确认删除地址时触发content:表单内容
    cancel-delete取消删除地址时触发content:表单内容
    select-search选中搜索结果时触发value: 搜索结果
    click-area点击收件地区时触发-
    change-area修改收件地区时触发values: 地区信息
    change-detail修改详细地址时触发value: 详细地址内容
    change-default切换是否使用默认地址时触发value: 是否选中

    Slots

    名称说明
    default在邮政编码下方插入内容

    方法

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

    方法名说明参数返回值
    setAddressDetail设置详细地址addressDetail: string-

    类型定义

    通过 AddressEditInstance 获取 AddressEdit 实例的类型定义。

    import { ref } from 'vue';import type { AddressEditInstance } from 'vant';const addressEditRef = ref<AddressEditInstance>();addressEditRef.value?.setAddressDetail('');

    AddressInfo 数据格式

    注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取。

    key说明类型
    name收货人姓名string
    tel收货人手机号string
    province省份string
    city城市string
    county区县string
    addressDetail详细地址string
    areaCode地区编码,通过 省市区选择 获取(必填)string
    postalCode邮政编码string
    isDefault是否为默认地址boolean

    SearchResult 数据格式

    key说明类型
    name地名string
    address详细地址string

    省市县列表数据格式

    请参考 Area 组件。

    样式变量

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

    名称默认值描述
    --van-address-edit-paddingvar(--van-padding-sm)-
    --van-address-edit-buttons-paddingvar(--van-padding-xl) var(--van-padding-base)-
    --van-address-edit-button-margin-bottomvar(--van-padding-sm)-
    --van-address-edit-button-font-sizevar(--van-font-size-lg)-
    --van-address-edit-detail-finish-colorvar(--van-primary-color)-
    --van-address-edit-detail-finish-font-sizevar(--van-font-size-sm)-


    介绍

    展示收货地址列表。

    实例演示

    引入

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

    import { createApp } from 'vue';import { AddressList } from 'vant';const app = createApp();app.use(AddressList);

    代码演示

    基础用法

    <van-address-list  v-model="chosenAddressId"  :list="list"  :disabled-list="disabledList"  disabled-text="以下地址超出配送范围"  default-tag-text="默认"  @add="onAdd"  @edit="onEdit"/>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const chosenAddressId = ref('1');    const list = [      {        id: '1',        name: '张三',        tel: '13000000000',        address: '浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室',        isDefault: true,      },      {        id: '2',        name: '李四',        tel: '1310000000',        address: '浙江省杭州市拱墅区莫干山路 50 号',      },    ];    const disabledList = [      {        id: '3',        name: '王五',        tel: '1320000000',        address: '浙江省杭州市滨江区江南大道 15 号',      },    ];    const onAdd = () => Toast('新增地址');    const onEdit = (item, index) => Toast('编辑地址:' + index);    return {      list,      onAdd,      onEdit,      disabledList,      chosenAddressId,    };  },};

    API

    Props

    参数说明类型默认值
    v-model当前选中地址的 idstring-
    list地址列表Address[][]
    disabled-list不可配送地址列表Address[][]
    disabled-text不可配送提示文案string-
    switchable是否允许切换地址booleantrue
    add-button-text底部按钮文字string新增地址
    default-tag-text默认地址标签文字string-

    Events

    事件名说明回调参数
    add点击新增按钮时触发-
    edit点击编辑按钮时触发item: Address, index: number
    select切换选中的地址时触发item: Address, index: number
    edit-disabled编辑不可配送的地址时触发item: Address, index: number
    select-disabled选中不可配送的地址时触发item: Address, index: number
    click-item点击任意地址时触发item: Address, index: number

    Address 数据结构

    键名说明类型
    id每条地址的唯一标识number | string
    name收货人姓名string
    tel收货人手机号number | string
    address收货地址string
    isDefault是否为默认地址boolean

    Slots

    名称说明参数
    default在列表下方插入内容-
    top在顶部插入内容-
    item-bottom在列表项底部插入内容item: Address
    tag v3.0.9自定义列表项标签内容item: Address

    样式变量

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

    名称默认值描述
    --van-address-list-paddingvar(--van-padding-sm) var(--van-padding-sm) 80px-
    --van-address-list-disabled-text-colorvar(--van-gray-6)-
    --van-address-list-disabled-text-paddingvar(--van-padding-base) * 5 0 var(--van-padding-md)-
    --van-address-list-disabled-text-font-sizevar(--van-font-size-md)-
    --van-address-list-disabled-text-line-heightvar(--van-line-height-md)-
    --van-address-list-add-button-z-index999-
    --van-address-list-item-paddingvar(--van-padding-sm)-
    --van-address-list-item-text-colorvar(--van-text-color)-
    --van-address-list-item-disabled-text-colorvar(--van-gray-5)-
    --van-address-list-item-font-size13px-
    --van-address-list-item-line-heightvar(--van-line-height-sm)-
    --van-address-list-item-radio-icon-colorvar(--van-danger-color)-
    --van-address-list-edit-icon-size20px-


    介绍

    省市区三级联动选择,通常与弹出层组件配合使用。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Area } from 'vant';const app = createApp();app.use(Area);

    代码演示

    基础用法

    初始化省市区组件时,需要通过 area-list 属性传入省市区数据。

    <van-area title="标题" :area-list="areaList" />

    areaList 格式

    areaList 为对象结构,包含 province_list、city_list、county_list 三个 key。

    每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。比如北京的地区码为 11,以 0 补足 6 位,为 110000。

    示例数据如下:

    const areaList = {  province_list: {    110000: '北京市',    120000: '天津市',  },  city_list: {    110100: '北京市',    120100: '天津市',  },  county_list: {    110101: '东城区',    110102: '西城区',    // ....  },};

    @vant/area-data

    Vant 官方提供了一份默认的省市区数据,可以通过 @vant/area-data 引入:

    yarn add @vant/area-data
    import { areaList } from '@vant/area-data';export default {  setup() {    return { areaList };  },};

    选中省市区

    如果想选中某个省市区,需要传入一个 value 属性,绑定对应的地区码。

    <van-area title="标题" :area-list="areaList" value="110101" />

    配置显示列

    可以通过 columns-num 属性配置省市区显示的列数,默认情况下会显示省市区,当你设置为 2,则只会显示省市选择。

    <van-area title="标题" :area-list="areaList" :columns-num="2" />

    配置列占位提示文字

    可以通过 columns-placeholder 属性配置每一列的占位提示文字。

    <van-area  title="标题"  :area-list="areaList"  :columns-placeholder="['请选择', '请选择', '请选择']"/>

    API

    Props

    参数说明类型默认值
    value当前选中项对应的地区码string-
    title顶部栏标题string-
    confirm-button-text确认按钮文字string确认
    cancel-button-text取消按钮文字string取消
    area-list省市区数据,格式见下方object-
    columns-placeholder列占位提示文字string[][]
    loading是否显示加载状态booleanfalse
    readonly是否为只读状态,只读状态下无法切换选项booleanfalse
    item-height选项高度,支持 px vw vh rem 单位,默认 pxnumber | string44
    columns-num显示列数,3-省市区,2-省市,1-省number | string3
    visible-item-count可见的选项个数number | string6
    swipe-duration快速滑动时惯性滚动的时长,单位 msnumber | string1000
    is-oversea-code根据地区码校验海外地址,海外地址会划分至单独的分类() => boolean-

    Events

    事件说明回调参数
    confirm点击右上方完成按钮result: ConfirmResult
    cancel点击取消按钮时-
    change选项改变时触发所有列选中值,当前列对应的索引

    ConfirmResult 格式

    confirm 事件返回的数据整体为一个数组,数组每一项对应一列选项中被选中的数据。

    [  {    code: '110000',    name: '北京市',  },  {    code: '110100',    name: '北京市',  },  {    code: '110101',    name: '东城区',  },];

    Slots

    名称说明参数
    toolbar v3.1.2自定义整个顶部栏的内容-
    title自定义标题内容-
    confirm v3.1.2自定义确认按钮内容-
    cancel v3.1.2自定义取消按钮内容-
    columns-top自定义选项上方内容-
    columns-bottom自定义选项下方内容-

    方法

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

    方法名说明参数返回值
    reset根据地区码重置所有选项,若不传地区码,则重置到第一项code?: string-

    类型定义

    通过 AreaInstance 获取 Area 实例的类型定义。

    import { ref } from 'vue';import type { AreaInstance } from 'vant';const areaRef = ref<AreaInstance>();areaRef.value?.reset();

    常见问题

    在桌面端无法操作组件?

    参见桌面端适配


    介绍

    商品卡片,用于展示商品的图片、价格等信息。

    实例演示

    引入

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

    import { createApp } from 'vue';import { Card } from 'vant';const app = createApp();app.use(Card);

    代码演示

    基础用法

    <van-card  num="2"  price="2.00"  desc="描述信息"  title="商品标题"  thumb="https://img.yzcdn.cn/vant/ipad.jpeg"/>

    营销信息

    通过 origin-price 设置商品原价,通过 tag 设置商品左上角标签。

    <van-card  num="2"  tag="标签"  price="2.00"  desc="描述信息"  title="商品标题"  thumb="https://img.yzcdn.cn/vant/ipad.jpeg"  origin-price="10.00"/>

    自定义内容

    Card 组件提供了多个插槽,可以灵活地自定义内容。

    <van-card  num="2"  price="2.00"  desc="描述信息"  title="商品标题"  thumb="https://img.yzcdn.cn/vant/ipad.jpeg">  <template #tags>    <van-tag plain type="danger">标签</van-tag>    <van-tag plain type="danger">标签</van-tag>  </template>  <template #footer>    <van-button size="mini">按钮</van-button>    <van-button size="mini">按钮</van-button>  </template></van-card>

    API

    Props

    参数说明类型默认值
    thumb左侧图片 URLstring-
    title标题string-
    desc描述string-
    tag图片角标string-
    num商品数量number | string-
    price商品价格number | string-
    origin-price商品划线原价number | string-
    centered内容是否垂直居中booleanfalse
    currency货币符号string¥
    thumb-link点击左侧图片后跳转的链接地址string-
    lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse

    Events

    事件名说明回调参数
    click点击时触发event: MouseEvent
    click-thumb点击自定义图片时触发event: MouseEvent

    Slots

    名称说明
    title自定义标题
    desc自定义描述
    num自定义数量
    price自定义价格
    origin-price自定义商品原价
    price-top自定义价格上方区域
    bottom自定义价格下方区域
    thumb自定义图片
    tag自定义图片角标
    tags自定义描述下方标签区域
    footer自定义右下角内容

    样式变量

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

    名称默认值描述
    --van-card-paddingvar(--van-padding-xs) var(--van-padding-md)-
    --van-card-font-sizevar(--van-font-size-sm)-
    --van-card-text-colorvar(--van-text-color)-
    --van-card-background-colorvar(--van-background-color-light)-
    --van-card-thumb-size88px-
    --van-card-thumb-border-radiusvar(--van-border-radius-lg)-
    --van-card-title-line-height16px-
    --van-card-desc-colorvar(--van-gray-7)-
    --van-card-desc-line-heightvar(--van-line-height-md)-
    --van-card-price-colorvar(--van-gray-8)-
    --van-card-origin-price-colorvar(--van-gray-6)-
    --van-card-num-colorvar(--van-gray-6)-
    --van-card-origin-price-font-sizevar(--van-font-size-xs)-
    --van-card-price-font-sizevar(--van-font-size-sm)-
    --van-card-price-integer-font-sizevar(--van-font-size-lg)-
    --van-card-price-font-familyvar(--van-price-integer-font-family)-


    介绍

    以卡片的形式展示联系人信息。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ContactCard } from 'vant';const app = createApp();app.use(ContactCard);

    代码演示

    添加联系人

    <van-contact-card type="add" @click="onAdd" />
    import { Toast } from 'vant';export default {  setup() {    const onAdd = () => Toast('新增');    return {      onAdd,    };  },};

    编辑联系人

    <van-contact-card  type="edit"  :name="currentContact.name"  :tel="currentContact.tel"  @click="onEdit"/>
    import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const currentContact = reactive({      name: '张三',      tel: '13000000000',    });    const onEdit = () => Toast('edit');    return {      onEdit,      currentContact,    };  },};

    不可编辑

    <van-contact-card type="edit" name="张三" tel="13000000000" :editable="false" />

    API

    Props

    参数说明类型默认值
    type卡片类型,可选值为 editstringadd
    name联系人姓名string-
    tel联系人手机号string-
    add-text添加时的文案提示string添加联系人

    Events

    事件名说明回调参数
    click点击时触发event: MouseEvent

    样式变量

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

    名称默认值描述
    --van-contact-card-paddingvar(--van-padding-md)-
    --van-contact-card-add-icon-size40px-
    --van-contact-card-add-icon-colorvar(--van-primary-color)-
    --van-contact-card-value-line-heightvar(--van-line-height-md)-


    介绍

    编辑并保存联系人信息。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ContactEdit } from 'vant';const app = createApp();app.use(ContactEdit);

    代码演示

    基础用法

    <van-contact-edit  is-edit  show-set-default  :contact-info="editingContact"  set-default-label="设为默认联系人"  @save="onSave"  @delete="onDelete"/>
    import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const editingContact = ref({});    const onSave = (contactInfo) => Toast('保存');    const onDelete = (contactInfo) => Toast('删除');    return {      onSave,      onDelete,      editingContact,    };  },};

    API

    Props

    参数说明类型默认值
    contact-info联系人信息Contact{}
    is-edit是否为编辑联系人booleanfalse
    is-saving是否显示保存按钮加载动画booleanfalse
    is-deleting是否显示删除按钮加载动画booleanfalse
    tel-validator手机号格式校验函数(tel: string) => boolean-
    show-set-default是否显示默认联系人栏booleanfalse
    set-default-label默认联系人栏文案string-

    Events

    事件名说明回调参数
    save点击保存按钮时触发content:表单内容
    delete点击删除按钮时触发content:表单内容

    Contact 数据结构

    键名说明类型
    name联系人姓名string
    tel联系人手机号number | string

    样式变量

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

    名称默认值描述
    --van-contact-edit-paddingvar(--van-padding-md)-
    --van-contact-edit-fields-radiusvar(--van-border-radius-md)-
    --van-contact-edit-buttons-paddingvar(--van-padding-xl) 0-
    --van-contact-edit-button-margin-bottomvar(--van-padding-sm)-
    --van-contact-edit-button-font-sizevar(--van-font-size-lg)-
    --van-contact-edit-field-label-width4.1em-


    介绍

    展示联系人列表。

    实例演示

    引入

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

    import { createApp } from 'vue';import { ContactList } from 'vant';const app = createApp();app.use(ContactList);

    代码演示

    基础用法

    <van-contact-list  v-model="state.chosenContactId"  :list="state.list"  default-tag-text="默认"  @add="onAdd"  @edit="onEdit"  @select="onSelect"/>
    import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const state = reactive({      chosenContactId: '1',      list: [        {          id: '1',          name: '张三',          tel: '13000000000',          isDefault: true,        },        {          id: '2',          name: '李四',          tel: '1310000000',        },      ],    });    const onAdd = () => Toast('新增');    const onEdit = (contact) => Toast('编辑' + contact.id);    const onSelect = (contact) => Toast('选择' + contact.id);    return {      state,      onAdd,      onEdit,      onSelect,    };  },};

    API

    Props

    参数说明类型默认值
    v-model当前选中联系人的 idnumber | string-
    list联系人列表Contact[][]
    add-text新建按钮文案string新建联系人
    default-tag-text默认联系人标签文案string-

    Events

    事件名说明回调参数
    add点击新增按钮时触发-
    edit点击编辑按钮时触发contact: Contact,index: number
    select切换选中的联系人时触发contact: Contact,index: number

    Contact 数据结构

    键名说明类型
    id每位联系人的唯一标识number | string
    name联系人姓名string
    tel联系人手机号number | string
    isDefault是否为默认联系人boolean

    样式变量

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

    名称默认值描述
    --van-contact-list-edit-icon-size16px-
    --van-contact-list-add-button-z-index999-
    --van-contact-list-item-paddingvar(--van-padding-md)-
    --van-contact-list-item-radio-icon-colorvar(--van-danger-color)-


    介绍

    用于优惠券的兑换和选择。

    实例演示

    引入

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

    import { createApp } from 'vue';import { CouponCell, CouponList } from 'vant';const app = createApp();app.use(CouponCell);app.use(CouponList);

    代码演示

    基础用法

    <!-- 优惠券单元格 --><van-coupon-cell  :coupons="state.coupons"  :chosen-coupon="state.chosenCoupon"  @click="state.showList = true"/><!-- 优惠券列表 --><van-popup  v-model="state.showList"  round  position="bottom"  style="height: 90%; padding-top: 4px;">  <van-coupon-list    :coupons="state.coupons"    :chosen-coupon="state.chosenCoupon"    :disabled-coupons="disabledCoupons"    @change="onChange"    @exchange="onExchange"  /></van-popup>
    import { reactive } from 'vue';const coupon = {  available: 1,  condition: '无使用门槛
    最多优惠12元',  reason: '',  value: 150,  name: '优惠券名称',  startAt: 1489104000,  endAt: 1514592000,  valueDesc: '1.5',  unitDesc: '元',};export default {  setup() {    const state = reactive({      coupons: [coupon],      showList: false,      chosenCoupon: -1,    });    const onChange = (index) => {      state.showList = false;      state.chosenCoupon = index;    };    const onExchange = (code) => {      state.coupons.push(coupon);    };    return {      state,      onChange,      onExchange,      disabledCoupons: [coupon],    };  },};

    API

    CouponCell Props

    参数说明类型默认值
    title单元格标题string优惠券
    chosen-coupon当前选中优惠券的索引number | string-1
    coupons可用优惠券列表Coupon[][]
    editable能否切换优惠券booleantrue
    border是否显示内边框booleantrue
    currency货币符号string¥

    CouponList Props

    参数说明类型默认值
    v-model:code当前输入的兑换码string-
    chosen-coupon当前选中优惠券的索引number-1
    coupons可用优惠券列表Coupon[][]
    disabled-coupons不可用优惠券列表Coupon[][]
    enabled-title可用优惠券列表标题string可使用优惠券
    disabled-title不可用优惠券列表标题string不可使用优惠券
    exchange-button-text兑换按钮文字string兑换
    exchange-button-loading是否显示兑换按钮加载动画booleanfalse
    exchange-button-disabled是否禁用兑换按钮booleanfalse
    exchange-min-length兑换码最小长度number1
    displayed-coupon-index滚动至特定优惠券位置number-
    show-close-button是否显示列表底部按钮booleantrue
    close-button-text列表底部按钮文字string不使用优惠
    input-placeholder输入框文字提示string请输入优惠码
    show-exchange-bar是否展示兑换栏booleantrue
    currency货币符号string¥
    empty-image列表为空时的占位图stringhttps://img.yzcdn.cn/vant/coupon-empty.png
    show-count是否展示可用 / 不可用数量booleantrue

    CouponList Events

    事件名说明回调参数
    change优惠券切换回调index, 选中优惠券的索引
    exchange兑换优惠券回调code, 兑换码

    CouponList Slots

    名称说明
    list-footer v3.0.18优惠券列表底部
    disabled-list-footer v3.0.18不可用优惠券列表底部

    Coupon 数据结构

    键名说明类型
    id优惠券 idstring
    name优惠券名称string
    condition满减条件string
    startAt卡有效开始时间 (时间戳, 单位秒)number
    endAt卡失效日期 (时间戳, 单位秒)number
    description描述信息,优惠券可用时展示string
    reason不可用原因,优惠券不可用时展示string
    value折扣券优惠金额,单位分number
    valueDesc折扣券优惠金额文案string
    unitDesc单位文案string

    样式变量

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

    名称默认值描述
    --van-coupon-margin0 var(--van-padding-sm) var(--van-padding-sm)-
    --van-coupon-content-height84px-
    --van-coupon-content-padding14px 0-
    --van-coupon-background-colorvar(--van-white)-
    --van-coupon-active-background-colorvar(--van-active-color)-
    --van-coupon-border-radiusvar(--van-border-radius-lg)-
    --van-coupon-box-shadow0 0 4px rgba(0, 0, 0, 0.1)-
    --van-coupon-head-width96px-
    --van-coupon-amount-colorvar(--van-danger-color)-
    --van-coupon-amount-font-size30px-
    --van-coupon-currency-font-size40%-
    --van-coupon-name-font-sizevar(--van-font-size-md)-
    --van-coupon-disabled-text-colorvar(--van-gray-6)-
    --van-coupon-description-paddingvar(--van-padding-xs) var(--van-padding-md)-
    --van-coupon-description-border-colorvar(--van-border-color)-
    --van-coupon-corner-checkbox-icon-colorvar(--van-danger-color)-
    --van-coupon-list-background-colorvar(--van-background-color)-
    --van-coupon-list-field-padding5px 0 5px var(--van-padding-md)-
    --van-coupon-list-exchange-button-height32px-
    --van-coupon-list-close-button-height40px-
    --van-coupon-list-empty-image-size200px-
    --van-coupon-list-empty-tip-colorvar(--van-gray-6)-
    --van-coupon-list-empty-tip-font-sizevar(--van-font-size-md)-
    --van-coupon-list-empty-tip-line-heightvar(--van-line-height-md)-
    --van-coupon-cell-selected-text-colorvar(--van-text-color)-


    介绍

    用于展示订单金额与提交订单。

    实例演示

    引入

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

    import { createApp } from 'vue';import { SubmitBar } from 'vant';const app = createApp();app.use(SubmitBar);

    代码演示

    基础用法

    <van-submit-bar :price="3050" button-text="提交订单" @submit="onSubmit" />
    import { Toast } from 'vant';export default {  setup() {    const onSubmit = () => Toast('点击按钮');    return {      onSubmit,    };  },};

    禁用状态

    禁用状态下不会触发 submit 事件。

    <van-submit-bar  disabled  :price="3050"  button-text="提交订单"  tip="你的收货地址不支持同城送, 我们已为你推荐快递"  tip-icon="info-o"  @submit="onSubmit"/>

    加载状态

    加载状态下不会触发 submit 事件。

    <van-submit-bar  loading  :price="3050"  button-text="提交订单"  @submit="onSubmit"/>

    高级用法

    通过插槽插入自定义内容。

    <van-submit-bar :price="3050" button-text="提交订单" @submit="onSubmit">  <van-checkbox v-model="checked">全选</van-checkbox>  <template #tip>    你的收货地址不支持同城送, <span @click="onClickLink">修改地址</span>  </template></van-submit-bar>
    import { Toast } from 'vant';export default {  setup() {    const onSubmit = () => Toast('点击按钮');    const onClickLink = () => Toast('修改地址');    return {      onSubmit,      onClickLink,    };  },};

    API

    Props

    参数说明类型默认值
    price金额(单位分)number-
    decimal-length金额小数点位数number | string2
    label金额左侧文案string合计:
    suffix-label金额右侧文案string-
    text-align金额文案对齐方向,可选值为 leftstringright
    button-text按钮文字string-
    button-type按钮类型stringdanger
    button-color自定义按钮颜色string-
    tip在订单栏上方的提示文案string-
    tip-icon提示文案左侧的图标名称或图片链接string-
    currency货币符号string¥
    disabled是否禁用按钮booleanfalse
    loading是否显示将按钮显示为加载中状态booleanfalse
    safe-area-inset-bottom是否开启底部安全区适配booleantrue

    Events

    事件名说明回调参数
    submit按钮点击事件回调-

    Slots

    名称说明
    default自定义订单栏左侧内容
    button自定义按钮
    top自定义订单栏上方内容
    tip提示文案中的额外内容

    样式变量

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

    名称默认值描述
    --van-submit-bar-height50px-
    --van-submit-bar-z-index100-
    --van-submit-bar-background-colorvar(--van-white)-
    --van-submit-bar-button-width110px-
    --van-submit-bar-price-colorvar(--van-danger-color)-
    --van-submit-bar-text-colorvar(--van-text-color)-
    --van-submit-bar-text-font-sizevar(--van-font-size-md)-
    --van-submit-bar-tip-paddingvar(--van-padding-xs) var(--van-padding-sm)-
    --van-submit-bar-tip-font-sizevar(--van-font-size-sm)-
    --van-submit-bar-tip-line-height1.5-
    --van-submit-bar-tip-color#f56723-
    --van-submit-bar-tip-background-color#fff7cc-
    --van-submit-bar-tip-icon-size12px-
    --van-submit-bar-button-height40px-
    --van-submit-bar-padding0 var(--van-padding-md)-
    --van-submit-bar-price-font-sizevar(--van-font-size-sm)-
    --van-submit-bar-price-integer-font-size20px-
    --van-submit-bar-price-font-familyvar(--van-price-integer-font-family)-


    介绍

    Vant 内置了一系列的组合式 API,对于安装了 vant 的项目,可以直接使用这些 API 进行开发。

    示例

    下面是一个 Vant 组合式 API 的用法示例,我们从 @vant/use 这个包中引入 useWindowSize 方法,然后进行调用,即可获取到当前 Window 的宽度和高度。

    import { useWindowSize } from '@vant/use';const { width, height } = useWindowSize();console.log(width.value); // -> 窗口宽度console.log(height.value); // -> 窗口高度

    API 列表

    下面是 Vant 对外提供的所有组合式 API,点击名称可以查看详细介绍:

    名称描述
    useClickAway监听点击元素外部的事件
    useCountDown提供倒计时管理能力
    useEventListener方便地进行事件绑定
    usePageVisibility获取页面的可见状态
    useRect获取元素的大小及其相对于视口的位置
    useRelation建立父子组件之间的关联关系
    useScrollParent获取元素最近的可滚动父元素
    useToggle用于在布尔值之间进行切换
    useWindowSize获取浏览器窗口的视口宽度和高度


    介绍

    用于在 ​true ​和 ​false ​之间进行切换。

    代码演示

    基本用法

    import { useToggle } from '@vant/use';export default {  setup() {    const [state, toggle] = useToggle();    toggle(true);    console.log(state.value); // -> true    toggle(false);    console.log(state.value); // -> false    toggle();    console.log(state.value); // -> true  },};

    设置默认值

    import { useToggle } from '@vant/use';export default {  setup() {    const [state, toggle] = useToggle(true);    console.log(state.value); // -> true  },};

    API

    类型定义

    function useToggle(  defaultValue: boolean): [Ref<boolean>, (newValue: boolean) => void];

    参数

    参数说明类型默认值
    defaultValue默认值booleanfalse

    返回值

    参数说明类型
    state状态值Ref<boolean>
    toggle切换状态值的函数(newValue?: boolean) => void


    介绍

    提供倒计时管理能力。

    代码演示

    基本用法

    <span>总时间:{{ current.total }}</span><span>剩余天数:{{ current.days }}</span><span>剩余小时:{{ current.hours }}</span><span>剩余分钟:{{ current.minutes }}</span><span>剩余秒数:{{ current.seconds }}</span><span>剩余毫秒:{{ current.milliseconds }}</span>
    import { useCountDown } from '@vant/use';export default {  setup() {    const countDown = useCountDown({      // 倒计时 24 小时      time: 24 * 60 * 60 * 1000,    });    // 开始倒计时    countDown.start();    return {      current: countDown.current,    };  },};

    毫秒级渲染

    倒计时默认每秒渲染一次,设置 millisecond 选项可以开启毫秒级渲染。

    import { useCountDown } from '@vant/use';export default {  setup() {    const countDown = useCountDown({      time: 24 * 60 * 60 * 1000,      millisecond: true,    });    countDown.start();    return {      current: countDown.current,    };  },};

    API

    类型定义

    type CurrentTime = {  days: number;  hours: number;  total: number;  minutes: number;  seconds: number;  milliseconds: number;};type CountDown = {  start: () => void;  pause: () => void;  reset: (totalTime: number) => void;  current: ComputedRef<CurrentTime>;};type UseCountDownOptions = {  time: number;  millisecond?: boolean;  onChange?: (current: CurrentTime) => void;  onFinish?: () => void;};function useCountDown(options: UseCountDownOptions): CountDown;

    参数

    参数说明类型默认值
    time倒计时时长,单位毫秒number-
    millisecond是否开启毫秒级渲染booleanfalse
    onChange倒计时改变时触发的回调函数(current: CurrentTime) => void-
    onFinish倒计时结束时触发的回调函数-

    返回值

    参数说明类型
    current当前剩余的时间CurrentTime
    start开始倒计时() => void
    pause暂停倒计时() => void
    reset重置倒计时,支持传入新的倒计时时长(time?: number): void

    CurrentTime 格式

    名称说明类型
    total剩余总时间(单位毫秒)number
    days剩余天数number
    hours剩余小时number
    minutes剩余分钟number
    seconds剩余秒数number
    milliseconds剩余毫秒number


    介绍

    用于自定义 Form 组件中的表单项。

    代码演示

    基本用法

    如果需要自定义表单项,可以在 Field 组件的 input 插槽中插入你的自定义组件,并在自定义组件内部调用 useCustomFieldValue 方法。

    自定义组件

    首先,在你的自定义组件中,调用 useCustomFieldValue 方法,并传入一个回调函数,这个函数返回值为表单项的值。

    // MyComponent.vueimport { useCustomFieldValue } from '@vant/use';export default {  setup() {    // 此处传入的值会替代 Field 组件内部的 value    useCustomFieldValue(() => 'Some value');  },};

    表单

    接着,在 Form 组件中嵌入你的自定义组件,当提交表单时,即可获取到自定义表单项的值。

    <van-form>  <!-- 这是一个自定义表单项 -->  <!-- 当表单提交时,会包括 useCustomFieldValue 中传入的值 -->  <van-field name="my-field" label="自定义表单项">    <template #input>      <my-component />    </template>  </van-field></van-form>

    API

    类型定义

    function useCustomFieldValue(customValue: () => unknown): void;

    参数

    参数说明类型默认值
    customValue获取表单项值的函数() => unknown-


    介绍

    获取元素的大小及其相对于视口的位置,等价于 Element.getBoundingClientRect

    代码演示

    基本用法

    <div ref="root" />
    import { ref } from 'vue';import { useRect } from '@vant/use';export default {  setup() {    const root = ref();    const rect = useRect();    console.log(rect); // -> 元素的大小及其相对于视口的位置    return { root };  },};

    API

    类型定义

    function useRect(  element: Element | Window | Ref<Element | Window | undefined>): DOMRect;

    返回值

    参数说明类型
    width宽度number
    height高度number
    top顶部与视图窗口左上角的距离number
    left左侧与视图窗口左上角的距离number
    right右侧与视图窗口左上角的距离number
    bottom底部与视图窗口左上角的距离number


    介绍

    方便地进行事件绑定,在组件 mounted 和 activated 时绑定事件,unmounted 和 deactivated 时解绑事件。

    代码演示

    基本用法

    import { ref } from 'vue';import { useEventListener } from '@vant/use';export default {  setup() {    // 在 window 上绑定 resize 事件    // 未指定监听对象时,默认会监听 window 的事件    useEventListener('resize', () => {      console.log('window resize');    });    // 在 body 元素上绑定 click 事件    useEventListener(      'click',      () => {        console.log('click body');      },      { target: document.body }    );  },};

    类型定义

    type Options = {  target?: EventTarget | Ref<EventTarget>;  capture?: boolean;  passive?: boolean;};function useEventListener(  type: string,  listener: EventListener,  options?: Options): void;

    API

    参数

    参数说明类型默认值
    type监听的事件类型string-
    listener点击外部时触发的回调函数EventListener-
    options可选的配置项Options-

    Options

    参数说明类型默认值
    target绑定事件的元素EventTarget | Ref<EventTarget>window
    capture是否在事件捕获阶段触发booleanfalse
    passive设置为 true 时,表示 listener 永远不会调用 preventDefaultbooleanfalse


    介绍

    获取页面的可见状态。

    代码演示

    基本用法

    import { watch } from 'vue';import { usePageVisibility } from '@vant/use';export default {  setup() {    const pageVisibility = usePageVisibility();    watch(pageVisibility, (value) => {      console.log('visibility: ', value);    });  },};

    API

    类型定义

    type VisibilityState = 'visible' | 'hidden';function usePageVisibility(): Ref<VisibilityState>;

    返回值

    参数说明类型
    visibilityState页面当前的可见状态,visible 为可见,hidden 为隐藏Ref<VisibilityState>


    介绍

    获取元素最近的可滚动父元素。

    代码演示

    基本用法

    <div ref="root" />
    import { ref, watch } from 'vue';import { useScrollParent, useEventListener } from '@vant/use';export default {  setup() {    const root = ref();    const scrollParent = useScrollParent(root);    useEventListener(      'scroll',      () => {        console.log('scroll');      },      { target: scrollParent }    );    return { root };  },};

    API

    类型定义

    function useScrollParent(  element: Ref<Element | undefined>): Ref<Element | Window | undefined>;

    参数

    参数说明类型默认值
    element当前元素Ref<Element>-

    返回值

    参数说明类型
    scrollParent最近的可滚动父元素Ref<Element>


    介绍

    获取浏览器窗口的视口宽度和高度,并在窗口大小变化时自动更新。

    代码演示

    基本用法

    import { watch } from 'vue';import { useWindowSize } from '@vant/use';export default {  setup() {    const { width, height } = useWindowSize();    console.log(width.value); // -> 窗口宽度    console.log(height.value); // -> 窗口高度    watch([width, height], () => {      console.log('window resized');    });  },};

    API

    类型定义

    function useWindowSize(): {  width: Ref<number>;  height: Ref<number>;};

    返回值

    参数说明类型
    width浏览器窗口宽度Ref<number>
    height浏览器窗口高度Ref<number>


    介绍

    建立父子组件之间的关联关系,进行数据通信和方法调用,基于 provide 和 inject 实现。

    代码演示

    基本用法

    在父组件中使用 useChildren 关联子组件:

    import { ref } from 'vue';import { useChildren } from '@vant/use';const RELATION_KEY = Symbol('my-relation');export default {  setup() {    const { linkChildren } = useChildren(RELATION_KEY);    const count = ref(0);    const add = () => {      count.value++;    };    // 向子组件提供数据和方法    linkChildren({ add, count });  },};

    在子组件中使用 useParent 获取父组件提供的数据和方法:

    import { useParent } from '@vant/use';export default {  setup() {    const { parent } = useParent(RELATION_KEY);    // 调用父组件提供的数据和方法    if (parent) {      parent.add();      console.log(parent.count.value); // -> 1    }  },};

    API

    类型定义

    function useParent<T>(  key: string | symbol): {  parent?: T;  index?: Ref<number>;};function useChildren(  key: string | symbol): {  children: ComponentPublicInstance[];  linkChildren: (value: any) => void;};

    useParent 返回值

    参数说明类型
    parent父组件提供的值any
    index当前组件在父组件的所有子组件中对应的索引位置Ref<number>

    useChildren 返回值

    参数说明类型
    children子组件列表ComponentPublicInstance[]
    linkChildren向子组件提供值的方法(value: any) => void


    介绍

    监听点击元素外部的事件。

    代码演示

    基本用法

    <div ref="root" />
    import { ref } from 'vue';import { useClickAway } from '@vant/use';export default {  setup() {    const root = ref();    useClickAway(root, () => {      console.log('click outside!');    });    return { root };  },};

    自定义事件

    通过 eventName 选项可以自定义需要监听的事件类型。

    <div ref="root" />
    import { ref } from 'vue';import { useClickAway } from '@vant/use';export default {  setup() {    const root = ref();    useClickAway(      root,      () => {        console.log('touch outside!');      },      { eventName: 'touchstart' }    );    return { root };  },};

    API

    类型定义

    type Options = {  eventName?: string;};function useClickAway(  target: Element | Ref<Element | undefined>,  listener: EventListener,  options?: Options): void;

    参数

    参数说明类型默认值
    target绑定事件的元素Element | Ref<Element>-
    listener点击外部时触发的回调函数EventListener-
    options可选的配置项Options见下表

    Options

    参数说明类型默认值
    eventName监听的事件类型stringclick


    定制主题

    废弃提示

    本文档已废弃,Vant 提供了更方便的 ConfigProvider 全局配置 组件进行主题配置。基于 Less 变量进行定制的方式将在下个大版本废弃。

    介绍

    Vant 提供了一套默认主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。如果你想完全替换主题色或者其他样式,可以按照本文档进行主题定制。

    示例工程

    我们提供了一个基于 Vue Cli 3 的示例工程,仓库地址为 Vant Demo,其中包含了定制主题的基本配置,可以作为参考。

    样式变量

    Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,通过替换样式变量即可定制你自己需要的主题。

    下面是所有的基础样式变量,组件的样式变量请参考各个组件的文档,或查看组件源码目录下的 var.less 文件。

    // Color Palette@black: #000;@white: #fff;@gray-1: #f7f8fa;@gray-2: #f2f3f5;@gray-3: #ebedf0;@gray-4: #dcdee0;@gray-5: #c8c9cc;@gray-6: #969799;@gray-7: #646566;@gray-8: #323233;@red: #ee0a24;@blue: #1989fa;@orange: #ff976a;@orange-dark: #ed6a0c;@orange-light: #fffbe8;@green: #07c160;// Gradient Colors@gradient-red: linear-gradient(to right, #ff6034, #ee0a24);@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);// Component Colors@text-color: @gray-8;@active-color: @gray-2;@active-opacity: 0.7;@disabled-opacity: 0.5;@background-color: @gray-1;@background-color-light: #fafafa;@text-link-color: #576b95;// Padding@padding-base: 4px;@padding-xs: @padding-base * 2;@padding-sm: @padding-base * 3;@padding-md: @padding-base * 4;@padding-lg: @padding-base * 6;@padding-xl: @padding-base * 8;// Font@font-size-xs: 10px;@font-size-sm: 12px;@font-size-md: 14px;@font-size-lg: 16px;@font-weight-bold: 500;@line-height-xs: 14px;@line-height-sm: 18px;@line-height-md: 20px;@line-height-lg: 22px;@base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue',  Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB',  'Microsoft Yahei', sans-serif;@price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue, Arial,  sans-serif;// Animation@animation-duration-base: 0.3s;@animation-duration-fast: 0.2s;@animation-timing-function-enter: ease-out;@animation-timing-function-leave: ease-in;// Border@border-color: @gray-3;@border-width-base: 1px;@border-radius-sm: 2px;@border-radius-md: 4px;@border-radius-lg: 8px;@border-radius-max: 999px;

    定制方法

    步骤一 引入样式源文件

    定制主题时,需要引入组件对应的 Less 样式文件,支持按需引入和手动引入两种方式。

    按需引入样式(推荐)

    在 babel.config.js 中配置按需引入样式源文件,注意 babel 6 不支持按需引入样式,请手动引入样式。

    module.exports = {  plugins: [    [      'import',      {        libraryName: 'vant',        libraryDirectory: 'es',        // 指定样式路径        style: (name) => `${name}/style/less`,      },      'vant',    ],  ],};

    手动引入样式

    // 引入全部样式import 'vant/lib/index.less';// 引入单个组件样式import 'vant/lib/button/style/less';

    步骤二 修改样式变量

    使用 Less 提供的 modifyVars 即可对变量进行修改,下面是参考的 webpack 配置。

    // webpack.config.jsmodule.exports = {  rules: [    {      test: /.less$/,      use: [        // ...其他 loader 配置        {          loader: 'less-loader',          options: {            // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。            lessOptions: {              modifyVars: {                // 直接覆盖变量                'text-color': '#111',                'border-color': '#eee',                // 或者可以通过 less 文件覆盖(文件路径为绝对路径)                hack: `true; @import "your-less-file-path.less";`,              },            },          },        },      ],    },  ],};

    如果 vue-cli 搭建的项目,可以在 vue.config.js 中进行配置。

    // vue.config.jsmodule.exports = {  css: {    loaderOptions: {      less: {        // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。        lessOptions: {          modifyVars: {            // 直接覆盖变量            'text-color': '#111',            'border-color': '#eee',            // 或者可以通过 less 文件覆盖(文件路径为绝对路径)            hack: `true; @import "your-less-file-path.less";`,          },        },      },    },  },};

    Vite 项目

    如果是 vite 项目,可以跳过以上步骤,直接在 vite.config.js 中添加如下配置即可。

    // vite.config.jsimport vue from '@vitejs/plugin-vue';import styleImport from 'vite-plugin-style-import';export default {  css: {    preprocessorOptions: {      less: {        javascriptEnabled: true,        // 覆盖样式变量        modifyVars: {          'text-color': '#111',          'border-color': '#eee',        },      },    },  },  resolve: {    alias: [{ find: /^~/, replacement: '' }],  },  plugins: [    vue(),    // 按需引入样式源文件    styleImport({      libs: [        {          libraryName: 'vant',          esModule: true,          resolveStyle: (name) => `vant/es/${name}/style/less`,        },      ],    }),  ],};


    介绍

    Vant 是有赞前端团队开源的移动端组件库,于 2017 年开源,已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务,对外服务十多万开发者,是业界主流的移动端组件库之一。

    目前 Vant 官方提供了 Vue 2 版本Vue 3 版本微信小程序版本,并由社区团队维护  React 版本支付宝小程序版本

    特性

    • 提供 60 多个高质量组件,覆盖移动端各类场景
    • 性能极佳,组件平均体积不到 1kb(min+gzip)
    • 单元测试覆盖率 90%+,提供稳定性保障
    • 完善的中英文文档和示例
    • 支持 Vue 2 & Vue 3
    • 支持按需引入
    • 支持主题定制
    • 支持国际化
    • 支持 TypeScript
    • 支持 SSR

    快速上手

    请参考 快速上手 章节

    贡献代码

    修改代码请阅读我们的 贡献指南

    使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR

    浏览器支持

    现代浏览器以及 Android 4.0+, iOS 8.0+

    加入我们

    有赞前端团队是由一群年轻、皮实、对技术饱含热情的小伙伴组成的,目前共有 100 多名前端工程师,分布在业务中台、电商、零售、美业、资产、赋能等业务线。

    我们热爱分享和开源,崇尚用工程师的方式解决问题,因此造了很多工具来解决我们遇到的问题,目前我们维护的开源产品有:

    我们正在寻找更多优秀的小伙伴,一起拓展前端技术的边界,期待你的加入!

    生态

    项目描述
    vant-demoVant 官方示例合集
    vant-weapp微信小程序组件库
    vant-cli开箱即用的组件库搭建工具
    vant-iconsVant 图标库
    vant-touch-emulator在桌面端使用 Vant 的辅助库

    社区生态

    由社区维护的项目如下,欢迎补充:

    项目描述
    vant-reactVant React 版
    vant-aliappVant 支付宝小程序版
    taroifyVant Taro 版

    链接

    开源协议

    本项目基于 MIT 协议,请自由地享受和参与开源


    通过 npm 安装

    在现有项目中使用 Vant 时,可以通过 ​npm ​或 ​yarn ​进行安装:

    # Vue 2 项目,安装 Vant 2:npm i vant -S# Vue 3 项目,安装 Vant 3:npm i vant@next -S

    通过 CDN 安装

    使用 Vant 最简单的方法是直接在 html 文件中引入 CDN 链接,之后你可以通过全局变量 ​vant ​访问到所有组件。

    <!-- 引入样式文件 --><link  rel="stylesheet"  href="https://cdn.jsdelivr.net/npm/vant@next/lib/index.css" rel="external nofollow" target="_blank" /><!-- 引入 Vue 和 Vant 的 JS 文件 --><script src="https://cdn.jsdelivr.net/npm/vue@next" rel="external nofollow" ></script><script src="https://cdn.jsdelivr.net/npm/vant@next/lib/vant.min.js" rel="external nofollow" ></script><script>  // 在 #app 标签下渲染一个按钮组件  const app = Vue.createApp({    template: `<van-button>按钮</van-button>`,  });  app.use(vant);  // 通过 CDN 引入时不会自动注册 Lazyload 组件  // 可以通过下面的方式手动注册  app.use(vant.Lazyload);  // 调用函数组件,弹出一个 Toast  vant.Toast('提示');  app.mount('#app');</script>

    你可以通过以下免费 CDN 服务来使用 Vant:

    通过脚手架安装

    在新项目中使用 Vant 时,推荐使用 Vue 官方提供的脚手架 Vue Cli 创建项目并安装 Vant。

    # 安装 Vue Clinpm install -g @vue/cli# 创建一个项目vue create hello-world# 创建完成后,可以通过命令打开图形化界面,如下图所示vue ui

    vue图形化界面

    在图形化界面中,点击 依赖 -> 安装依赖,然后将 vant 添加到依赖中即可。

    示例

    示例工程

    我们提供了丰富的示例工程,通过示例工程你可以了解如下内容:

    • 基于 Vue Cli 和 Vant 搭建应用
    • 基于 Nuxt 和 Vant 搭建应用
    • 配置按需引入组件
    • 配置基于 Rem 的适配方案
    • 配置基于 Viewport 的适配方案
    • 配置基于 TypeScript 的工程
    • 配置自定义主题色方案

    引入组件

    方式一. 通过 babel 插件按需引入组件

    babel-plugin-import 是一款 babel 插件,它会在编译过程中将 import 语句自动转换为按需引入的方式。

    # 安装插件npm i babel-plugin-import -D

    在.babelrc 或 babel.config.js 中添加配置:

    {  "plugins": [    [      "import",      {        "libraryName": "vant",        "libraryDirectory": "es",        "style": true      }    ]  ]}

    接着你可以在代码中直接引入 Vant 组件,插件会自动将代码转化为按需引入的形式。

    // 原始代码import { Button } from 'vant';// 编译后代码import Button from 'vant/es/button';import 'vant/es/button/style';
    如果你在使用 TypeScript,可以使用 ts-import-plugin 实现按需引入。

    方式二. 在 Vite 项目中按需引入组件

    对于 vite 项目,可以使用 vite-plugin-style-import 实现按需引入, 原理和 babel-plugin-import 类似。

    # 安装插件npm i vite-plugin-style-import -D
    // vite.config.jsimport vue from '@vitejs/plugin-vue';import styleImport from 'vite-plugin-style-import';export default {  plugins: [    vue(),    styleImport({      libs: [        {          libraryName: 'vant',          esModule: true,          resolveStyle: (name) => `vant/es/${name}/style`,        },      ],    }),  ],};

    方式三. 手动按需引入组件

    在不使用插件的情况下,可以手动引入需要使用的组件和样式。

    // 引入组件import Button from 'vant/es/button';// 引入组件对应的样式,若组件没有样式文件,则无须引入import 'vant/es/button/style';

    方式四. 导入所有组件

    Vant 支持一次性导入所有组件,引入所有组件会增加代码包体积,因此不推荐这种做法。

    import { createApp } from 'vue';import Vant from 'vant';import 'vant/lib/index.css';const app = createApp();app.use(Vant);
    Tips: 配置按需引入后,将不允许直接导入所有组件。

    常见问题

    如何自定义 Vant 组件的样式?

    1. 主题定制

    Vant 基于 CSS 变量提供了主题定制的能力,可以对组件样式进行统一修改,详见 ConfigProvider 全局配置 组件。

    2. 覆盖默认样式

    如果主题定制不能满足你的需求,也可以通过自定义样式类来覆盖默认样式,参考下面的示例:

    <template>  <van-button class="my-button">按钮</van-button></template><style>  /** 覆盖 Button 最外层元素的样式 */  .my-button {    width: 200px;  }  /** 覆盖 Button 内部子元素的样式 */  .my-button .van-button__text {    color: red;  }</style>

    在 HTML 中无法正确渲染组件?

    在 HTML 中使用 Vant 组件时,你可能会碰到部分示例代码无法正确渲染的情况,比如下面的用法:

    <van-cell-group>  <van-cell title="单元格" value="内容" />  <van-cell title="单元格" value="内容" /></van-cell-group>

    这是因为 HTML 并不支持自闭合的自定义元素,也就是说 <van-cell /> 这样的语法是不被识别的,使用完整的闭合标签可以避免这个问题:

    <van-cell-group>  <van-cell title="单元格" value="内容"></van-cell>  <van-cell title="单元格" value="内容"></van-cell></van-cell-group>

    在单文件组件、字符串模板和 JSX 中可以使用自闭合的自定义元素,因此不会出现这个问题。


    组件注册

    Vant 支持多种组件注册方式,请根据实际业务需要进行选择。

    全局注册

    全局注册后,你可以在 app 下的任意子组件中使用注册的 Vant 组件。

    import { Button } from 'vant';import { createApp } from 'vue';const app = createApp();// 方式一. 通过 app.use 注册// 注册完成后,在模板中通过 <van-button> 或 <VanButton> 标签来使用按钮组件app.use(Button);// 方式二. 通过 app.component 注册// 注册完成后,在模板中通过 <van-button> 标签来使用按钮组件app.component(Button.name, Button);

    局部注册

    局部注册后,你可以在当前组件中使用注册的 Vant 组件。

    import { Button } from 'vant';export default {  components: {    [Button.name]: Button,  },};
    对于组件注册更详细的介绍,请参考 Vue 官方文档 - 组件注册。

    组件插槽

    Vant 提供了丰富的组件插槽,通过插槽可以对组件的某一部分进行个性化定制。如果你对 Vue 的插槽不太熟悉,可以阅读 Vue 官方文档中的插槽章节。下面是通过插槽来定制 Checkbox 图标的示例:

    <van-checkbox v-model="checked">  <!-- 使用组件提供的 icon 插槽 -->  <!-- 将默认图标替换为个性化图片 -->  <template #icon="props">    <img :src="props.checked ? activeIcon : inactiveIcon" />  </template></van-checkbox>
    export default {  data() {    return {      checked: true,      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

    组件实例方法

    Vant 中的许多组件提供了实例方法,调用实例方法时,我们需要通过 ref 来注册组件引用信息,引用信息将会注册在父组件的$refs对象上。注册完成后,我们可以通过this.$refs.xxx访问到对应的组件实例,并调用上面的实例方法。

    <!-- 通过 ref 属性将组件绑定到 this.$refs.checkbox 上 --><van-checkbox v-model="checked" ref="checkbox"> 复选框 </van-checkbox>
    export default {  data() {    return {      checked: false,    };  },  // 注意:组件挂载后才能访问到 ref 对象  mounted() {    this.$refs.checkbox.toggle();  },};

    浏览器适配

    Viewport 布局

    Vant 默认使用 px 作为样式单位,如果需要使用 viewport 单位 (vw, vh, vmin, vmax),推荐使用 postcss-px-to-viewport 进行转换。

    postcss-px-to-viewport 是一款 PostCSS 插件,用于将 px 单位转化为 vw/vh 单位。

    PostCSS PostCSS 示例配置

    下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。

    // postcss.config.jsmodule.exports = {  plugins: {    'postcss-px-to-viewport': {      viewportWidth: 375,    },  },};
    Tips: 在配置 postcss-loader 时,应避免 ignore node_modules 目录,否则将导致 Vant 样式无法被编译。

    Rem 布局适配

    如果需要使用 rem 单位进行适配,推荐使用以下两个工具:

    PostCSS 示例配置

    下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。

    // postcss.config.jsmodule.exports = {  plugins: {    'postcss-pxtorem': {      rootValue: 37.5,      propList: ['*'],    },  },};

    其他设计稿尺寸

    如果设计稿的尺寸不是 375,而是 750 或其他大小,可以将 rootValue 配置调整为:

    // postcss.config.jsmodule.exports = {  plugins: {    // postcss-pxtorem 插件的版本需要 >= 5.0.0    'postcss-pxtorem': {      rootValue({ file }) {        return file.indexOf('vant') !== -1 ? 37.5 : 75;      },      propList: ['*'],    },  },};

    桌面端适配

    Vant 是一个面向移动端的组件库,因此默认只适配了移动端设备,这意味着组件只监听了移动端的 touch 事件,没有监听桌面端的 mouse 事件。

    如果你需要在桌面端使用 Vant,可以引入我们提供的 @vant/touch-emulator,这个库会在桌面端自动将 mouse 事件转换成对应的 touch 事件,使得组件能够在桌面端使用。

    # 安装模块npm i @vant/touch-emulator -S
    // 引入模块后自动生效import '@vant/touch-emulator';

    底部安全区适配

    iPhone X 等机型底部存在底部指示条,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行安全区适配。Vant 中部分组件提供了 safe-area-inset-top 或 safe-area-inset-bottom 属性,设置该属性后,即可在对应的机型上开启适配,如下示例:

    <!-- 在 head 标签中添加 meta 标签,并设置 viewport-fit=cover 值 --><meta  name="viewport"  content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"/><!-- 开启顶部安全区适配 --><van-nav-bar safe-area-inset-top /><!-- 开启底部安全区适配 --><van-number-keyboard safe-area-inset-bottom />



    提示
    当前文档为 Vant 3 的更新日志,如需查询 Vant 2 的更新内容,请访问 Vant 2 更新日志

    介绍

    Vant 遵循 Semver 语义化版本规范。

    发布节奏

    • 修订号:每周发布,包含新特性和问题修复。
    • 次版本号:每隔一至二个月发布,包含新特性和较大的功能更新,向下兼容。
    • 主版本号:无固定的发布时间,包含不兼容更新和重大功能更新。

    更新内容

    v3.1.5

    2021-07-26

    Feature

    • AddressEdit: 新增 address-edit-button-font-size 样式变量 #9113
    • Icon: 新增 shield-o 图标 #9082
    • Locale: 新增 Russian 俄罗斯语言包 #9088
    • Toast: 优化不可点击状态下的光标展示 #9116
    • Uploader: 新增 click-upload 事件 #9119
    • Uploader: 新增 readonly 属性 #9118

    Bug Fixes

    • Icon: 修复 invitation 图标名称拼写错误 #9096
    • NumberKeyboard: 修复点击外部时会触发 close 事件的问题 #9108
    • Search: 修复左侧图标颜色不正确的问题 #9100
    • Tabbar: 修复 tabbar-item-icon-margin-bottom 样式变量名称 #9101

    v3.1.4

    2021-07-19

    Feature

    • ActionSheet: 新增 before-close 属性 #9068
    • Cascader: 新增 option 插槽 #9036
    • Cascader: 优化光标展示 #9032
    • Popup: 新增 before-close 属性 #9067
    • ShareSheet: 新增 before-close 属性 #9068
    • Tabs: 新增 click-tab 事件 #9037

    Bug Fixes

    • Field: 修复 label-align 为 right 时 required 标记位置错误的问题 #9035
    • List: 修复在 Tabs 内嵌套使用时,切换 Tabs 不触发 load 事件的问题 #9022
    • Popup: 修复某些情况下未正确触发 open、close 事件的问题 #9065

    v3.1.3

    2021-07-11

    Feature

    • Calendar: 新增 click-subtitle 事件 #8981
    • Calendar: 新增 subtitle 插槽 #8980
    • ConfigProvider: 新增 icon-prefix 属性 #8986
    • Slider: 新增 drag 事件参数 #8990
    • Slider: 新增 left-button、right-button 插槽 #8989
    • touch-emulator: 支持通过白名单排除节点 #8984

    Bug Fixes

    • Step: 修复 z-index 过高问题 #9003

    v3.1.2

    2021-07-03

    Feature

    • Area: 新增 toolbar、confirm、cancel 插槽 #8969
    • Calendar: 优化日期较多时的加载性能 #8955
    • Cascader: 新增 disabled 选项 #8952
    • ConfigProvider: 新增 tag 属性 #8967
    • Picker: 新增 toolbar 插槽,将 default 插槽标记为废弃 #8968
    • Picker: 允许 Option 的值为 number 类型 #8951
    • Picker: 新增 picker-option-padding CSS 变量 #8947

    Bug Fixes

    • Toast: 修复文字换行问题 #8965

    v3.1.1

    2021-06-27

    Feature

    • Cell: 新增 value 插槽,将 default 插槽标记为废弃 #8933
    • CollapseItem: 新增 label 插槽 #8934
    • NoticeBar: 新增 reset 方法 #8917
    • Tabs: 新增 nav-bottom 插槽 #8915

    v3.1.0

    2021-06-22

    New Component

    Feature

    • 所有组件支持 CSS 变量 aef257 fe1cba
    • 新增 primary-color 等样式变量 #8861
    • Checkbox: icon 插槽新增 disabled 参数 #8839
    • Cascader: 新增 className 选项 #8882
    • Cascader: 新增 color 选项 #8883
    • CellGroup: 新增 inset 属性 #8885
    • GridItem: 新增 reverse 属性 #8878
    • IndexBar: 新增 teleport 属性 #8820

    Bug Fixes

    • Dialog: 修复 message 作为函数时返回 HTML 字符串无效的问题 #8872
    • Slider: 修复设置 step 属性时,输入值格式化错误的问题 #8893

    v3.0.18

    2021-06-03

    Feature

    • Button: 新增 icon 插槽 #8783
    • CouponList: 新增 list-footer、disabled-list-footer 插槽 #8801
    • Locale: 新增 French 法语语言包 #8795
    • Popup: 新增 icon-prefix 属性 #8793
    • Popup: 新增 overlay-content 插槽 #8794

    Bug Fixes

    • Collapse: 修复在 safari 上可能出现渲染异常的问题 #8788
    • NoticeBar: 修复在 Popup 内嵌套使用时播放异常的问题 #8789
    • List: 移除未使用的 @list-icon-margin-right 变量 #8759
    • @vant/touch-emulator: 修复 SSR 时报错的问题 #8767

    v3.0.17

    2021-05-23

    Feature

    • ActionBarIcon: 新增 icon-prefix 属性 #8748
    • Calendar: 新增 over-range 事件 #8739
    • Calendar: 新增 show-range-prompt 属性 #8739
    • Calendar: 新增 top-info、bottom-info 插槽 #8716
    • GridItem: 新增 icon-color 属性 #8753
    • NoticeBar: 默认 speed 由 50 调整为 60 #8694
    • Popover: 新增 icon-prefix 属性 #8703
    • Toast: 新增不同类型 Toast 的 transition 过渡效果 #8743
    • Uploader: max-size 属性支持函数格式 #8744

    Bug Fixes

    • Button: 修复 tsx 下使用时缺少 onClick 类型定义的问题 #8665
    • Calendar: 修复默认日期不正确的问题 #8696
    • DatetimePicker: 修复动态设置 minDate、maxDate 时异常的问题 #8658
    • List: 修复在开启 animated 的 Tabs 下使用时加载异常的问题 #8741
    • Tabs: 修复滚动事件监听不正确的问题 #8734
    • Toast: 修复多次调用时持续时间不正确的问题 #8742

    v3.0.16

    2021-05-03

    Feature

    • Swipe: 新增 indicator 插槽的 active 参数 #8645
    • Cascader: 新增 @cascader-header-padding less 变量 #8626
    • Steps: 新增 icon-prefix 属性 #8631
    • 导出更多类型定义 #8652

    Bug Fixes

    • Stepper: 修复 blur 事件触发时机 #8620
    • SubmitBar: 修复 @submit-bar-price-font-size 变量不生效的问题 #8639
    • Swipe: 修复在 Popup 内时展示可能不正确的问题 #8643
    • Tabs: 修复在 Popup 内时展示可能不正确的问题 #8642

    v3.0.15

    2021-04-25

    Feature

    • Cascader: 新增 click-tab 事件 #8606

    Bug Fixes

    • Tab: 修复 SSR 时报错的问题 #8603
    • Rate: 修复点击半星时未正确选中的问题 #8580
    • Tag: 修复使用 color 和 plain 属性时边框颜色错误的问题 #8601

    v3.0.14

    2021-04-18

    Feature

    • Badge: offset 属性支持传入任意单位 35edb7
    • Rate: 支持在 readonly 时渲染任意小数结果 #8528

    Bug Fixes

    • ContactList: 修复 nodes 类型错误 0b764b

    v3.0.13

    2021-04-11

    Feature

    • ActionBar: 新增 @action-bar-icon-background-color 样式变量 #8474
    • Popover: 升级依赖的 @popperjs/core 到 2.9.2 版本 0d1323
    • perf: 优化包体积 ba3e6d

    Types

    • Popup: 修复 PopupCloseIconPosition 类型错误 15d901
    • Search: 修复在 tsx 下部分 props 不存在的问题 #8485
    • Stepper: 优化 theme 属性类型定义 #8489

    Bug Fixes

    • Field: 修复 autofocus 属性不生效的问题 #8488

    v3.0.12

    2021-04-05

    Feature

    • CollapseItem: 新增 readonly 属性 #8445
    • Field: 新增 clear-icon 属性 #8438
    • Search: 新增 clear-icon 属性 #8439
    • Search: 新增 error-message 属性 #8442
    • Search: 新增 formatter、format-trigger 属性 #8441

    Bug Fixes

    • 修复 Webstorm 下组件标签提示不正确的问题 #8450

    v3.0.11

    2021-03-30

    Feature

    • Cascader: 新增 swipeable 属性 #8383
    • Dialog: 新增 footer 插槽 #8382
    • Dialog: 支持在 message 中传入 render 函数 #8420
    • Image: 新增 icon-size 属性 #8395
    • Row: 新增 wrap 属性 #8393

    Bug Fixes

    • Field: 修复在个别情况下错误地清除错误提示的问题 #8409
    • Sticky: 修复在 SSR 时提示 Element 不存在的问题 #8407
    • Tabs: 修复在 safari 上左滑退出页面时手势判断错误的问题 #8388

    v3.0.10

    2021-03-19

    Feature

    • ActionSheet: 新增 cancel 插槽 #8333
    • Badge: 新增 show-zero 属性 #8381
    • Cascader: 新增 close-icon 属性 #8334
    • Popover: 新增 close-on-click-overlay 属性 #8351
    • Popover: 新增 duration 属性 #8355
    • Popover: 新增 overlay-class 属性 #8353
    • Popover: 新增 overlay-style 属性 #8354
    • ShareSheet: 新增 cancel 插槽 #8335
    • Sticky: 新增 change event #8374
    • Tag: close 事件新增 event 参数 #8337
    • Toast: 新增 iconSize 选项 #8338

    Feature

    • ContactList: 新增 @contact-list-item-radio-icon-color Less 变量 #8322
    • Coupon: 新增 @coupon-corner-checkbox-icon-color Less 变量 #8323
    • List: 新增 @list-loading-icon-size Less 变量 #8365
    • Loading: 新增 @button-loading-icon-size Less 变量 465bf0
    • PullRefresh: 新增 @pull-refresh-loading-icon-size Less 变量 #8366

    Bug Fixes

    • Popover: 修复 close-on-click-outside 属性不生效的问题 #8352
    • Swipe: 修复添加 scale 动画时宽度计算错误的问题 #8330

    v3.0.9

    2021-03-08

    Feature

    • AddressList: 新增 tag 插槽 #8292

    Bug Fixes

    • 修复主题定制不生效的问题 #8301
    • 修复在 TS 下使用 app.use 注册组件报错的问题 #8308

    v3.0.8

    2021-03-07

    Types

    • 完善所有组件的类型定义 #8264

    Feature

    • ImagePreview: 新增 transition 属性 #8275
    • ImagePreview: 新增 overlay-style 属性 #8276
    • Locale: 新增 th-TH 泰语 #8297
    • PullRefresh: 新增 pull-distance 属性 #8280
    • Button: 新增若干个 Less 变量 #8281

    Bug Fixes

    • ActionSheet: 修复返回页面时可能错误地重新打开的问题 #8272
    • Stepper: 修复在 iOS14 下禁用时输入框文字不可见的问题 #8277
    • Swipe: 修复动态插入轮播图时渲染错误的问题 #8288

    v3.0.7

    2021-02-28

    Feature

    • Notify: 新增 lockScroll 选项 #8168
    • Popup: click-overlay 事件新增 Event 参数 #8107
    • ShareSheet: 新增 overlay-style 属性 #8225
    • ShareSheet: 新增 overlay-class 属性 #8225
    • Step: 新增 finish-icon 插槽 #8241
    • Steps: 新增 finish-icon 属性 #8103
    • Uploader: 新增 @uploader-mask-text-color 样式变量 #8064

    perf

    • 包体积优化:调整适配的浏览器版本,与 Vue 3 保持一致 #8227

    Bug Fixes

    • ActionSheet: 修复 safe-area-inset-bottom 属性不生效的问题 #8085
    • DateTimePicker: 修复 v-model 为 null 时初始值不正确的问题 #8193
    • Form: 修复提交表单时可能滚动到错误的表单项的问题 #8159
    • ImagePreview: 修复第二次调用时可能出现渲染不正确的问题 #8060
    • IndexBar: 修复初始化时激活的锚点未正确渲染的问题 #8164
    • Popup: 修复动态设置 lock-scroll 属性不生效的问题 #8169
    • Swipe: 修复初始化时 active 值可能错误的问题 #8061
    • SwipeCell: 修复点击外部时 click 事件参数不正确的问题 #8108
    • Tabbar: 修复 name 为 0 时激活的选项可能不正确的问题 #8125
    • Tabs: 修复 v-model 为 0 时激活的标签页可能不正确的问题 #8074
    • Toast: 修复 SSR 时可能报错的问题 #8214

    v3.0.6

    2021-01-31

    Feature

    • Area: 支持超过 6 位的地区码 #8001
    • Form: show-error 属性的默认值调整为 false #8016
    • Form: 支持在 validator 中返回错误提示 #8052
    • NumberKeyboard: 新增 blur-on-close 属性 #8033
    • Popover: 新增 click-overlay 事件 #8050
    • Popover: 支持在 action 选项对象中配置 color 字段 #8049
    • Sticky: 新增 position、offset-bottom 属性 #7979

    Bug Fixes

    • Button: 修复加载状态下会触发表单提交的问题 #8018
    • Calendar: 修复无法使用 scrollToDate 方法的问题 #7983
    • Empty: 修复 linearGradient id 可能导致冲突的问题 #8013
    • Toast: 修复 closeOnClickOverlay 设置为 true 不生效的问题 #8044

    v3.0.5

    2021-01-24

    Feature

    • Badge: 新增 offset 属性 e0b463
    • Calendar: reset 方法支持重置到指定日期 #7966
    • Icons: 新增 wechat 图标, 重命名原 wechat 图标为 wechat-pay b3cd8c
    • ImagePreview: 调用 swipeTo 方法后自动重置缩放状态 #7972
    • ImagePreview: 调整 swipeDuration 的默认值为 300ms #7970
    • ShareSheet: 新增 wechat-moments 朋友圈图标 ca66fb
    • Slider: 新增 readonly 属性 4cd991

    style

    • ShareSheet: 更新 qrcode 图标 32a08b
    • TreeSelect: 新增右侧选项点击反馈 bada31

    Bug Fixes

    • Calendar: 修复调用 reset 方法时未重置到默认日期的问题 #7967
    • Dialog: 修复切换 allowHtml 时 message 渲染不正确的问题 #7968
    • ImagePreview: 修复 scale 事件的 index 参数为 undefined 的问题 #7971

    v3.0.4

    2021-01-17

    Feature

    • Cascader: 新增 field-names 属性,用于自定义字段名 #7933
    • Cell: 支持在设置 is-link 时将 clickable 设置为 false 来禁用点击状态 #7923
    • DropdownItem: 支持传入数组或对象格式的 title-class #7926
    • Popup: 支持传入数组或对象格式的 overlay-class #7924
    • Toast: 新增 overlayClass 选项 #7925
    • Toast: 新增 overlayStyle 选项 #7898

    Bug Fixes

    • AddressEdit: 修复无法调用 setAreaCode 方法的问题 6a184f
    • Circle: 修复渐变色不生效的问题 #7909
    • NumberKeyboard: 修复 delete、extra-key 插槽不生效的问题 52a0e5
    • Search: 修复控制台存在 update:modelValue warning 的问题 #7872
    • Swipe: 修复页面隐藏时未暂停自动轮播的问题 1c428f

    v3.0.3

    2021-01-10

    Feature

    • Field: 新增 autocomplate 属性 #7877

    Bug Fixes

    • Area: 修复无法调用 getValues 方法的问题 03c7b4
    • ImagePreview: 修复 close-on-popstate 属性不生效的问题 #7880
    • List: 修复更新 error 属性后未触发位置检查的问题 b79c32

    v3.0.2

    2021-01-02

    Feature

    • Calendar: 新增 scrollToDate 方法 #7847
    • Form: 新增 disabled 属性 #7830
    • Form: 新增 readonly 属性 #7830
    • Loading: 新增 text-color 属性 #7806
    • Picker: 新增 columns-field-names 属性 #7791
    • NumberKeyboard: 新增 random-key-order 属性 #7841

    Bug Fixes

    • Calendar: 修复 title 插槽不生效的问题 #7826
    • Calendar: 修复动态设置 defaultDate 不生效的问题 #7815
    • Popup: 修复组件销毁时未解除滚动锁定的问题 #7835
    • Stepper: 修复动态设置 modelValue 时未格式化的问题 81494d

    v3.0.1

    2020-12-27

    Feature

    • Form: valdiate 方法支持校验多个表单项 #7810
    • Form: resetValidation 方法支持重置多个表单项 #7811
    • Stepper: 新增 show-input 属性,用于控制是否显示输入框 #7812
    • IndexBar: 新增 scrollTo 方法 #7794

    Bug Fixes

    • Cascader: 修复动画闪烁的问题 #7802
    • CountDown: 修复 SSR 过程中内存泄露的问题 #7808
    • Image: 修复 SSR 时提示 DOM 不匹配的问题 #7822
    • Popup: 修复滚动穿透的问题 #7738
    • Stepper: 修复 change 事件重复触发的问题 #7820
    • Swipe: 修复 SSR 样式不正确的问题 #7821
    • Swipe: 修复在 keepalive 标签内使用时显示不正确的问题 #7772

    v3.0.0

    2020-12-23

    更新内容

    请参考 Vant 3.0 正式发布:全面拥抱 Vue 3

    v3.0.0-rc.4

    2020-12-21

    New Component

    • 新增 Cascader 级联选择组件 #7771

    cascader级联选择组件

    Feature

    • Stepper: 新增 show-input 属性 #7785
    • uploader: 支持在 fileList 的选项中单独配置 imageFit deletable previewSize beforeDelete 字段 #7731

    Types

    • Lazyload: 修复类型定义错误 #7757

    v3.0.0-rc.3

    2020-12-10

    Breaking Change

    • Stepper: async-change 属性重命名为 before-change,并调整使用方法 e026d2

    perf

    • Stepper: 优化代码包体积 #7675

    Bug Fixes

    • Stepper: 修复禁用按钮仍然能点击的问题 c27760
    • Tabs: 修复动态设置 active 值无效的问题 #7717
    • 包含 v2.11.3 版本的所有改动和修复

    v3.0.0-rc.2

    2020-12-04

    perf

    • 优化包体积大小 #7675

    Bug Fixes

    • Lazyload: 修复未导出 ESModule 的问题 #7685
    • NumberKeyboard: 修复 hide-on-click-outside 属性不生效的问题 #7668 #7667
    • Uploader: 修复动态修改 status 不生效的问题 #7681
    • Types: 修复 teleport 类型定义错误的问题 #7687
    • 包含 v2.11.2 版本的所有改动和修复

    v3.0.0-rc.1

    2020-12-01

    Breaking Change

    • Popover: trigger 属性的默认值调整为 click 1699d9

    Feature

    • Lazyload: 适配 Vue 3 d3ca40
    • 包含 v2.11.1 版本的所有改动和修复

    style

    • Circle: 新增 @circle-color Less 变量 1a6cf6
    • Circle: 新增 @circle-layer-color Less 变量 65a5ed
    • Circle: 新增 @circle-size Less 变量 b57f7e
    • IndexBar: 默认高亮颜色调整为红色 65b680 87b0a0
    • IndexBar: 右边距调整为 8px aad055

    Bug Fixes

    • Image: 修复 lazy-load 属性不生效的问题 0ba818
    • Lazyload: 修复类型定义错误的问题 d0c4c2
    • Popup: 修复 transition-appear 属性不生效的问题 dd6930

    v3.0.0-beta.10

    2020-11-22

    Bug Fixes

    • Radio: 修复 Radio 无法操作的问题 0f7c9a

    v3.0.0-beta.9

    2020-11-22

    New Component

    气泡弹出框

    Feature

    • Search: 新增 blur 方法 d26282
    • Search: 新增 focus 方法 2833bc

    Bug Fixes

    • Checkbox: 修复 bind-group 属性不生效的问题 #7447
    • Badge: 修复无类型定义的问题 c487b3
    • 包含 v2.11.0 版本的所有改动和修复

    v3.0.0-beta.8

    2020-11-15

    Bug Fixes

    • ActionSheet: 修复选项禁用或加载时仍能点击的问题 996598
    • ActionSheet: 修复 callback 选项不生效的问题 27b761
    • Calendar: 修复 default-date 为 null 时渲染失败的问题 #7519
    • DatetimePicker: 修复 DOM 上渲染多余属性的问题 ed332d
    • NoticeBar: 修复初始化逻辑执行多次的问题 0712d9
    • Swipe: 修复在 lazy-render 模式下渲染失败的问题 e06ba4
    • Swipe: 修复初始化逻辑执行多次的问题 c94173
    • Tabs: 修复初始化逻辑执行多次的问题 599e81
    • 包含 v2.10.14 版本的所有改动和修复

    v3.0.0-beta.7

    2020-11-08

    Bug Fixes

    • Calendar: 修复动态设置 minDate 和 maxDate 时展示错误的问题 #7412
    • DropdownMenu: 修复无法禁用 closeOnClickOutside 属性的问题 #7473
    • Uploader: 修复在 before-read 返回 true 无效的问题 #7493
    • Uploader: 修复在 delete 事件中无法获取 index 的问题 #7481
    • 包含 v2.10.13 版本的所有改动和修复

    v3.0.0-beta.6

    2020-11-01

    Bug Fixes

    • Swipe: 修复开启 lazy-render 且 loop 为 false 时渲染节点不正确的问题 #7465
    • Swipe: 修复开启 lazy-render 时子节点被重复挂载的问题 #7466
    • Tabs: 修复初始动画错误的问题 49e877
    • ActionBar: 修复类型定义不存在的问题 #7440 #7442
    • 包含 v2.10.12 版本的所有改动和修复

    v3.0.0-beta.5

    2020-10-24

    Bug Fixes

    • Swipe: 修复动态插入轮播时无法滚动的问题 #7366
    • Toast: 修复 forbidClick 属性不生效的问题 #7396
    • Toast: 修复 duration 变化未生效的问题 #7394
    • 包含 v2.10.11 版本的所有改动和修复

    v3.0.0-beta.4

    2020-10-18

    refactor

    • Layout: 默认使用 flex 布局,移除 type 属性 f7a120

    style

    • Stepper: 布局方式调整为 inline-block e9c282

    Bug Fixes

    • ContactList: 修复 select 事件重复触发的问题 1dd408
    • Search: 修复布局错误的问题 9cd48e
    • Image: 修复图片加载错误时仍会渲染图片节点的问题 59fb1d
    • Pagination: 修复 change 事件触发时机错误的问题 346035
    • Toast: 修复展示时会锁定滚动的问题 a622ca
    • 包含 v2.10.10 版本的所有改动和修复

    v3.0.0-beta.3

    2020-10-03

    breaking changes

    • Checkbox: 在 Cell 内部使用时,现在需要手动添加 @click.stop 来阻止事件冒泡 #7023

    Feature

    • 新增 Badge 徽标组件 #6573
    • Tab: 增加滑动切换动画 #1174
    • 包含 v2.10.9 版本的所有改动和修复

    v3.0.0-beta.2

    2020-09-28

    Bug Fixes

    • 修复引入 Vant 时提示 'global is not defined' 的问题 7007fc

    v3.0.0-beta.1

    2020-09-28

    breaking changes

    • DatetimePicker: change 事件的第一个参数调整为当前选中值 058665

    refactor

    使用 Composition API 重构以下组件:

    Feature

    • Locale: 新增德语语言包 #7245
    • Pagination: 新增多个插槽 #7222

    Bug Fixes

    • Picker: 修复 setIndex 方法无效的问题 d2a542
    • Dialog: 修复最小高度错误的问题 bf1f0f
    • 包含 v2.10.8 版本的所有改动和修复

    v3.0.0-beta.0

    2020-09-18

    breaking changes

    • Dialog: allow-html 属性的默认值调整为 false 02c7a7
    • Picker: allow-html 属性的默认值调整为 false 02c7a7

    refactor

    使用 Composition API 重构以下组件:

    Bug Fixes

    • AddressEdit: 修复 emits 未声明导致 warning 的问题 1e6a12
    • AddressEdit: 修复点击省市区弹窗的蒙层时无法关闭的问题 02e89a
    • Field: 修复在 iOS 上中文输入过程中触发 input 事件的问题 #7035
    • 包含 v2.10.7 版本的所有改动和修复

    v3.0.0-alpha.5

    2020-09-13

    breaking changes

    • Button: native-type 属性的默认值调整为 button df8059

    refactor

    使用 Composition API 重构以下组件:

    Feature

    • Button: 新增 icon-position 属性 #7174
    • slider: 新增 range 属性,支持范围选择 #7175
    • TabbarItem: 新增 @tabbar-item-active-background-color 变量 #7162

    Bug Fixes

    • Sticky: 修复组件销毁时报错的问题 #7169

    v3.0.0-alpha.4

    2020-09-06

    breaking changes

    • Dialog: before-close 属性用法调整,不再传入 done 函数,而是通过返回 Promise 来控制
    • SwipeCell: before-close 属性不再传入组件实例
    • ImagePreview: 移除 async-close 属性,新增 before-close 属性

    refactor

    使用 Composition API 重构以下组件:

    Bug Fixes

    • Tag: 修复 color 属性不生效的问题 4b6da2
    • 修复在 TSX 中使用组件时提示类型错误的问题 #7076
    • 修复全量引入组件时提示类型错误的问题 #7056

    v3.0.0-alpha.3

    2020-09-01

    Feature

    • ActionSheet: 新增 description 插槽 

      升级步骤

      1. 升级 Vue 3

      Vant 3 是基于 Vue 3 开发的,在使用 Vant 3 前,请将项目中的 Vue 升级到 3.0 以上版本。

      2. 处理不兼容更新

      Vant 2 到 Vant 3 存在一些不兼容更新,请仔细阅读下方的不兼容更新内容,并依次处理。

      不兼容更新

      组件命名调整

      GoodsAction 商品导航组件重命名为 ActionBar 行动栏。

      <!-- Vant 2 --><van-goods-action>  <van-goods-action-icon text="图标" />  <van-goods-action-button text="按钮" /></van-goods-action><!-- Vant 3 --><van-action-bar>  <van-action-bar-icon text="图标" />  <van-action-bar-button text="按钮" /></van-action-bar>

      废弃组件

      移除 SwitchCell 组件,可以直接使用 Cell 和 Switch 组件代替。

      <!-- Vant 2 --><van-switch-cell title="标题" v-model="checked" /><!-- Vant 3 --><van-cell center title="标题">  <template #right-icon>    <van-switch v-model="checked" size="24" />  </template></van-cell>

      弹窗型组件 v-model 变更

      为了适配 Vue 3 的 v-model API 用法变更,所有提供 v-model 属性的组件在用法上有一定调整。以下弹窗类组件的 v-model 被重命名为 v-model:show:

      • ActionSheet
      • Calendar
      • Dialog
      • ImagePreview
      • Notify
      • Popover
      • Popup
      • ShareSheet
      <!-- Vant 2 --><van-popup v-model="show" /><!-- Vant 3 --><van-popup v-model:show="show" />

      表单型组件 v-model 内部值变更

      以下表单型组件 v-model 对应的 prop 重命名为 modelValue,event 重命名为 update:modelValue:

      • Checkbox
      • CheckboxGroup
      • DatetimePicker
      • DropdownItem
      • Field
      • Radio
      • RadioGroup
      • Search
      • Stepper
      • Switch
      • Sidebar
      • Uploader
      <!-- Vant 2 --><van-field :value="value" @input="onInput" /><!-- Vant 3 --><van-field :model-value="value" @update:model-value="onInput" />

      其他 v-model 调整

      • Circle: v-model 重命名为 v-model:currentRate
      • CouponList: v-model 重命名为 v-model:code
      • List: v-model 重命名为 v-model:loading,error.sync 重命名为 v-model:error
      • Tabs: v-model 重命名为 v-model:active
      • TreeSelect: active-id.sync 重命名为 v-model:active-id
      • TreeSelect: main-active-index.sync 重命名为 v-model:main-active-index

      徽标属性命名调整

      在之前的版本中,我们通过 info 属性来展示图标右上角的徽标信息,为了更符合社区的命名习惯,我们将这个属性重命名为 badge,影响以下组件:

      • Tab
      • Icon
      • GridItem
      • TreeSelect
      • TabbarItem
      • SidebarItem
      • GoodsActionIcon

      同时内部使用的 Info 组件也会重命名为 Badge。

      <!-- Vant 2 --><van-icon info="5" /><!-- Vant 3 --><van-icon badge="5" />

      重命名 get-container 属性

      Vue 3.0 中增加了 Teleport 组件,提供将组件渲染到任意 DOM 位置的能力,Vant 2 也通过 get-container 属性提供了类似的能力。为了与官方的 API 保持一致,Vant 中的 get-container 属性将重命名为 teleport。

      <!-- Vant 2 --><template>  <van-popup get-container="body" />  <van-popup :get-container="getContainer" /></template><script>  export default {    methods: {      getContainer() {        return document.querySelector('#container');      },    },  };</script><!-- Vant 3 --><template>  <van-popup teleport="body" />  <van-popup :teleport="container" /></template><script>  export default {    beforeCreate() {      this.container = document.querySelector('#container');    },  };</script>

      API 调整

      Area

      • change 事件参数不再传入组件实例

      Button

      • 蓝色按钮对应的类型由 info 调整为 primary
      • 绿色按钮对应的类型由 primary 调整为 success
      • native-type 的默认值由 submit 调整为 button

      Checkbox

      • 在 Cell 内部使用时,现在需要手动添加 @click.stop 来阻止事件冒泡

      Dialog

      • 默认关闭 allow-html 属性
      • before-close 属性用法调整,不再传入 done 函数,而是通过返回 Promise 来控制

      DatetimePicker

      • change 事件参数不再传入组件实例

      ImagePreview

      • 移除 async-close 属性,可以使用新增的 before-close 属性代替

      Picker

      • change 事件参数不再传入组件实例
      • 默认关闭 allow-html 属性
      • 默认开启 show-toolbar 属性
      • 级联选择下,confirm、change 事件返回的回调参数将包含为完整的选项对象。

      Popover

      • trigger 属性的默认值调整为 click

      Stepper

      • async-change 属性重命名为 before-change,并调整使用方法

      SwipeCell

      • open 事件的 detail 参数重命名为 name
      • on-close 属性重命名为 before-close,并调整参数结构
      • before-close 属性不再传入组件实例

      Toast

      • mask 属性重命名为 overlay

      TreeSelect

      • navclick 事件重命名为 click-nav
      • itemclick 事件重命名为 click-item

      注册全局方法

      Vant 2 中默认提供了 $toast、$dialog 等全局方法,但 Vue 3.0 不再支持直接在 Vue 的原型链上挂载方法,因此从 Vant 3.0 开始,使用全局方法前必须先通过 app.use 将组件注册到对应的 app 上。

      import { Toast, Dialog, Notify } from 'vant';// 将 Toast 等组件注册到 app 上app.use(Toast);app.use(Dialog);app.use(Notify);// app 内的子组件可以直接调用 $toast 等方法export default {  mounted() {    this.$toast('提示文案');  },};


      介绍

      感谢你使用 Vant。

      以下是关于向 Vant 提交反馈或代码的指南。在向 Vant 提交 issue 或者 PR 之前,请先花几分钟时间阅读以下文字。

      Issue 规范

      • 遇到问题时,请先确认这个问题是否已经在 issue 中有记录或者已被修复
      • 提 issue 时,请用简短的语言描述遇到的问题,并添加出现问题时的环境和复现步骤

      参与开发

      本地开发

      按照下面的步骤操作,即可在本地开发 Vant 组件。

      # 克隆仓库# 默认为 dev 分支,包含 Vant 3 的代码# 如果需要在 Vant 2 上进行更改,请基于 2.x 分支进行开发git clone git@github.com:youzan/vant.git# 安装依赖cd vant && yarn# 进入开发模式,浏览器访问 http://localhost:8080npm run dev

      目录结构

      项目的主要目录结构如下所示:

      vant├─ docs            # 文档├─ packages        # 基础包├─ src             # 组件源代码├─ test            # 单测工具类└─ vant.config.js  # 文档网站配置

      组件代码位于 src 目录下,每个组件一个独立的文件夹。

      组件目录结构

      添加新组件时,请按照下面的目录结构组织文件,并在 vant.config.js 中配置组件名称。

      src└─ button   ├─ demo             # 示例代码   ├─ test             # 单元测试   ├─ Component.ts     # 组件   ├─ index.ts         # 组件入口   ├─ index.less       # 样式   ├─ var.less         # 样式变量   ├─ README.md        # 英文文档   └─ README.zh-CN.md  # 中文文档

      提交 PR

      Pull Request 规范

      如果你是第一次在 GitHub 上提 Pull Request ,可以阅读下面这两篇文章来学习:

      规范

      • 如果遇到问题,建议保持你的 PR 足够小。保证一个 PR 只解决一个问题或只添加一个功能
      • 当新增组件或者修改原有组件时,记得增加或者修改测试代码,保证代码的稳定
      • 在 PR 中请添加合适的描述,并关联相关的 Issue

      Pull Request 流程

      1. fork 主仓库,如果已经 fork 过,请同步主仓库的最新代码
      2. 基于 fork 后仓库的 dev 分支新建一个分支,比如 feature/button_color
      3. 在新分支上进行开发,开发完成后,提 Pull Request 到主仓库的 dev 分支
      4. Pull Request 会在 Review 通过后被合并到主仓库
      5. 等待 Vant 发布版本,一般是每周一次

      同步最新代码

      提 Pull Request 前,请依照下面的流程同步主仓库的最新代码:

      # 添加主仓库到 remote,作为 fork 后仓库的上游仓库git remote add upstream https://github.com/youzan/vant.git# 拉取主仓库最新代码git fetch upstream# 切换至 dev 分支git checkout dev# 合并主仓库代码git merge upstream/dev


      介绍

      Vant 是基于有赞 Zan Design System 视觉规范实现的组件库,在这里可以下载 Vant 的设计资源。

      设计稿

      组件设计稿(Sketch)

      包含 Sketch 格式的色彩规范、字体规范、组件设计规范。

      色彩规范

      字体规范

      组件规范

      下载

      图标设计稿(Sketch)

      包含 Sketch 格式的图标库资源。

      下载

      在线资源

      Vant 的所有图标都托管在 iconfont.cn 上,点此查看:Vant 图标库

      Axure 元件库

      Axure 元件库,由社区的 @axure-tczy 同学贡献。

      下载


      介绍

      在参与 Vant 开发时,请遵守约定的单文件组件风格指南,指南内容节选自 Vue 官方风格指南

      组件数据

      组件的 data 必须是一个函数。

      // badexport default {  data: {    foo: 'bar',  },};// goodexport default {  data() {    return {      foo: 'bar',    };  },};

      单文件组件文件名称

      单文件组件的文件名应该要么始终是单词大写开头 (PascalCase),要么始终是横线连接 (kebab-case)。

      // badmycomponent.vuemyComponent.vue// goodmy-component.vueMyComponent.vue

      紧密耦合的组件名

      和父组件紧密耦合的子组件应该以父组件名作为前缀命名。

      // badcomponents/|- TodoList.vue|- TodoItem.vue└─ TodoButton.vue// goodcomponents/|- TodoList.vue|- TodoListItem.vue└─ TodoListItemButton.vue

      自闭合组件

      在单文件组件中没有内容的组件应该是自闭合的。

      <!-- bad --><my-component></my-component><!-- good --><my-component />

      Prop 名大小写

      在声明 prop 的时候,其命名应该始终使用 camelCase,而在模板中应该始终使用 kebab-case。

      // badexport default {  props: {    'greeting-text': String,  },};// goodexport default {  props: {    greetingText: String,  },};
      <!-- bad --><welcome-message greetingText="hi" /><!-- good --><welcome-message greeting-text="hi" />

      指令缩写

      指令缩写,用 : 表示 v-bind: ,用 @ 表示 v-on:

      <!-- bad --><input v-bind:value="value" v-on:input="onInput" /><!-- good --><input :value="value" @input="onInput" />

      Props 顺序

      标签的 Props 应该有统一的顺序,依次为指令、属性和事件。

      <my-component  v-if="if"  v-show="show"  v-model="value"  ref="ref"  :key="key"  :text="text"  @input="onInput"  @change="onChange"/>

      组件选项的顺序

      组件选项应该有统一的顺序。

      export default {  name: '',  components: {},  props: {},  emits: [],  setup() {},  data() {},  computed: {},  watch: {},  created() {},  mounted() {},  unmounted() {},  methods: {},};

      组件选项中的空行

      组件选项较多时,建议在属性之间添加空行。

      export default {  computed: {    formattedValue() {      // ...    },    styles() {      // ...    },  },  methods: {    onInput() {      // ...    },    onChange() {      // ...    },  },};

      单文件组件顶级标签的顺序

      单文件组件应该总是让顶级标签的顺序保持一致,且标签之间留有空行。

      <template> ... </template><script>  /* ... */</script><style>  /* ... */</style>


      介绍

      Vant 采用中文作为默认语言,同时支持多语言切换,请按照下方教程进行国际化设置。

      使用方法

      多语言切换

      Vant 通过 Locale 组件实现多语言支持,使用 Locale.use 方法可以切换当前使用的语言。

      import { Locale } from 'vant';// 引入英文语言包import enUS from 'vant/es/locale/lang/en-US';Locale.use('en-US', enUS);

      覆盖语言包

      通过 Locale.add 方法可以实现文案的修改和扩展,示例如下:

      import { Locale } from 'vant';const messages = {  'zh-CN': {    vanPicker: {      confirm: '关闭', // 将'确认'修改为'关闭'    },  },};Locale.add(messages);

      语言包

      目前支持的语言:

      语言文件名
      简体中文zh-CN
      繁體中文(港)zh-HK
      繁體中文(台)zh-TW
      德语de-DE
      德语 (正式)de-DE-formal
      英语en-US
      西班牙语es-ES
      日语ja-JP
      挪威语nb-NO
      罗马尼亚语ro-RO
      俄罗斯语ru-RU
      土耳其语tr-TR
      泰语th-TH
      法语fr-FR
      在 这里 查看所有的语言包源文件。

      常见问题

      找不到所需的语言包?

      如果上方列表中没有你需要的语言,欢迎给我们提 Pull Request 来增加新的语言包,改动内容可以参考增加德语语言包 的 PR。

      业务代码如何实现国际化?

      可以使用 vue-i18n 来实现。

      以 CDN 形式引入时,如何使用语言包?

      目前没有提供 CDN 形式的语言包,可以手动拷贝语言包的内容来使用。

      语言包中不包含 Sku 组件?

      语言包中默认不包含 Sku 业务组件的语言配置,因此如果有 Sku 组件的国际化需求,请自行配置国际化文案。


      介绍

      按钮用于触发一个操作,如提交表单。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Button } from 'vant';const app = createApp();app.use(Button);

      代码演示

      按钮类型

      按钮支持 default、primary、success、warning、danger 五种类型,默认为 default。

      五种按钮类型

      <van-button type="primary">主要按钮</van-button><van-button type="success">成功按钮</van-button><van-button type="default">默认按钮</van-button><van-button type="warning">警告按钮</van-button><van-button type="danger">危险按钮</van-button>

      朴素按钮

      通过 plain 属性将按钮设置为朴素按钮,朴素按钮的文字为按钮颜色,背景为白色。

      朴素按钮

      <van-button plain type="primary">朴素按钮</van-button><van-button plain type="primary">朴素按钮</van-button>

      细边框

      设置 hairline 属性可以展示 0.5px 的细边框。

      细边框按钮

      <van-button plain hairline type="primary">细边框按钮</van-button><van-button plain hairline type="primary">细边框按钮</van-button>

      禁用状态

      通过 disabled 属性来禁用按钮,禁用状态下按钮不可点击。

      禁用状态

      <van-button disabled type="primary">禁用状态</van-button><van-button disabled type="primary">禁用状态</van-button>

      加载状态

      通过 loading 属性设置按钮为加载状态,加载状态下默认会隐藏按钮文字,可以通过 loading-text 设置加载状态下的文字。

      加载状态

      <van-button loading type="primary" /><van-button loading type="primary" loading-type="spinner" /><van-button loading type="primary" loading-text="加载中..." />

      按钮形状

      通过 square 设置方形按钮,通过 round 设置圆形按钮。

      按钮形状

      <van-button square type="primary">方形按钮</van-button><van-button round type="primary">圆形按钮</van-button>

      图标按钮

      通过 icon 属性设置按钮图标,支持 Icon 组件里的所有图标,也可以传入图标 URL。

      图标按钮

      <van-button icon="plus" type="primary" /><van-button icon="plus" type="primary">按钮</van-button><van-button icon="https://img.yzcdn.cn/vant/user-active.png" type="primary">  按钮</van-button>

      按钮尺寸

      支持 large、normal、small、mini 四种尺寸,默认为 normal。

      按钮尺寸

      <van-button type="primary" size="large">大号按钮</van-button><van-button type="primary" size="normal">普通按钮</van-button><van-button type="primary" size="small">小型按钮</van-button><van-button type="primary" size="mini">迷你按钮</van-button>

      块级元素

      按钮在默认情况下为行内块级元素,通过 block 属性可以将按钮的元素类型设置为块级元素。

      块级元素

      <van-button type="primary" block>块级元素</van-button>

      页面导航

      可以通过 url 属性进行 URL 跳转,或通过 to 属性进行路由跳转。

      页面导航

      <van-button type="primary" url="/vant/mobile.html">URL 跳转</van-button><van-button type="primary" to="index">路由跳转</van-button>

      自定义颜色

      通过 color 属性可以自定义按钮的颜色。

      自定义颜色

      <van-button color="#7232dd">单色按钮</van-button><van-button color="#7232dd" plain>单色按钮</van-button><van-button color="linear-gradient(to right, #ff6034, #ee0a24)">  渐变色按钮</van-button>

      API

      Props

      参数说明类型默认值
      type类型,可选值为 primary success warning dangerstringdefault
      size尺寸,可选值为 large small ministringnormal
      text按钮文字string-
      color按钮颜色,支持传入 linear-gradient 渐变色string-
      icon左侧图标名称或图片链接string-
      icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
      icon-position图标展示位置,可选值为 rightstringleft
      tag按钮根节点的 HTML 标签stringbutton
      native-type原生 button 标签的 type 属性stringbutton
      block是否为块级元素booleanfalse
      plain是否为朴素按钮booleanfalse
      square是否为方形按钮booleanfalse
      round是否为圆形按钮booleanfalse
      disabled是否禁用按钮booleanfalse
      hairline是否使用 0.5px 边框booleanfalse
      loading是否显示为加载状态booleanfalse
      loading-text加载状态提示文字string-
      loading-type加载图标类型,可选值为 spinnerstringcircular
      loading-size加载图标大小string20px
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse

      Events

      事件名说明回调参数
      click点击按钮,且按钮状态不为加载或禁用时触发event: MouseEvent
      touchstart开始触摸按钮时触发event: TouchEvent

      Slots

      名称说明
      default按钮内容
      icon v3.0.18自定义图标
      loading自定义加载图标

      主题定制

      样式变量

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

      名称默认值描述
      --van-button-mini-height24px-
      --van-button-mini-padding0 var(--van-padding-base)-
      --van-button-mini-font-sizevar(--van-font-size-xs)-
      --van-button-small-height32px-
      --van-button-small-padding0 var(--van-padding-xs)-
      --van-button-small-font-sizevar(--van-font-size-sm)-
      --van-button-normal-font-sizevar(--van-font-size-md)-
      --van-button-normal-padding0 15px-
      --van-button-large-height50px-
      --van-button-default-height44px-
      --van-button-default-line-height1.2-
      --van-button-default-font-sizevar(--van-font-size-lg)-
      --van-button-default-colorvar(--van-text-color)-
      --van-button-default-background-colorvar(--van-white)-
      --van-button-default-border-colorvar(--van-border-color)-
      --van-button-primary-colorvar(--van-white)-
      --van-button-primary-background-colorvar(--van-primary-color)-
      --van-button-primary-border-colorvar(--van-primary-color)-
      --van-button-success-colorvar(--van-white)-
      --van-button-success-background-colorvar(--van-success-color)-
      --van-button-success-border-colorvar(--van-success-color)-
      --van-button-danger-colorvar(--van-white)-
      --van-button-danger-background-colorvar(--van-danger-color)-
      --van-button-danger-border-colorvar(--van-danger-color)-
      --van-button-warning-colorvar(--van-white)-
      --van-button-warning-background-colorvar(--van-orange)-
      --van-button-warning-border-colorvar(--van-orange)-
      --van-button-border-widthvar(--van-border-width-base)-
      --van-button-border-radiusvar(--van-border-radius-sm)-
      --van-button-round-border-radiusvar(--van-border-radius-max)-
      --van-button-plain-background-colorvar(--van-white)-
      --van-button-disabled-opacityvar(--van-disabled-opacity)-
      --van-button-icon-size1.2em-
      --van-button-loading-icon-size20px-



      介绍

      单元格为列表中的单个展示项。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Cell, CellGroup } from 'vant';const app = createApp();app.use(Cell);app.use(CellGroup);

      代码演示

      基础用法

      Cell 可以单独使用,也可以与 CellGroup 搭配使用,CellGroup 可以为 Cell 提供上下外边框。

      基础用法

      <van-cell-group>  <van-cell title="单元格" value="内容" />  <van-cell title="单元格" value="内容" label="描述信息" /></van-cell-group>

      卡片风格

      通过 CellGroup 的 inset 属性,可以将单元格转换为圆角卡片风格(从 3.1.0 版本开始支持)。

      卡片风格

      <van-cell-group inset>  <van-cell title="单元格" value="内容" />  <van-cell title="单元格" value="内容" label="描述信息" /></van-cell-group>

      单元格大小

      通过 size 属性可以控制单元格的大小。

      单元格大小

      <van-cell title="单元格" value="内容" size="large" /><van-cell title="单元格" value="内容" size="large" label="描述信息" />

      展示图标

      通过 icon 属性在标题左侧展示图标。

      展示图标

      <van-cell title="单元格" icon="location-o" />

      只设置 value

      只设置 value 时,内容会靠左对齐。

      只设置value

      <van-cell value="内容" />

      展示箭头

      设置 is-link 属性后会在单元格右侧显示箭头,并且可以通过 arrow-direction 属性控制箭头方向。

      展示箭头

      <van-cell title="单元格" is-link /><van-cell title="单元格" is-link value="内容" /><van-cell title="单元格" is-link arrow-direction="down" value="内容" />

      页面导航

      可以通过 url 属性进行 URL 跳转,或通过 to 属性进行路由跳转。

      页面导航

      <van-cell title="URL 跳转" is-link url="/vant/mobile.html" /><van-cell title="路由跳转" is-link to="index" />

      分组标题

      通过 CellGroup 的 title 属性可以指定分组标题。

      分组标题

      <van-cell-group title="分组1">  <van-cell title="单元格" value="内容" /></van-cell-group><van-cell-group title="分组2">  <van-cell title="单元格" value="内容" /></van-cell-group>

      使用插槽

      如以上用法不能满足你的需求,可以使用插槽来自定义内容。

      使用插槽

      <van-cell value="内容" is-link>  <!-- 使用 title 插槽来自定义标题 -->  <template #title>    <span class="custom-title">单元格</span>    <van-tag type="danger">标签</van-tag>  </template></van-cell><van-cell title="单元格" icon="shop-o">  <!-- 使用 right-icon 插槽来自定义右侧图标 -->  <template #right-icon>    <van-icon name="search" class="search-icon" />  </template></van-cell><style>  .custom-title {    margin-right: 4px;    vertical-align: middle;  }  .search-icon {    font-size: 16px;    line-height: inherit;  }</style>

      垂直居中

      通过 center 属性可以让 Cell 的左右内容都垂直居中。

      垂直居中

      <van-cell center title="单元格" value="内容" label="描述信息" />

      API

      CellGroup Props

      参数说明类型默认值
      title分组标题string-
      inset v3.1.0是否展示为圆角卡片风格booleanfalse
      border是否显示外边框booleantrue

      Cell Props

      参数说明类型默认值
      title左侧标题number | string-
      value右侧内容number | string-
      label标题下方的描述信息string-
      size单元格大小,可选值为 largestring-
      icon左侧图标名称或图片链接string-
      icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
      border是否显示内边框booleantrue
      replace是否在跳转时替换当前页面历史booleanfalse
      clickable是否开启点击反馈booleannull
      is-link是否展示右侧箭头并开启点击反馈booleanfalse
      required是否显示表单必填星号booleanfalse
      center是否使内容垂直居中booleanfalse
      arrow-direction箭头方向,可选值为 left up downstringright
      title-style左侧标题额外样式string | Array | object-
      title-class左侧标题额外类名string | Array | object-
      value-class右侧内容额外类名string | Array | object-
      label-class描述信息额外类名string | Array | object-

      Cell Events

      事件名说明回调参数
      click点击单元格时触发event: MouseEvent

      CellGroup Slots

      名称说明
      default默认插槽
      title自定义分组标题

      Cell Slots

      名称说明
      title自定义左侧标题
      value v3.1.1自定义右侧内容
      label自定义标题下方的描述信息
      icon自定义左侧图标
      right-icon自定义右侧图标
      extra自定义单元格最右侧的额外内容

      主题定制

      样式变量

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

      名称默认值描述
      --van-cell-font-sizevar(--van-font-size-md)-
      --van-cell-line-height24px-
      --van-cell-vertical-padding10px-
      --van-cell-horizontal-paddingvar(--van-padding-md)-
      --van-cell-text-colorvar(--van-text-color)-
      --van-cell-background-colorvar(--van-white)-
      --van-cell-border-colorvar(--van-border-color)-
      --van-cell-active-colorvar(--van-active-color)-
      --van-cell-required-colorvar(--van-danger-color)-
      --van-cell-label-colorvar(--van-gray-6)-
      --van-cell-label-font-sizevar(--van-font-size-sm)-
      --van-cell-label-line-heightvar(--van-line-height-sm)-
      --van-cell-label-margin-topvar(--van-padding-base)-
      --van-cell-value-colorvar(--van-gray-6)-
      --van-cell-icon-size16px-
      --van-cell-right-icon-colorvar(--van-gray-6)-
      --van-cell-large-vertical-paddingvar(--van-padding-sm)-
      --van-cell-large-title-font-sizevar(--van-font-size-lg)-
      --van-cell-large-label-font-sizevar(--van-font-size-md)-
      --van-cell-group-background-colorvar(--van-white)-
      --van-cell-group-title-colorvar(--van-gray-6)-
      --van-cell-group-title-paddingvar(--van-padding-md) var(--van-padding-md) var(--van-padding-xs)-
      --van-cell-group-title-font-sizevar(--van-font-size-md)-
      --van-cell-group-title-line-height16px-
      --van-cell-group-inset-padding0 var(--van-padding-md)-
      --van-cell-group-inset-border-radiusvar(--van-border-radius-lg)-
      --van-cell-group-inset-title-paddingvar(--van-padding-md) var(--van-padding-md) var(--van-padding-xs) var(--van-padding-xl)-


      介绍

      用于配置 Vant 组件的主题样式,从 3.1.0 版本开始支持。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ConfigProvider } from 'vant';const app = createApp();app.use(ConfigProvider);

      定制主题

      介绍

      Vant 组件通过丰富的 CSS 变量 来组织样式,通过覆盖这些 CSS 变量,可以实现定制主题、动态切换主题等效果。

      ConfigProvider

      示例

      以 Button 组件为例,查看组件的样式,可以看到 .van-button--primary 类名上存在以下变量:

      .van-button--primary {  color: var(--van-button-primary-color);  background-color: var(--van-button-primary-background-color);}

      这些变量的默认值被定义在 root 节点上,HTML 文档的任何节点都可以访问到这些变量:

      :root {  --van-white: #fff;  --van-blue: #1989fa;  --van-button-primary-color: var(--van-white);  --van-button-primary-background-color: var(--van-primary-color);}

      自定义 CSS 变量

      通过 CSS 覆盖

      你可以直接在代码中覆盖这些 CSS 变量,Button 组件的样式会随之发生改变:

      /* 添加这段样式后,Primary Button 会变成红色 */:root {  --van-button-primary-background-color: red;}

      通过 ConfigProvider 覆盖

      ConfigProvider 组件提供了覆盖 CSS 变量的能力,你需要在根节点包裹一个 ConfigProvider 组件,并通过 theme-vars 属性来配置一些主题变量。

      <van-config-provider :theme-vars="themeVars">  <van-form>    <van-field name="rate" label="评分">      <template #input>        <van-rate v-model="rate" />      </template>    </van-field>    <van-field name="slider" label="滑块">      <template #input>        <van-slider v-model="slider" />      </template>    </van-field>    <div style="margin: 16px">      <van-button round block type="primary" native-type="submit">        提交      </van-button>    </div>  </van-form></van-config-provider>
      import { ref } from 'vue';export default {  setup() {    const rate = ref(4);    const slider = ref(50);    // themeVars 内的值会被转换成对应 CSS 变量    // 比如 sliderBarHeight 会转换成 `--van-slider-bar-height`    const themeVars = {      rateIconFullColor: '#07c160',      sliderBarHeight: '4px',      sliderButtonWidth: '20px',      sliderButtonHeight: '20px',      sliderActiveBackgroundColor: '#07c160',      buttonPrimaryBorderColor: '#07c160',      buttonPrimaryBackgroundColor: '#07c160',    };    return {      rate,      slider,      themeVars,    };  },};
      注意:ConfigProvider 仅影响它的子组件的样式,不影响全局 root 节点。

      基础变量

      Vant 中的 CSS 变量分为 基础变量 和 组件变量。组件变量会继承基础变量,因此在修改基础变量后,会影响所有相关的组件。

      修改变量

      由于 CSS 变量继承机制的原因, 两者的修改方式有一定差异:

      • 基础变量只能通过 root 选择器 修改,不能通过 ConfigProvider 组件 修改。
      • 组件变量可以通过 root 选择器 和 ConfigProvider 组件 修改。

      变量列表

      下面是所有的基础变量:

      // Color Palette--van-black: #000;--van-white: #fff;--van-gray-1: #f7f8fa;--van-gray-2: #f2f3f5;--van-gray-3: #ebedf0;--van-gray-4: #dcdee0;--van-gray-5: #c8c9cc;--van-gray-6: #969799;--van-gray-7: #646566;--van-gray-8: #323233;--van-red: #ee0a24;--van-blue: #1989fa;--van-orange: #ff976a;--van-orange-dark: #ed6a0c;--van-orange-light: #fffbe8;--van-green: #07c160;// Gradient Colors--van-gradient-red: linear-gradient(to right, #ff6034, #ee0a24);--van-gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);// Component Colors--van-primary-color: var(--van-blue);--van-success-color: var(--van-green);--van-danger-color: var(--van-red);--van-warning-color: var(--van-orange);--van-text-color: var(--van-gray-8);--van-active-color: var(--van-gray-2);--van-active-opacity: 0.7;--van-disabled-opacity: 0.5;--van-background-color: var(--van-gray-1);--van-background-color-light: #fafafa;--van-text-link-color: #576b95;// Padding--van-padding-base: 4px;--van-padding-xs: 8px;--van-padding-sm: 12px;--van-padding-md: 16px;--van-padding-lg: 24px;--van-padding-xl: 32px;// Font--van-font-size-xs: 10px;--van-font-size-sm: 12px;--van-font-size-md: 14px;--van-font-size-lg: 16px;--van-font-weight-bold: 500;--van-line-height-xs: 14px;--van-line-height-sm: 18px;--van-line-height-md: 20px;--van-line-height-lg: 22px;--van-base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue',  Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB',  'Microsoft Yahei', sans-serif;--van-price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue,  Arial, sans-serif;// Animation--van-animation-duration-base: 0.3s;--van-animation-duration-fast: 0.2s;--van-animation-timing-function-enter: ease-out;--van-animation-timing-function-leave: ease-in;// Border--van-border-color: var(--van-gray-3);--van-border-width-base: 1px;--van-border-radius-sm: 2px;--van-border-radius-md: 4px;--van-border-radius-lg: 8px;--van-border-radius-max: 999px;

      你可以在各个组件文档底部的表格中查看组件变量。

      API

      Props

      参数说明类型默认值
      theme-vars自定义主题变量object-
      tag v3.1.2根节点对应的 HTML 标签名stringdiv
      icon-prefix v3.1.3所有图标的类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon


      介绍

      基于字体的图标集,可以通过 Icon 组件使用,也可以在其他组件中通过 icon 属性引用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Icon } from 'vant';const app = createApp();app.use(Icon);

      代码演示

      基础用法

      通过 name 属性来指定需要使用的图标,Vant 内置了一套图标库(见右侧示例),可以直接传入对应的名称来使用。

      基础使用

      <van-icon name="chat-o" />

      使用图片 URL

      你也可以直接在 name 属性中传入一个图片 URL 来作为图标。

      <van-icon name="https://b.yzcdn.cn/vant/icon-demo-1126.png" />

      徽标提示

      设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

      徽标提示

      <van-icon name="chat-o" dot /><van-icon name="chat-o" badge="9" /><van-icon name="chat-o" badge="99+" />

      图标颜色

      通过 color 属性来设置图标的颜色。

      图标颜色

      <van-icon name="cart-o" color="#1989fa" /><van-icon name="fire-o" color="#ee0a24" />

      图标大小

      通过 size 属性来设置图标的尺寸大小,可以指定任意 CSS 单位。

      图标大小

      <!-- 不指定单位,默认使用 px --><van-icon name="chat-o" size="40" /><!-- 指定使用 rem 单位 --><van-icon name="chat-o" size="3rem" />

      自定义图标

      如果需要在现有 Icon 的基础上使用更多图标,可以引入第三方 iconfont 对应的字体文件和 CSS 文件,之后就可以在 Icon 组件中直接使用。

      /* 引入第三方或自定义的字体图标样式 */@font-face {  font-family: 'my-icon';  src: url('./my-icon.ttf') format('truetype');}.my-icon {  font-family: 'my-icon';}.my-icon-extra::before {  content: 'e626';}
      <!-- 通过 class-prefix 指定类名为 my-icon --><van-icon class-prefix="my-icon" name="extra" />

       https://vant-contrib.gitee.io/vant/v3/mobile.html#/zh-CN/icon有vant的默认自带的图标可供选用!

      API

      Props

      参数说明类型默认值
      name图标名称或图片链接string-
      dot是否显示图标右上角小红点booleanfalse
      badge图标右上角徽标的内容number | string-
      color图标颜色stringinherit
      size图标大小,如 20px 2em,默认单位为 pxnumber | stringinherit
      class-prefix类名前缀,用于使用自定义图标stringvan-icon
      tag根节点对应的 HTML 标签名stringi

      Events

      事件名说明回调参数
      click点击图标时触发event: MouseEvent


      介绍

      增强版的 img 标签,提供多种图片填充模式,支持图片懒加载、加载中提示、加载失败提示。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Image as VanImage } from 'vant';const app = createApp();app.use(VanImage);

      代码演示

      基础用法

      基础用法与原生 img 标签一致,可以设置 src、width、height、alt 等原生属性。

      基础用法

      <van-image width="100" height="100" src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  />

      填充模式

      通过 fit 属性可以设置图片填充模式,可选值见下方表格。

      填充模式

      <van-image  width="10rem"  height="10rem"  fit="contain"  src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" />

      圆形图片

      通过 round 属性可以设置图片变圆,注意当图片宽高不相等且 fit 为 contain 或 scale-down 时,将无法填充一个完整的圆形。

      圆形图片

      <van-image  round  width="10rem"  height="10rem"  src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" />

      图片懒加载

      设置 lazy-load 属性来开启图片懒加载,需要搭配 Lazyload 组件使用。

      <van-image  width="100"  height="100"  lazy-load  src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" />
      import { createApp } from 'vue';import { Lazyload } from 'vant';const app = createApp();app.use(Lazyload);

      加载中提示

      Image 组件提供了默认的加载中提示,支持通过 loading 插槽自定义内容。

      加载中提示

      <van-image src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >  <template v-slot:loading>    <van-loading type="spinner" size="20" />  </template></van-image>

      加载失败提示

      Image 组件提供了默认的加载失败提示,支持通过 error 插槽自定义内容。

      加载失败提示

      <van-image src="https://img.yzcdn.cn/vant/cat.jpeg" rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >  <template v-slot:error>加载失败</template></van-image>

      API

      Props

      参数说明类型默认值
      src图片链接string-
      fit图片填充模式stringfill
      alt替代文本string-
      width宽度,默认单位为 pxnumber | string-
      height高度,默认单位为 pxnumber | string-
      radius圆角大小,默认单位为 pxnumber | string0
      round是否显示为圆形booleanfalse
      lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
      show-error是否展示图片加载失败提示booleantrue
      show-loading是否展示图片加载中提示booleantrue
      error-icon失败时提示的图标名称或图片链接stringphoto-fail
      loading-icon加载时提示的图标名称或图片链接stringphoto
      icon-size v3.0.11加载图标和失败图标的大小number | string32px
      icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon

      图片填充模式

      名称含义
      contain保持宽高缩放图片,使图片的长边能完全显示出来
      cover保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边
      fill拉伸图片,使图片填满元素
      none保持图片原有尺寸
      scale-down取 none 或 contain 中较小的一个

      Events

      事件名说明回调参数
      click点击图片时触发event: MouseEvent
      load图片加载完毕时触发-
      error图片加载失败时触发-

      Slots

      名称说明
      default自定义图片下方的内容
      loading自定义加载中的提示内容
      error自定义加载失败时的提示内容

      主题定制

      样式变量

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

      名称默认值描述
      --van-image-placeholder-text-colorvar(--van-gray-6)-
      --van-image-placeholder-font-sizevar(--van-font-size-md)-
      --van-image-placeholder-background-colorvar(--van-background-color)-
      --van-image-loading-icon-size32px-
      --van-image-loading-icon-colorvar(--van-gray-4)-
      --van-image-error-icon-size32px-
      --van-image-error-icon-colorvar(--van-gray-4)-

      常见问题

      如何引用本地图片?

      在 .vue 文件中通过相对路径引用本地图片时,需要在图片的链接外包上一层 require(),将图片 URL 转换为 webpack 模块请求,并结合 file-loader 或者 url-loader 进行处理。

      <!-- 错误写法 --><van-image src="./image.png" /><!-- 正确写法 --><van-image :src="require('./image.png')" />    
      对此更详细的解释可以参考 vue-loader 的处理资源路径章节。

      使用 image 标签无法渲染?

      使用 Image 组件时,可能会遇到将 <image> 作为标签名时无法渲染的问题,比如下面的写法:

      <template>  <image src="xxx" /></template><script>import { Image } from 'vant';export default {  components: {    Image,  },};<script>

      这是因为 <image> 标签是原生的 SVG 标签,Vue 不允许将原生标签名注册为组件名,使用 <van-image> 即可规避这个问题。


      介绍

      Layout 提供了 van-row 和 van-col 两个组件来进行行列布局。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Col, Row } from 'vant';const app = createApp();app.use(Col);app.use(Row);

      代码演示

      基础用法

      Layout 组件提供了 24列栅格,通过在 Col 上添加 span 属性设置列所占的宽度百分比。此外,添加 offset 属性可以设置列的偏移宽度,计算方式与 span 相同。

      基础用法

      <van-row>  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col></van-row><van-row>  <van-col span="4">span: 4</van-col>  <van-col span="10" offset="4">offset: 4, span: 10</van-col></van-row><van-row>  <van-col offset="12" span="12">offset: 12, span: 12</van-col></van-row>

      设置列元素间距

      通过 gutter 属性可以设置列元素之间的间距,默认间距为 0。

      设置列元素间距

      <van-row gutter="20">  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col>  <van-col span="8">span: 8</van-col></van-row>

      对齐方式

      通过 justify 属性可以设置主轴上内容的对齐方式,等价于 flex 布局中的 justify-content 属性。

      对其方式

      <!-- 居中 --><van-row justify="center">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row><!-- 右对齐 --><van-row justify="end">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row><!-- 两端对齐 --><van-row justify="space-between">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row><!-- 每个元素的两侧间隔相等 --><van-row justify="space-around">  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col>  <van-col span="6">span: 6</van-col></van-row>

      API

      Row Props

      参数说明类型默认值
      gutter列元素之间的间距(单位为 px)number | string-
      tag自定义元素标签stringdiv
      justify主轴对齐方式,可选值为 end center
      space-around space-between
      stringstart
      align交叉轴对齐方式,可选值为 center bottomstringtop
      wrap v3.0.11是否自动换行booleantrue

      Col Props

      参数说明类型默认值
      span列元素宽度number | string-
      offset列元素偏移距离number | string-
      tag自定义元素标签stringdiv

      Row Events

      事件名说明回调参数
      click点击时触发event: MouseEvent

      Col Events

      事件名说明回调参数
      click点击时触发event: MouseEvent


      介绍

      弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Popup } from 'vant';const app = createApp();app.use(Popup);

      代码演示

      基础用法

      通过 v-model:show 控制弹出层是否展示。

      基础用法

      <van-cell is-link @click="showPopup">展示弹出层</van-cell><van-popup v-model:show="show">内容</van-popup>
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const showPopup = () => {      show.value = true;    };    return {      show,      showPopup,    };  },};

      弹出位置

      通过 position 属性设置弹出位置,默认居中弹出,可以设置为 top、bottom、left、right。

      弹出位置

      <van-popup v-model:show="show" position="top" :style="{ height: '30%' }" />

      关闭图标

      设置 closeable 属性后,会在弹出层的右上角显示关闭图标,并且可以通过 close-icon 属性自定义图标,使用 close-icon-position 属性可以自定义图标位置。

      关闭图标

      <van-popup  v-model:show="show"  closeable  position="bottom"  :style="{ height: '30%' }"/><!-- 自定义图标 --><van-popup  v-model:show="show"  closeable  close-icon="close"  position="bottom"  :style="{ height: '30%' }"/><!-- 图标位置 --><van-popup  v-model:show="show"  closeable  close-icon-position="top-left"  position="bottom"  :style="{ height: '30%' }"/>

      圆角弹窗

      设置 round 属性后,弹窗会根据弹出位置添加不同的圆角样式。

      圆角弹窗

      <van-popup  v-model:show="show"  round  position="bottom"  :style="{ height: '30%' }"/>

      指定挂载位置

      弹出层默认挂载到组件标签所在位置,可以通过 teleport 属性指定挂载位置。

      指定挂载位置

      <!-- 挂载到 body 节点下 --><van-popup v-model:show="show" teleport="body" /><!-- 挂载到 #app 节点下 --><van-popup v-model:show="show" teleport="#app" /><!-- 挂载到指定的元素下 --><van-popup v-model:show="show" :teleport="myContainer" />
      export default {  setup() {    const myContainer = document.querySelector('.my-container');    return {      myContainer,    };  },};

      API

      Props

      参数说明类型默认值
      v-model:show是否显示弹出层booleanfalse
      overlay是否显示遮罩层booleantrue
      position弹出位置,可选值为 top bottom right leftstringcenter
      overlay-class自定义遮罩层类名string | Array | object-
      overlay-style自定义遮罩层样式object-
      duration动画时长,单位秒number | string0.3
      round是否显示圆角booleanfalse
      lock-scroll是否锁定背景滚动booleantrue
      lazy-render是否在显示弹层时才渲染节点booleantrue
      close-on-popstate是否在页面回退时自动关闭booleanfalse
      close-on-click-overlay是否在点击遮罩层后关闭booleantrue
      closeable是否显示关闭图标booleanfalse
      close-icon关闭图标名称或图片链接stringcross
      close-icon-position关闭图标位置,可选值为 top-left
      bottom-left bottom-right
      stringtop-right
      before-close v3.1.4关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-
      icon-prefix v3.0.18图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
      transition动画类名,等价于 transition 的 name 属性string-
      transition-appear是否在初始渲染时启用过渡动画booleanfalse
      teleport指定挂载的节点string | Element-
      safe-area-inset-bottom是否开启底部安全区适配booleanfalse

      Events

      事件名说明回调参数
      click点击弹出层时触发event: MouseEvent
      click-overlay点击遮罩层时触发event: MouseEvent
      click-close-icon点击关闭图标时触发event: MouseEvent
      open打开弹出层时触发-
      close关闭弹出层时触发-
      opened打开弹出层且动画结束后触发-
      closed关闭弹出层且动画结束后触发-

      Slots

      名称说明
      default弹窗内容
      overlay-content v3.0.18遮罩层的内容

      主题定制

      样式变量

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

      名称默认值描述
      --van-popup-background-colorvar(--van-white)-
      --van-popup-transitiontransform var(--van-animation-duration-base)-
      --van-popup-round-border-radius16px-
      --van-popup-close-icon-size22px-
      --van-popup-close-icon-colorvar(--van-gray-5)-
      --van-popup-close-icon-active-colorvar(--van-gray-6)-
      --van-popup-close-icon-margin16px-
      --van-popup-close-icon-z-index1-


      介绍

      Vant 中默认包含了一些常用样式,可以直接通过 className 的方式使用。

      实例演示

      文字省略

      当文本内容长度超过容器最大宽度时,自动省略多余的文本。

      <!-- 最多显示一行 --><div class="van-ellipsis">这是一段最多显示一行的文字,多余的内容会被省略</div><!-- 最多显示两行 --><div class="van-multi-ellipsis--l2">  这是一段最多显示两行的文字,多余的内容会被省略</div><!-- 最多显示三行 --><div class="van-multi-ellipsis--l3">  这是一段最多显示三行的文字,多余的内容会被省略</div>

      1px 边框

      为元素添加 Retina 屏幕下的 1px 边框(即 hairline),基于伪类 transform 实现。

      <!-- 上边框 --><div class="van-hairline--top"></div><!-- 下边框 --><div class="van-hairline--bottom"></div><!-- 左边框 --><div class="van-hairline--left"></div><!-- 右边框 --><div class="van-hairline--right"></div><!-- 上下边框 --><div class="van-hairline--top-bottom"></div><!-- 全边框 --><div class="van-hairline--surround"></div>

      底部安全区

      为元素添加底部安全区适配。

      <div class="van-safe-area-bottom"></div>

      动画

      可以通过 transition 组件使用内置的动画类。

      <!-- 淡入 --><transition name="van-fade">  <div v-show="visible">Fade</div></transition><!-- 上滑进入 --><transition name="van-slide-up">  <div v-show="visible">Slide Up</div></transition><!-- 下滑进入 --><transition name="van-slide-down">  <div v-show="visible">Slide Down</div></transition><!-- 左滑进入 --><transition name="van-slide-left">  <div v-show="visible">Slide Left</div></transition><!-- 右滑进入 --><transition name="van-slide-right">  <div v-show="visible">Slide Right</div></transition>


      介绍

      在页面中间弹出黑色半透明提示,用于消息通知、加载提示、操作结果提示等场景。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Toast } from 'vant';const app = createApp();app.use(Toast);

      代码演示

      文字提示

      基础用法

      Toast('提示内容');

      加载提示

      使用 Toast.loading 方法展示加载提示,通过 forbidClick 属性可以禁用背景点击。

      Toast.loading({  message: '加载中...',  forbidClick: true,});

      成功/失败提示

      使用 Toast.success 方法展示成功提示,使用 Toast.fail 方法展示失败提示。

      Toast.success('成功文案');Toast.fail('失败文案');

      自定义图标

      通过 icon 选项可以自定义图标,支持传入图标名称或图片链接,通过loadingType 属性可以自定义加载图标类型。

      自定义

      Toast({  message: '自定义图标',  icon: 'like-o',});Toast({  message: '自定义图片',  icon: 'https://img.yzcdn.cn/vant/logo.png',});Toast.loading({  message: '加载中...',  forbidClick: true,  loadingType: 'spinner',});

      自定义位置

      Toast 默认渲染在屏幕正中位置,通过 position 属性可以控制 Toast 展示的位置。

      自定义位置

      Toast({  message: '顶部展示',  position: 'top',});Toast({  message: '底部展示',  position: 'bottom',});

      动态更新提示

      执行 Toast 方法时会返回对应的 Toast 实例,通过修改实例上的 message 属性可以实现动态更新提示的效果。

      动态更新

      const toast = Toast.loading({  duration: 0,  forbidClick: true,  message: '倒计时 3 秒',});let second = 3;const timer = setInterval(() => {  second--;  if (second) {    toast.message = `倒计时 ${second} 秒`;  } else {    clearInterval(timer);    Toast.clear();  }}, 1000);

      全局方法

      通过 app.use 全局注册 Toast 组件后,会自动在 app 的所有子组件上挂载 $toast 方法,便于在组件内调用。

      export default {  mounted() {    this.$toast('提示文案');  },};
      Tips: 由于 setup 选项中无法访问 this,因此不能使用上述方式,请通过 import 引入。

      单例模式

      Toast 默认采用单例模式,即同一时间只会存在一个 Toast,如果需要在同一时间弹出多个 Toast,可以参考下面的示例:

      Toast.allowMultiple();const toast1 = Toast('第一个 Toast');const toast2 = Toast.success('第二个 Toast');toast1.clear();toast2.clear();

      修改默认配置

      通过 Toast.setDefaultOptions 函数可以全局修改 Toast 的默认配置。

      Toast.setDefaultOptions({ duration: 2000 });Toast.setDefaultOptions('loading', { forbidClick: true });Toast.resetDefaultOptions();Toast.resetDefaultOptions('loading');

      API

      方法

      方法名说明参数返回值
      Toast展示提示options | messagetoast 实例
      Toast.loading展示加载提示options | messagetoast 实例
      Toast.success展示成功提示options | messagetoast 实例
      Toast.fail展示失败提示options | messagetoast 实例
      Toast.clear关闭提示clearAll: booleanvoid
      Toast.allowMultiple允许同时存在多个 Toast-void
      Toast.setDefaultOptions修改默认配置,对所有 Toast 生效。
      传入 type 可以修改指定类型的默认配置
      type | optionsvoid
      Toast.resetDefaultOptions重置默认配置,对所有 Toast 生效。
      传入 type 可以重置指定类型的默认配置
      typevoid

      Options

      参数说明类型默认值
      type提示类型,可选值为 loading success
      fail html
      stringtext
      position位置,可选值为 top bottomstringmiddle
      message文本内容,支持通过 换行string''
      icon自定义图标,支持传入图标名称或图片链接string-
      iconSize图标大小,如 20px 2em,默认单位为 pxnumber | string36px
      iconPrefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
      overlay是否显示背景遮罩层booleanfalse
      forbidClick是否禁止背景点击booleanfalse
      closeOnClick是否在点击后关闭booleanfalse
      closeOnClickOverlay是否在点击遮罩层后关闭booleanfalse
      loadingType加载图标类型, 可选值为 spinnerstringcircular
      duration展示时长(ms),值为 0 时,toast 不会消失number2000
      className自定义类名string | Array | object-
      overlayClass v3.0.4自定义遮罩层类名string | Array | object-
      overlayStyle v3.0.4自定义遮罩层样式object-
      onOpened完全展示后的回调函数Function-
      onClose关闭时的回调函数Function-
      transition动画类名,等价于 transition 的name属性stringvan-fade
      teleport指定挂载的节点,用法示例string | Elementbody

      主题定制

      样式变量

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

      名称默认值描述
      --van-toast-max-width70%-
      --van-toast-font-sizevar(--van-font-size-md)-
      --van-toast-text-colorvar(--van-white)-
      --van-toast-loading-icon-colorvar(--van-white)-
      --van-toast-line-heightvar(--van-line-height-md)-
      --van-toast-border-radiusvar(--van-border-radius-lg)-
      --van-toast-background-colorfade(var(--van-black), 70%)-
      --van-toast-icon-size36px-
      --van-toast-text-min-width96px-
      --van-toast-text-paddingvar(--van-padding-xs) var(--van-padding-sm)-
      --van-toast-default-paddingvar(--van-padding-md)-
      --van-toast-default-width88px-
      --van-toast-default-min-height88px-
      --van-toast-position-top-distance20%-
      --van-toast-position-bottom-distance20%-


      介绍

      日历组件用于选择日期或日期区间。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Calendar } from 'vant';const app = createApp();app.use(Calendar);

      代码演示

      选择单个日期

      下面演示了结合单元格来使用日历组件的用法,日期选择完成后会触发 confirm 事件。

      选择单个日期

      <van-cell title="选择单个日期" :value="date" @click="show = true" /><van-calendar v-model:show="show" @confirm="onConfirm" />
      import { ref } from 'vue';export default {  setup() {    const date = ref('');    const show = ref(false);    const formatDate = (date) => `${date.getMonth() + 1}/${date.getDate()}`;    const onConfirm = (value) => {      show.value = false;      date.value = formatDate(value);    };    return {      date,      show,      onConfirm,    };  },};

      选择多个日期

      设置 type 为 multiple 后可以选择多个日期,此时 confirm 事件返回的 date 为数组结构,数组包含若干个选中的日期。

      选择多个日期

      <van-cell title="选择多个日期" :value="text" @click="show = true" /><van-calendar v-model:show="show" type="multiple" @confirm="onConfirm" />
      import { ref } from 'vue';export default {  setup() {    const text = ref('');    const show = ref(false);    const onConfirm = (dates) => {      show.value = false;      text.value = `选择了 ${dates.length} 个日期`;    };    return {      text,      show,      onConfirm,    };  },};

      选择日期区间

      设置 type 为 range 后可以选择日期区间,此时 confirm 事件返回的 date 为数组结构,数组第一项为开始时间,第二项为结束时间。

      选择日期区间

      <van-cell title="选择日期区间" :value="date" @click="show = true" /><van-calendar v-model:show="show" type="range" @confirm="onConfirm" />
      import { ref } from 'vue';export default {  setup() {    const date = ref('');    const show = ref(false);    const formatDate = (date) => `${date.getMonth() + 1}/${date.getDate()}`;    const onConfirm = (values) => {      const [start, end] = values;      show.value = false;      date.value = `${formatDate(start)} - ${formatDate(end)}`;    };    return {      date,      show,      onConfirm,    };  },};
      Tips: 默认情况下,日期区间的起止时间不能为同一天,可以通过设置 allow-same-day 属性来允许选择同一天。

      快捷选择

      将 show-confirm 设置为 false 可以隐藏确认按钮,这种情况下选择完成后会立即触发 confirm 事件。 快捷选择1

      快捷选择2

      <van-calendar v-model:show="show" :show-confirm="false" />

      自定义颜色

      通过 color 属性可以自定义日历的颜色,对选中日期和底部按钮生效。

      自定义颜色

      <van-calendar v-model:show="show" color="#1989fa" />

      自定义日期范围

      通过 min-date 和 max-date 定义日历的范围。

      定义日期范围

      <van-calendar v-model:show="show" :min-date="minDate" :max-date="maxDate" />
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    return {      show,      minDate: new Date(2010, 0, 1),      maxDate: new Date(2010, 0, 31),    };  },};

      自定义按钮文字

      通过 confirm-text 设置按钮文字,通过 confirm-disabled-text 设置按钮禁用时的文字。

      自定义按钮文字

      <van-calendar  v-model:show="show"  type="range"  confirm-text="完成"  confirm-disabled-text="请选择结束时间"/>

      自定义日期文案

      通过传入 formatter 函数来对日历上每一格的内容进行格式化。

      自定义日期文案

      <van-calendar v-model:show="show" type="range" :formatter="formatter" />
      export default {  setup() {    const formatter = (day) => {      const month = day.date.getMonth() + 1;      const date = day.date.getDate();      if (month === 5) {        if (date === 1) {          day.topInfo = '劳动节';        } else if (date === 4) {          day.topInfo = '青年节';        } else if (date === 11) {          day.text = '今天';        }      }      if (day.type === 'start') {        day.bottomInfo = '入住';      } else if (day.type === 'end') {        day.bottomInfo = '离店';      }      return day;    };    return {      formatter,    };  },};

      自定义弹出位置

      通过 position 属性自定义弹出层的弹出位置,可选值为 top、left、right。

      自定义弹出位置

      <van-calendar v-model:show="show" :round="false" position="right" />

      日期区间最大范围

      选择日期区间时,可以通过 max-range 属性来指定最多可选天数,选择的范围超过最多可选天数时,会弹出相应的提示文案。

      日期区间最大范围

      <van-calendar type="range" :max-range="3" :style="{ height: '500px' }" />

      自定义周起始日

      通过 first-day-of-week 属性设置一周从哪天开始。

      自定义周起始日

      <van-calendar first-day-of-week="1" />

      平铺展示

      将 poppable 设置为 false,日历会直接展示在页面内,而不是以弹层的形式出现。

      平铺展示

      <van-calendar  title="日历"  :poppable="false"  :show-confirm="false"  :style="{ height: '500px' }"/>

      API

      Props

      参数说明类型默认值
      type选择类型:
      single 表示选择单个日期,
      multiple 表示选择多个日期,
      range 表示选择日期区间
      stringsingle
      title日历标题string日期选择
      color主题色,对底部按钮和选中日期生效string#ee0a24
      min-date可选择的最小日期Date当前日期
      max-date可选择的最大日期Date当前日期的六个月后
      default-date默认选中的日期,type 为 multiple 或 range 时为数组,传入 null 表示默认不选择Date | Date[] | null今天
      row-height日期行高number | string64
      formatter日期格式化函数(day: Day) => Day-
      poppable是否以弹层的形式展示日历booleantrue
      lazy-render是否只渲染可视区域的内容booleantrue
      show-mark是否显示月份背景水印booleantrue
      show-title是否展示日历标题booleantrue
      show-subtitle是否展示日历副标题(年月)booleantrue
      show-confirm是否展示确认按钮booleantrue
      readonly是否为只读状态,只读状态下不能选择日期booleanfalse
      confirm-text确认按钮的文字string确定
      confirm-disabled-text确认按钮处于禁用状态时的文字string确定
      first-day-of-week设置周起始日0-60

      Calendar Poppable Props

      当 Calendar 的 poppable 为 true 时,支持以下 props:

      参数说明类型默认值
      v-model:show是否显示日历弹窗booleanfalse
      position弹出位置,可选值为 top right leftstringbottom
      round是否显示圆角弹窗booleantrue
      close-on-popstate是否在页面回退时自动关闭booleantrue
      close-on-click-overlay是否在点击遮罩层后关闭booleantrue
      safe-area-inset-bottom是否开启底部安全区适配booleantrue
      teleport指定挂载的节点,用法示例string | Element-

      Calendar Range Props

      当 Calendar 的 type 为 range 时,支持以下 props:

      参数说明类型默认值
      max-range日期区间最多可选天数number | string无限制
      range-prompt范围选择超过最多可选天数时的提示文案string选择天数不能超过 xx 天
      show-range-prompt范围选择超过最多可选天数时,是否展示提示文案booleantrue
      allow-same-day是否允许日期范围的起止时间为同一天booleanfalse

      Calendar Multiple Props

      当 Calendar 的 type 为 multiple 时,支持以下 props:

      参数说明类型默认值
      max-range日期最多可选天数number | string无限制
      range-prompt选择超过最多可选天数时的提示文案string选择天数不能超过 xx 天

      Day 数据结构

      日历中的每个日期都对应一个 Day 对象,通过formatter属性可以自定义 Day 对象的内容

      键名说明类型
      date日期对应的 Date 对象Date
      type日期类型,可选值为 selectedstartmiddleenddisabledstring
      text中间显示的文字string
      topInfo上方的提示信息string
      bottomInfo下方的提示信息string
      className额外类名string

      Events

      事件名说明回调参数
      select点击并选中任意日期时触发value: Date | Date[]
      confirm日期选择完成后触发,若 show-confirm 为 true,则点击确认按钮后触发value: Date | Date[]
      open打开弹出层时触发-
      close关闭弹出层时触发-
      opened打开弹出层且动画结束后触发-
      closed关闭弹出层且动画结束后触发-
      unselect当日历组件的 type 为 multiple 时,取消选中日期时触发value: Date
      month-show当某个月份进入可视区域时触发{ date: Date, title: string }
      over-range范围选择超过最多可选天数时触发-
      click-subtitle v3.1.3点击日历副标题时触发event: MouseEvent

      Slots

      名称说明参数
      title自定义标题-
      subtitle v3.1.3自定义日历副标题-
      footer自定义底部区域内容-
      top-info v3.0.17自定义日期上方的提示信息day: Day
      bottom-info v3.0.17自定义日期下方的提示信息day: Day

      方法

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

      方法名说明参数返回值
      reset将选中的日期重置到指定日期,未传参时会重置到默认日期date?: Date | Date[]-
      scrollToDate滚动到某个日期date: Date-

      主题定制

      样式变量

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

      名称默认值描述
      --van-calendar-background-colorvar(--van-white)-
      --van-calendar-popup-height80%-
      --van-calendar-header-box-shadow0 2px 10px rgba(125, 126, 128, 0.16)-
      --van-calendar-header-title-height44px-
      --van-calendar-header-title-font-sizevar(--van-font-size-lg)-
      --van-calendar-header-subtitle-font-sizevar(--van-font-size-md)-
      --van-calendar-weekdays-height30px-
      --van-calendar-weekdays-font-sizevar(--van-font-size-sm)-
      --van-calendar-month-title-font-sizevar(--van-font-size-md)-
      --van-calendar-month-mark-colorfade(var(--van-gray-2), 80%)-
      --van-calendar-month-mark-font-size160px-
      --van-calendar-day-height64px-
      --van-calendar-day-font-sizevar(--van-font-size-lg)-
      --van-calendar-range-edge-colorvar(--van-white)-
      --van-calendar-range-edge-background-colorvar(--van-danger-color)-
      --van-calendar-range-middle-colorvar(--van-danger-color)-
      --van-calendar-range-middle-background-opacity0.1-
      --van-calendar-selected-day-size54px-
      --van-calendar-selected-day-colorvar(--van-white)-
      --van-calendar-info-font-sizevar(--van-font-size-xs)-
      --van-calendar-info-line-heightvar(--van-line-height-xs)-
      --van-calendar-selected-day-background-colorvar(--van-danger-color)-
      --van-calendar-day-disabled-colorvar(--van-gray-5)-
      --van-calendar-confirm-button-height36px-
      --van-calendar-confirm-button-margin7px 0-

      常见问题

      在 iOS 系统上初始化组件失败?

      如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。

      对此问题的详细解释:stackoverflow


      介绍

      级联选择框,用于多层级数据的选择,典型场景为省市区选择。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Cascader } from 'vant';const app = createApp();app.use(Cascader);

      代码演示

      基础用法

      级联选择组件可以搭配 Field 和 Popup 组件使用,示例如下:

      基础用法

      <van-field  v-model="state.fieldValue"  is-link  readonly  label="地区"  placeholder="请选择所在地区"  @click="state.show = true"/><van-popup v-model:show="state.show" round position="bottom">  <van-cascader    v-model="state.cascaderValue"    title="请选择所在地区"    :options="options"    @close="state.show = false"    @finish="onFinish"  /></van-popup>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      show: false,      fieldValue: '',      cascaderValue: '',    });    // 选项列表,children 代表子选项,支持多级嵌套    const options = [      {        text: '浙江省',        value: '330000',        children: [{ text: '杭州市', value: '330100' }],      },      {        text: '江苏省',        value: '320000',        children: [{ text: '南京市', value: '320100' }],      },    ];    // 全部选项选择完毕后,会触发 finish 事件    const onFinish = ({ selectedOptions }) => {      state.show = false;      state.fieldValue = selectedOptions.map((option) => option.text).join('/');    };    return {      state,      options,      onFinish,    };  },};

      自定义颜色

      通过 active-color 属性来设置选中状态的高亮颜色。

      定义颜色

      <van-cascader  v-model="state.cascaderValue"  title="请选择所在地区"  :options="options"  active-color="#1989fa"  @close="state.show = false"  @finish="onFinish"/>

      异步加载选项

      可以监听 change 事件并动态设置 options,实现异步加载选项。

      异步加载选项

      <van-field  v-model="state.fieldValue"  is-link  readonly  label="地区"  placeholder="请选择所在地区"  @click="state.show = true"/><van-popup v-model:show="state.show" round position="bottom">  <van-cascader    v-model="state.cascaderValue"    title="请选择所在地区"    :options="state.options"    @close="state.show = false"    @change="onChange"    @finish="onFinish"  /></van-popup>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      show: false,      fieldValue: '',      cascaderValue: '',      options: [        {          text: '浙江省',          value: '330000',          children: [],        },      ],    });    const onChange = ({ value }) => {      if (value === state.options[0].value) {        setTimeout(() => {          state.options[0].children = [            { text: '杭州市', value: '330100' },            { text: '宁波市', value: '330200' },          ];        }, 500);      }    };    const onFinish = ({ selectedOptions }) => {      state.show = false;      state.fieldValue = selectedOptions.map((option) => option.text).join('/');    };    return {      state,      onChange,      onFinish,    };  },};

      自定义字段名

      通过 field-names 属性可以自定义 options 里的字段名称。

      自定义字段名

      <van-cascader  v-model="code"  title="请选择所在地区"  :options="options"  :field-names="fieldNames"/>
      import { ref } from 'vue';export default {  setup() {    const code = ref('');    const fieldNames = {      text: 'name',      value: 'code',      children: 'items',    };    const options = [      {        name: '浙江省',        code: '330000',        items: [{ name: '杭州市', code: '330100' }],      },      {        name: '江苏省',        code: '320000',        items: [{ name: '南京市', code: '320100' }],      },    ];    return {      code,      options,      fieldNames,    };  },};

      API

      Props

      参数说明类型默认值
      title顶部标题string-
      value选中项的值string | number-
      options可选项数据源Option[][]
      placeholder未选中时的提示文案string请选择
      active-color选中状态的高亮颜色string#ee0a24
      swipeable v3.0.11是否开启手势左右滑动切换booleanfalse
      closeable是否显示关闭图标booleantrue
      close-icon v3.0.10关闭图标名称或图片链接stringcross
      field-names v3.0.4自定义 options 结构中的字段object{ text: 'text', value: 'value', children: 'children' }

      Option 数据结构

      options 属性是一个由对象构成的数组,数组中的每个对象配置一个可选项,对象可以包含以下值:

      键名说明类型
      text选项文字(必填)string
      value选项对应的值(必填)string | number
      color v3.1.0选项文字颜色string
      children子选项列表Option[]
      disabled v3.1.2是否禁用选项boolean
      className v3.1.0为对应列添加额外的 classstring | Array | object

      Events

      事件说明回调参数
      change选中项变化时触发{ value, selectedOptions, tabIndex }
      finish全部选项选择完成后触发{ value, selectedOptions, tabIndex }
      close点击关闭图标时触发-
      click-tab点击标签时触发tabIndex: number, title: string

      Slots

      名称说明参数
      title自定义顶部标题-
      option v3.1.4自定义选项文字{ option: Option, selected: boolean }

      主题定制

      样式变量

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

      名称默认值描述
      --van-cascader-header-height48px-
      --van-cascader-header-padding0 var(--van-padding-md)-
      --van-cascader-title-font-sizevar(--van-font-size-lg)-
      --van-cascader-title-line-height20px-
      --van-cascader-close-icon-size22px-
      --van-cascader-close-icon-colorvar(--van-gray-5)-
      --van-cascader-close-icon-active-colorvar(--van-gray-6)-
      --van-cascader-selected-icon-size18px-
      --van-cascader-tabs-height48px-
      --van-cascader-active-colorvar(--van-danger-color)-
      --van-cascader-options-height384px-
      --van-cascader-option-disabled-colorvan(--van-gray-5)-
      --van-cascader-tab-colorvar(--van-text-color)-
      --van-cascader-unselected-tab-colorvar(--van-gray-6)-


      介绍

      在一组备选项中进行多选。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Checkbox, CheckboxGroup } from 'vant';const app = createApp();app.use(Checkbox);app.use(CheckboxGroup);

      代码演示

      基础用法

      通过 v-model 绑定复选框的勾选状态。

      基础用法

      <van-checkbox v-model="checked">复选框</van-checkbox>
      import { ref } from 'vue';export default {  setup() {    const checked = ref(true);    return { checked };  },};

      禁用状态

      通过设置 disabled 属性可以禁用复选框。

      禁用状态

      <van-checkbox v-model="checked" disabled>复选框</van-checkbox>

      自定义形状

      将 shape 属性设置为 square,复选框的形状会变成方形。

      自定义形状

      <van-checkbox v-model="checked" shape="square">复选框</van-checkbox>

      自定义颜色

      通过 checked-color 属性设置选中状态的图标颜色。

      自定义颜色

      <van-checkbox v-model="checked" checked-color="#ee0a24">复选框</van-checkbox>

      自定义大小

      通过 icon-size 属性可以自定义图标的大小。

      自定义大小

      <van-checkbox v-model="checked" icon-size="24px">复选框</van-checkbox>

      自定义图标

      通过 icon 插槽自定义图标,可以通过 slotProps 判断是否为选中状态.

      自定义图标

      <van-checkbox v-model="checked">  自定义图标  <template #icon="props">    <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" />  </template></van-checkbox><style>  .img-icon {    height: 20px;  }</style>
      import { ref } from 'vue';export default {  setup() {    const checked = ref(true);    return {      checked,      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

      禁用文本点击

      设置 label-disabled 属性后,点击图标以外的内容不会触发复选框切换。

      禁用文本点击

      <van-checkbox v-model="checked" label-disabled>复选框</van-checkbox>

      复选框组

      复选框可以与复选框组一起使用,复选框组通过 v-model 数组绑定复选框的勾选状态。

      复选框组

      <van-checkbox-group v-model="checked">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox></van-checkbox-group>
      import { ref } from 'vue';export default {  setup() {    const checked = ref(['a', 'b']);    return { checked };  },};

      水平排列

      将 direction 属性设置为 horizontal 后,复选框组会变成水平排列。

      水平排列

      <van-checkbox-group v-model="checked" direction="horizontal">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox></van-checkbox-group>
      import { ref } from 'vue';export default {  setup() {    const checked = ref([]);    return { checked };  },};

      限制最大可选数

      通过 max 属性可以限制复选框组的最大可选数。

      限制最大可选数

      <van-checkbox-group v-model="checked" :max="2">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox>  <van-checkbox name="c">复选框 c</van-checkbox></van-checkbox-group>

      全选与反选

      通过 CheckboxGroup 实例上的 toggleAll 方法可以实现全选与反选。

      全选与反选

      <van-checkbox-group v-model="checked" ref="checkboxGroup">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox>  <van-checkbox name="c">复选框 c</van-checkbox></van-checkbox-group><van-button type="primary" @click="checkAll">全选</van-button><van-button type="primary" @click="toggleAll">反选</van-button>
      import { ref } from 'vue';export default {  setup() {    const checked = ref([]);    const checkboxGroup = ref(null);    const checkAll = () => {      checkboxGroup.value.toggleAll(true);    }    const toggleAll = () => {      checkboxGroup.value.toggleAll();    },    return {      checked,      checkAll,      toggleAll,      checkboxGroup,    };  },};

      搭配单元格组件使用

      此时你需要再引入 Cell 和 CellGroup 组件,并通过 Checkbox 实例上的 toggle 方法触发切换。

      搭配单元格使用

      <van-checkbox-group v-model="checked">  <van-cell-group>    <van-cell      v-for="(item, index) in list"      clickable      :key="item"      :title="`复选框 ${item}`"      @click="toggle(index)"    >      <template #right-icon>        <van-checkbox          :name="item"          :ref="el => checkboxRefs[index] = el"          @click.stop        />      </template>    </van-cell>  </van-cell-group></van-checkbox-group>
      import { ref, onBeforeUpdate } from 'vue';export default {  setup() {    const checked = ref([]);    const checkboxRefs = ref([]);    const toggle = (index) => {      checkboxRefs.value[index].toggle();    };    onBeforeUpdate(() => {      checkboxRefs.value = [];    });    return {      list: ['a', 'b'],      toggle,      checked,      checkboxRefs,    };  },};

      API

      Checkbox Props

      参数说明类型默认值
      v-model是否为选中状态booleanfalse
      name标识符any-
      shape形状,可选值为 squarestringround
      disabled是否禁用复选框booleanfalse
      label-disabled是否禁用复选框文本点击booleanfalse
      label-position文本位置,可选值为 leftstringright
      icon-size图标大小,默认单位为 pxnumber | string20px
      checked-color选中状态颜色string#1989fa
      bind-group是否与复选框组绑定booleantrue

      CheckboxGroup Props

      参数说明类型默认值
      v-model所有选中项的标识符any[]-
      disabled是否禁用所有复选框booleanfalse
      max最大可选数,0 为无限制number | string0
      direction排列方向,可选值为 horizontalstringvertical
      icon-size所有复选框的图标大小,默认单位为 pxnumber | string20px
      checked-color所有复选框的选中状态颜色string#1989fa

      Checkbox Events

      事件名说明回调参数
      change当绑定值变化时触发的事件checked: boolean
      click点击复选框时触发event: MouseEvent

      CheckboxGroup Events

      事件名说明回调参数
      change当绑定值变化时触发的事件names: any[]

      Checkbox Slots

      名称说明参数
      default自定义文本-
      icon自定义图标{ checked: boolean, disabled: boolean }

      CheckboxGroup 方法

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

      方法名说明参数返回值
      toggleAll切换所有复选框,传 true 为选中,false 为取消选中,不传参为取反options?: boolean | object-

      toggleAll 方法示例

      const { checkboxGroup } = this.$refs;// 全部反选checkboxGroup.toggleAll();// 全部选中checkboxGroup.toggleAll(true);// 全部取消checkboxGroup.toggleAll(false);// 全部反选,并跳过禁用的复选框checkboxGroup.toggleAll({  skipDisabled: true,});// 全部选中,并跳过禁用的复选框checkboxGroup.toggleAll({  checked: true,  skipDisabled: true,});

      Checkbox 方法

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

      方法名说明参数返回值
      toggle切换选中状态,传 true 为选中,false 为取消选中,不传参为取反checked?: boolean-

      主题定制

      样式变量

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

      名称默认值描述
      --van-checkbox-size20px-
      --van-checkbox-border-colorvar(--van-gray-5)-
      --van-checkbox-transition-durationvar(--van-animation-duration-fast)-
      --van-checkbox-label-marginvar(--van-padding-xs)-
      --van-checkbox-label-colorvar(--van-text-color)-
      --van-checkbox-checked-icon-colorvar(--van-primary-color)-
      --van-checkbox-disabled-icon-colorvar(--van-gray-5)-
      --van-checkbox-disabled-label-colorvar(--van-gray-5)-
      --van-checkbox-disabled-background-colorvar(--van-border-color)-


      介绍

      时间选择器,支持日期、年月、时分等维度,通常与弹出层组件配合使用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { DatetimePicker } from 'vant';const app = createApp();app.use(DatetimePicker);

      代码演示

      选择年月日

      DatetimePicker 通过 type 属性来定义需要选择的时间类型,type 为 date 表示选择年月日。通过 min-date 和 max-date 属性可以确定可选的时间范围。

      选择年月日

      <van-datetime-picker  v-model="currentDate"  type="date"  title="选择年月日"  :min-date="minDate"  :max-date="maxDate"/>
      import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date(2021, 0, 17));    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate,    };  },};

      选择年月

      将 type 设置为 year-month 即可选择年份和月份。通过传入 formatter 函数,可以对选项文字进行格式化处理。

      选择年月

      <van-datetime-picker  v-model="currentDate"  type="year-month"  title="选择年月"  :min-date="minDate"  :max-date="maxDate"  :formatter="formatter"/>
      import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    const formatter = (type, val) => {      if (type === 'year') {        return `${val}年`;      }      if (type === 'month') {        return `${val}月`;      }      return val;    };    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      formatter,      currentDate,    };  },};

      选择月日

      将 type 设置为 month-day 即可选择月份和日期。

      选择月日

      <van-datetime-picker  v-model="currentDate"  type="month-day"  title="选择月日"  :min-date="minDate"  :max-date="maxDate"  :formatter="formatter"/>
      import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    const formatter = (type, val) => {      if (type === 'month') {        return `${val}月`;      }      if (type === 'day') {        return `${val}日`;      }      return val;    };    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      formatter,      currentDate,    };  },};

      选择时间

      将 type 设置为 time 即可选择时间(小时和分钟)。

      选择时间

      <van-datetime-picker  v-model="currentTime"  type="time"  title="选择时间"  :min-hour="10"  :max-hour="20"/>
      import { ref } from 'vue';export default {  setup() {    const currentTime = ref('12:00');    return { currentTime };  },};

      选择完整时间

      将 type 设置为 datetime 即可选择完整时间,包括年月日和小时、分钟。

      选择完整时间

      <van-datetime-picker  v-model="currentDate"  type="datetime"  title="选择完整时间"  :min-date="minDate"  :max-date="maxDate"/>
      import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate,    };  },};

      选择年月日小时

      将 type 设置为 datehour 即可选择日期和小时,包括年月日和小时。

      选择年月日时

      <van-datetime-picker  v-model="currentDate"  type="datehour"  title="选择年月日小时"  :min-date="minDate"  :max-date="maxDate"/>
      import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate,    };  },};

      选项过滤器

      通过传入 filter 函数,可以对选项数组进行过滤,实现自定义时间间隔。

      选项过滤器

      <van-datetime-picker v-model="currentTime" type="time" :filter="filter" />
      import { ref } from 'vue';export default {  setup() {    const currentTime = ref('12:00');    const filter = (type, options) => {      if (type === 'minute') {        return options.filter((option) => Number(option) % 5 === 0);      }      return options;    };    return {      filter,      currentTime,    };  },};

      自定义列排序

      自定义列排序

      <van-datetime-picker  v-model="currentDate"  type="date"  title="自定义列排序"  :columns-order="['month', 'day', 'year']"  :formatter="formatter"/>
      import { ref } from 'vue';export default {  setup() {    const currentDate = ref(new Date());    const formatter = (type, val) => {      if (type === 'year') {        return val + '年';      }      if (type === 'month') {        return val + '月';      }      if (type === 'day') {        return val + '日';      }      return val;    };    return {      formatter,      currentDate,    };  },};

      API

      Props

      参数说明类型默认值
      type时间类型,可选值为 date time
      year-month month-day datehour
      stringdatetime
      title顶部栏标题string''
      confirm-button-text确认按钮文字string确认
      cancel-button-text取消按钮文字string取消
      show-toolbar是否显示顶部栏booleantrue
      loading是否显示加载状态booleanfalse
      readonly是否为只读状态,只读状态下无法切换选项booleanfalse
      filter选项过滤函数(type: string, values: string[]) => string[]-
      formatter选项格式化函数(type: string, value: string) => string-
      columns-order自定义列排序数组, 子项可选值为
      yearmonthdayhourminute
      string[]-
      item-height选项高度,支持 px vw vh rem 单位,默认 pxnumber | string44
      visible-item-count可见的选项个数number | string6
      swipe-duration快速滑动时惯性滚动的时长,单位msnumber | string1000

      DatePicker Props

      当时间选择器类型为 date 或 datetime 时,支持以下 props:

      参数说明类型默认值
      min-date可选的最小时间,精确到分钟Date十年前
      max-date可选的最大时间,精确到分钟Date十年后

      TimePicker Props

      当时间选择器类型为 time 时,支持以下 props:

      参数说明类型默认值
      min-hour可选的最小小时number | string0
      max-hour可选的最大小时number | string23
      min-minute可选的最小分钟number | string0
      max-minute可选的最大分钟number | string59

      Events

      事件名说明回调参数
      change当值变化时触发的事件value: 当前选中的时间
      confirm点击完成按钮时触发的事件value: 当前选中的时间
      cancel点击取消按钮时触发的事件-

      Slots

      名称说明参数
      default自定义整个顶部栏的内容-
      title自定义标题内容-
      confirm自定义确认按钮内容-
      cancel自定义取消按钮内容-
      option自定义选项内容option: string | object
      columns-top自定义选项上方内容-
      columns-bottom自定义选项下方内容-

      方法

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

      方法名说明参数返回值
      getPicker获取 Picker 实例,用于调用 Picker 的实例方法--

      常见问题

      设置 min-date 或 max-date 后出现页面卡死的情况?

      请注意不要在模板中直接使用类似min-date="new Date()"的写法,这样会导致每次渲染组件时传入一个新的 Date 对象,而传入新的数据会触发下一次渲染,从而陷入死循环。

      正确的做法是将min-date作为一个数据定义在data函数中。

      在 iOS 系统上初始化组件失败?

      如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。

      对此问题的详细解释:stackoverflow

      在桌面端无法操作组件?

      参见桌面端适配

      是否有年份或月份选择器?

      如果仅需要选择年份或者月份,建议直接使用 Picker 组件。


      介绍

      用户可以在文本框内输入或编辑文字。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Field, CellGroup } from 'vant';const app = createApp();app.use(Field);app.use(CellGroup);

      代码演示

      基础用法

      可以通过 v-model 双向绑定输入框的值,通过 placeholder 设置占位提示文字。

      基础用法

      <!-- 可以使用 CellGroup 作为容器 --><van-cell-group inset>  <van-field v-model="value" label="文本" placeholder="请输入用户名" /></van-cell-group>
      import { ref } from 'vue';export default {  setup() {    const value = ref('');    return { value };  },};

      自定义类型

      根据 type 属性定义不同类型的输入框,默认值为 text。

      自定义类型

      <van-cell-group inset>  <!-- 输入任意文本 -->  <van-field v-model="state.text" label="文本" />  <!-- 输入手机号,调起手机号键盘 -->  <van-field v-model="state.tel" type="tel" label="手机号" />  <!-- 允许输入正整数,调起纯数字键盘 -->  <van-field v-model="state.digit" type="digit" label="整数" />  <!-- 允许输入数字,调起带符号的纯数字键盘 -->  <van-field v-model="state.number" type="number" label="数字" />  <!-- 输入密码 -->  <van-field v-model="state.password" type="password" label="密码" /></van-cell-group>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      tel: '',      text: '',      digit: '',      number: '',      password: '',    });    return { state };  },};

      禁用输入框

      通过 readonly 将输入框设置为只读状态,通过 disabled 将输入框设置为禁用状态。

      禁用输入框

      <van-cell-group inset>  <van-field label="文本" model-value="输入框只读" readonly />  <van-field label="文本" model-value="输入框已禁用" disabled /></van-cell-group>

      显示图标

      通过 left-icon 和 right-icon 配置输入框两侧的图标,通过设置 clearable 在输入过程中展示清除图标。

      显示图标

      <van-cell-group inset>  <van-field    v-model="state.value1"    label="文本"    left-icon="smile-o"    right-icon="warning-o"    placeholder="显示图标"  />  <van-field    v-model="state.value2"    clearable    label="文本"    left-icon="music-o"    placeholder="显示清除图标"  /></van-cell-group>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value1: '',      value2: '123',    });    return { state };  },};

      错误提示

      设置 required 属性表示这是一个必填项,可以配合 error 或 error-message 属性显示对应的错误提示。

      错误提示

      <van-cell-group inset>  <van-field    v-model="username"    error    required    label="用户名"    placeholder="请输入用户名"  />  <van-field    v-model="phone"    required    label="手机号"    placeholder="请输入手机号"    error-message="手机号格式错误"  /></van-cell-group>

      插入按钮

      通过 button 插槽可以在输入框尾部插入按钮。

      插入按钮

      <van-cell-group inset>  <van-field    v-model="sms"    center    clearable    label="短信验证码"    placeholder="请输入短信验证码"  >    <template #button>      <van-button size="small" type="primary">发送验证码</van-button>    </template>  </van-field></van-cell-group>

      格式化输入内容

      通过 formatter 属性可以对输入的内容进行格式化,通过 format-trigger 属性可以指定执行格式化的时机,默认在输入时进行格式化。

      格式化输入内容

      <van-cell-group inset>  <van-field    v-model="state.value1"    label="文本"    :formatter="formatter"    placeholder="在输入时执行格式化"  />  <van-field    v-model="state.value2"    label="文本"    :formatter="formatter"    format-trigger="onBlur"    placeholder="在失焦时执行格式化"  /></van-cell-group>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value1: '',      value2: '',    });    // 过滤输入的数字    const formatter = (value) => value.replace(/d/g, '');    return {      state,      formatter,    };  },};

      高度自适应

      对于 textarea,可以通过 autosize 属性设置高度自适应。

      高度自适应

      <van-cell-group inset>  <van-field    v-model="message"    rows="1"    autosize    label="留言"    type="textarea"    placeholder="请输入留言"  /></van-cell-group>

      显示字数统计

      设置 maxlength 和 show-word-limit 属性后会在底部显示字数统计。

      字数统计

      <van-cell-group inset>  <van-field    v-model="message"    rows="2"    autosize    label="留言"    type="textarea"    maxlength="50"    placeholder="请输入留言"    show-word-limit  /></van-cell-group>

      输入框内容对齐

      通过 input-align 属性可以设置输入框内容的对齐方式,可选值为 center、right。

      输入框内容对齐

      <van-cell-group inset>  <van-field    v-model="value"    label="文本"    placeholder="输入框内容右对齐"    input-align="right"  /></van-cell-group>

      API

      Props

      参数说明类型默认值
      v-model当前输入的值number | string-
      label输入框左侧文本string-
      name名称,提交表单的标识符string-
      type输入框类型, 可选值为 tel digit
      number textarea password 等
      stringtext
      size大小,可选值为 largestring-
      maxlength输入的最大字符数number | string-
      placeholder输入框占位提示文字string-
      border是否显示内边框booleantrue
      disabled是否禁用输入框booleanfalse
      readonly是否为只读状态,只读状态下无法输入内容booleanfalse
      colon是否在 label 后面添加冒号booleanfalse
      required是否显示表单必填星号booleanfalse
      center是否使内容垂直居中booleanfalse
      clearable是否启用清除图标,点击清除图标后会清空输入框booleanfalse
      clear-icon v3.0.12清除图标名称或图片链接stringclear
      clear-trigger显示清除图标的时机,always 表示输入框不为空时展示,
      focus 表示输入框聚焦且不为空时展示
      stringfocus
      clickable是否开启点击反馈booleanfalse
      is-link是否展示右侧箭头并开启点击反馈booleanfalse
      autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
      show-word-limit是否显示字数统计,需要设置 maxlength 属性booleanfalse
      error是否将输入内容标红booleanfalse
      error-message底部错误提示文案,为空时不展示string-
      error-message-align错误提示文案对齐方式,可选值为 center rightstringleft
      formatter输入内容格式化函数(val: string) => string-
      format-trigger格式化函数触发的时机,可选值为 onBlurstringonChange
      arrow-direction箭头方向,可选值为 left up downstringright
      label-class左侧文本额外类名string | Array | object-
      label-width左侧文本宽度,默认单位为 pxnumber | string6.2em
      label-align左侧文本对齐方式,可选值为 center rightstringleft
      input-align输入框对齐方式,可选值为 center rightstringleft
      autosize是否自适应内容高度,只对 textarea 有效,
      可传入对象,如 { maxHeight: 100, minHeight: 50 },
      单位为px
      boolean | objectfalse
      left-icon左侧图标名称或图片链接string-
      right-icon右侧图标名称或图片链接string-
      icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
      rules表单校验规则,详见 Form 组件Rule[]-
      autocomplete v3.0.3input 标签原生的自动完成属性string-

      Events

      事件说明回调参数
      update:model-value输入框内容变化时触发value: string (当前输入的值)
      focus输入框获得焦点时触发event: Event
      blur输入框失去焦点时触发event: Event
      clear点击清除按钮时触发event: MouseEvent
      click点击组件时触发event: MouseEvent
      click-input点击输入区域时触发event: MouseEvent
      click-left-icon点击左侧图标时触发event: MouseEvent
      click-right-icon点击右侧图标时触发event: MouseEvent

      方法

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

      方法名说明参数返回值
      focus获取输入框焦点--
      blur取消输入框焦点--

      Slots

      名称说明
      label自定义输入框左侧文本
      input自定义输入框,使用此插槽后,与输入框相关的属性和事件将失效。
      在 Form 组件进行表单校验时,会使用 input 插槽中子组件的 value,而不是 Field 组件的 value
      left-icon自定义输入框头部图标
      right-icon自定义输入框尾部图标
      button自定义输入框尾部按钮
      extra自定义输入框最右侧的额外内容

      主题定制

      样式变量

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

      名称默认值描述
      --van-field-label-width6.2em-
      --van-field-label-colorvar(--van-gray-7)-
      --van-field-label-margin-rightvar(--van-padding-sm)-
      --van-field-input-text-colorvar(--van-text-color)-
      --van-field-input-error-text-colorvar(--van-danger-color)-
      --van-field-input-disabled-text-colorvar(--van-gray-5)-
      --van-field-placeholder-text-colorvar(--van-gray-5)-
      --van-field-icon-size16px-
      --van-field-clear-icon-size16px-
      --van-field-clear-icon-colorvar(--van-gray-5)-
      --van-field-right-icon-colorvar(--van-gray-6)-
      --van-field-error-message-colorvar(--van-danger-color)-
      --van-field-error-message-text-color12px-
      --van-field-text-area-min-height60px-
      --van-field-word-limit-colorvar(--van-gray-7)-
      --van-field-word-limit-font-sizevar(--van-font-size-sm)-
      --van-field-word-limit-line-height16px-
      --van-field-disabled-text-colorvar(--van-gray-5)-
      --van-field-required-mark-colorvar(--van-red)-

      常见问题

      设置 type 为 number 后,为什么 input 标签的类型仍为 text?

      HTML 原生的 type="number" 属性在 iOS 和 Android 系统上都存在一定问题,比如 maxlength 属性不生效、无法获取到完整的输入内容等。因此设置 type 为 number 时,Field 不会使用原生的 type="number" 属性,而是用现代浏览器支持的 inputmode 属性来控制输入键盘的类型。

      在桌面端点击清除按钮无效?

      清除按钮监听是的移动端 Touch 事件,参见桌面端适配


      介绍

      用于数据录入、校验,支持输入框、单选框、复选框、文件上传等类型,需要与 Field 输入框 组件搭配使用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Form, Field, CellGroup } from 'vant';const app = createApp();app.use(Form);app.use(Field);app.use(CellGroup);

      代码演示

      基础用法

      在表单中,每个 Field 组件 代表一个表单项,使用 Field 的 rules 属性定义校验规则。

      基础用法

      <van-form @submit="onSubmit">  <van-cell-group inset>    <van-field      v-model="state.username"      name="用户名"      label="用户名"      placeholder="用户名"      :rules="[{ required: true, message: '请填写用户名' }]"    />    <van-field      v-model="state.password"      type="password"      name="密码"      label="密码"      placeholder="密码"      :rules="[{ required: true, message: '请填写密码' }]"    />  </van-cell-group>  <div style="margin: 16px;">    <van-button round block type="primary" native-type="submit">      提交    </van-button>  </div></van-form>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      username: '',      password: '',    });    const onSubmit = (values) => {      console.log('submit', values);    };    return {      state,      onSubmit,    };  },};

      校验规则

      通过 rules 定义表单校验规则,所有可用字段见下方表格

      校验规则

      <van-form @failed="onFailed">  <van-cell-group inset>    <!-- 通过 pattern 进行正则校验 -->    <van-field      v-model="state.value1"      name="pattern"      placeholder="正则校验"      :rules="[{ pattern, message: '请输入正确内容' }]"    />    <!-- 通过 validator 进行函数校验 -->    <van-field      v-model="state.value2"      name="validator"      placeholder="函数校验"      :rules="[{ validator, message: '请输入正确内容' }]"    />    <!-- 通过 validator 返回错误提示 -->    <van-field      v-model="state.value3"      name="validatorMessage"      placeholder="校验函数返回错误提示"      :rules="[{ validator: validatorMessage }]"    />    <!-- 通过 validator 进行异步函数校验 -->    <van-field      v-model="state.value4"      name="asyncValidator"      placeholder="异步函数校验"      :rules="[{ validator: asyncValidator, message: '请输入正确内容' }]"    />  </van-cell-group>  <div style="margin: 16px;">    <van-button round block type="primary" native-type="submit">      提交    </van-button>  </div></van-form>
      import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const state = reactive({      value1: '',      value2: '',      value3: '',      value4: '',    });    const pattern = /d{6}/;    // 校验函数返回 true 表示校验通过,false 表示不通过    const validator = (val) => /1d{10}/.test(val);    // 校验函数可以直接返回一段错误提示    const validatorMessage = (val) => `${val} 不合法,请重新输入`;    // 校验函数可以返回 Promise,实现异步校验    const asyncValidator = (val) =>      new Promise((resolve) => {        Toast.loading('验证中...');        setTimeout(() => {          Toast.clear();          resolve(/d{6}/.test(val));        }, 1000);      });    const onFailed = (errorInfo) => {      console.log('failed', errorInfo);    };    return {      state,      pattern,      onFailed,      validator,      asyncValidator,    };  },};

      表单项类型 - 开关

      在表单中使用 Switch 组件

      开关

      <van-field name="switch" label="开关">  <template #input>    <van-switch v-model="checked" size="20" />  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const checked = ref(false);    return { checked };  },};

      表单项类型 - 复选框

      在表单中使用 Checkbox 组件

      复选框

      <van-field name="checkbox" label="复选框">  <template #input>    <van-checkbox v-model="checked" shape="square" />  </template></van-field><van-field name="checkboxGroup" label="复选框组">  <template #input>    <van-checkbox-group v-model="groupChecked" direction="horizontal">      <van-checkbox name="1" shape="square">复选框 1</van-checkbox>      <van-checkbox name="2" shape="square">复选框 2</van-checkbox>    </van-checkbox-group>  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const checked = ref(false);    const groupChecked = ref([]);    return {      checked,      groupChecked,    };  },};

      表单项类型 - 单选框

      在表单中使用 Radio 组件

      单选框

      <van-field name="radio" label="单选框">  <template #input>    <van-radio-group v-model="checked" direction="horizontal">      <van-radio name="1">单选框 1</van-radio>      <van-radio name="2">单选框 2</van-radio>    </van-radio-group>  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const checked = ref('1');    return { checked };  },};

      表单项类型 - 步进器

      在表单中使用 Stepper 组件

      步进器

      <van-field name="stepper" label="步进器">  <template #input>    <van-stepper v-model="value" />  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const value = ref(1);    return { value };  },};

      表单项类型 - 评分

      在表单中使用 Rate 组件

      评分

      <van-field name="rate" label="评分">  <template #input>    <van-rate v-model="value" />  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const value = ref(3);    return { value };  },};

      表单项类型 - 滑块

      在表单中使用 Slider 组件

      滑块

      <van-field name="slider" label="滑块">  <template #input>    <van-slider v-model="value" />  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const value = ref(50);    return { value };  },};

      表单项类型 - 文件上传

      在表单中使用 Uploader 组件

      文件上传

      <van-field name="uploader" label="文件上传">  <template #input>    <van-uploader v-model="value" />  </template></van-field>
      import { ref } from 'vue';export default {  setup() {    const value = ref([{ url: 'https://img.yzcdn.cn/vant/leaf.jpg' }]);    return { value };  },};

      表单项类型 - 选择器

      在表单中使用 Picker 组件

      选择器

      <van-field  v-model="state.value"  readonly  clickable  name="picker"  label="选择器"  placeholder="点击选择城市"  @click="state.showPicker = true"/><van-popup v-model:show="state.showPicker" position="bottom">  <van-picker    :columns="columns"    @confirm="onConfirm"    @cancel="state.showPicker = false"  /></van-popup>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showPicker: false,    });    const columns = ['杭州', '宁波', '温州', '嘉兴', '湖州'];    const onConfirm = (value) => {      state.value = value;      state.showPicker = false;    };    return {      state,      columns,      onConfirm,    };  },};

      表单项类型 - 时间选择器

      在表单中使用 DatetimePicker 组件

      时间选择器

      <van-field  v-model="state.value"  readonly  clickable  name="datetimePicker"  label="时间选择"  placeholder="点击选择时间"  @click="state.showPicker = true"/><van-popup v-model:show="state.showPicker" position="bottom">  <van-datetime-picker    type="time"    @confirm="onConfirm"    @cancel="state.showPicker = false"  /></van-popup>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showPicker: false,    });    const onConfirm = (value) => {      state.value = value;      state.showPicker = false;    };    return {      state,      onConfirm,    };  },};

      表单项类型 - 省市区选择器

      在表单中使用 Area 组件

      地区选择器

      <van-field  v-model="state.value"  readonly  clickable  name="area"  label="地区选择"  placeholder="点击选择省市区"  @click="state.showArea = true"/><van-popup v-model:show="state.showArea" position="bottom">  <van-area    :area-list="areaList"    @confirm="onConfirm"    @cancel="state.showArea = false"  /></van-popup>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showArea: false,    });    const onConfirm = (value) => {      state.showArea = false;      state.value = values        .filter((item) => !!item)        .map((item) => item.name)        .join('/');    };    return {      state,      areaList: {}, // 数据格式见 Area 组件文档      onConfirm,    };  },};

      表单项类型 - 日历

      在表单中使用 Calendar 组件

      日期选择

      <van-field  v-model="state.value"  readonly  clickable  name="calendar"  label="日历"  placeholder="点击选择日期"  @click="state.showCalendar = true"/><van-calendar v-model:show="state.showCalendar" @confirm="onConfirm" />
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      value: '',      showCalendar: false,    });    const onConfirm = (date) => {      state.value = `${date.getMonth() + 1}/${date.getDate()}`;      state.showCalendar = false;    };    return {      state,      onConfirm,    };  },};

      API

      Props

      参数说明类型默认值
      label-width表单项 label 宽度,默认单位为pxnumber | string6.2em
      label-align表单项 label 对齐方式,可选值为 center rightstringleft
      input-align输入框对齐方式,可选值为 center rightstringleft
      error-message-align错误提示文案对齐方式,可选值为 center rightstringleft
      validate-trigger表单校验触发时机,可选值为 onChangeonSubmit,详见下表stringonBlur
      colon是否在 label 后面添加冒号booleanfalse
      disabled是否禁用表单中的所有输入框booleanfalse
      readonly是否将表单中的所有输入框设置为只读状态booleanfalse
      validate-first是否在某一项校验不通过时停止校验booleanfalse
      scroll-to-error是否在提交表单且校验不通过时滚动至错误的表单项booleanfalse
      show-error是否在校验不通过时标红输入框booleanfalse
      show-error-message是否在校验不通过时在输入框下方展示错误提示booleantrue
      submit-on-enter是否在按下回车键时提交表单booleantrue
      表单项的 API 参见:Field 组件

      Rule 数据结构

      使用 Field 的rules属性可以定义校验规则,可选属性如下:

      键名说明类型
      required是否为必选字段boolean
      message错误提示文案string | (value, rule) => string
      validator通过函数进行校验(value, rule) => boolean | string | Promise
      pattern通过正则表达式进行校验RegExp
      trigger本项规则的触发时机,可选值为 onChangeonBlurstring
      formatter格式化函数,将表单项的值转换后进行校验(value, rule) => any

      validate-trigger 可选值

      通过 validate-trigger 属性可以自定义表单校验的触发时机。

      描述
      onSubmit仅在提交表单时触发校验
      onBlur在提交表单和输入框失焦时触发校验
      onChange在提交表单和输入框内容变化时触发校验

      Events

      事件名说明回调参数
      submit提交表单且验证通过后触发values: object
      failed提交表单且验证不通过后触发errorInfo: { values: object, errors: object[] }

      方法

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

      方法名说明参数返回值
      submit提交表单,与点击提交按钮的效果等价--
      validate验证表单,支持传入 name 来验证单个或部分表单项name?: string | string[]Promise
      resetValidation重置表单项的验证提示,支持传入 name 来重置单个或部分表单项name?: string | string[]-
      scrollToField滚动到对应表单项的位置,默认滚动到顶部,第二个参数传 false 可滚动至底部name: string, alignToTop: boolean-

      Slots

      名称说明
      default表单内容


      介绍

      虚拟数字键盘,可以配合密码输入框组件或自定义的输入框组件使用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { NumberKeyboard } from 'vant';const app = createApp();app.use(NumberKeyboard);

      代码演示

      默认样式

      数字键盘提供了 input、delete、blur 事件,分别对应输入内容、删除内容和失去焦点的动作。

      默认样式

      <van-cell @touchstart.stop="show = true">弹出默认键盘</van-cell><van-number-keyboard  :show="show"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const show = ref(true);    const onInput = (value) => Toast(value);    const onDelete = () => Toast('删除');    return {      show,      onInput,      onDelete,    };  },};
      点击键盘以外的区域时,键盘会自动收起,通过阻止元素上的 touchstart 事件冒泡可以避免键盘收起。

      带右侧栏的键盘

      将 theme 属性设置为 custom 来展示键盘的右侧栏,常用于输入金额的场景。

      右侧键盘

      <van-number-keyboard  :show="show"  theme="custom"  extra-key="."  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

      身份证号键盘

      通过 extra-key 属性可以设置左下角按键内容,比如需要输入身份证号时,可以将 extra-key 设置为 X。

      身份证号键盘

      <van-cell plain type="primary" @touchstart.stop="show = true">  弹出身份证号键盘</van-cell><van-number-keyboard  :show="show"  extra-key="X"  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

      键盘标题

      通过 title 属性可以设置键盘标题。

      带标题的键盘

      <van-cell plain type="primary" @touchstart.stop="show = true">  弹出带标题的键盘</van-cell><van-number-keyboard  :show="show"  title="键盘标题"  extra-key="."  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

      配置多个按键

      当 theme 为 custom 时,支持以数组的形式配置两个 extra-key。

      配置多个按键

      <van-cell plain type="primary" @touchstart.stop="show = true">  弹出配置多个按键的键盘</van-cell><van-number-keyboard  :show="show"  :extra-key="['00', '.']"  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

      随机数字键盘

      通过 random-key-order 属性可以随机排序数字键盘,常用于安全等级较高的场景。

      随机数字键盘

      <van-cell @touchstart.stop="show = true"> 弹出配置随机数字的键盘 </van-cell><van-number-keyboard  :show="show"  random-key-order  @blur="show = false"  @input="onInput"  @delete="onDelete"/>

      双向绑定

      可以通过 v-model 绑定键盘当前输入值,并通过 maxlength 属性来限制输入长度。

      双向绑定

      <van-field v-model="value" readonly clickable @touchstart.stop="show = true" /><van-number-keyboard  v-model="value"  :show="show"  :maxlength="6"  @blur="show = false"/>
      import { ref } from 'vue';export default {  setup() {    const show = ref(true);    const value = ref('');    return {      show,      value,    };  },};

      API

      Props

      参数说明类型默认值
      v-model当前输入值string-
      show是否显示键盘boolean-
      title键盘标题string-
      theme样式风格,可选值为 customstringdefault
      maxlength输入值最大长度number | string-
      transition是否开启过场动画booleantrue
      z-index键盘 z-index 层级number | string100
      extra-key底部额外按键的内容string | string[]''
      close-button-text关闭按钮文字,空则不展示string-
      delete-button-text删除按钮文字,空则展示删除图标string-
      close-button-loading是否将关闭按钮设置为加载中状态,仅在 theme="custom" 时有效booleanfalse
      show-delete-key是否展示删除图标booleantrue
      blur-on-close v3.0.6是否在点击关闭按钮时触发 blur 事件booleantrue
      hide-on-click-outside是否在点击外部时收起键盘booleantrue
      teleport指定挂载的节点,用法示例string | Element-
      safe-area-inset-bottom是否开启底部安全区适配booleantrue
      random-key-order是否将通过随机顺序展示按键booleanfalse

      Events

      事件名说明回调参数
      input点击按键时触发key: 按键内容
      delete点击删除键时触发-
      close点击关闭按钮时触发-
      blur点击关闭按钮或非键盘区域时触发-
      show键盘完全弹出时触发-
      hide键盘完全收起时触发-

      Slots

      名称说明
      delete自定义删除按键内容
      extra-key自定义左下角按键内容
      title-left自定义标题栏左侧内容

      样式变量

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

      名称默认值描述
      --van-number-keyboard-background-colorvar(--van-gray-2)-
      --van-number-keyboard-key-height48px-
      --van-number-keyboard-key-font-size28px-
      --van-number-keyboard-key-active-colorvar(--van-gray-3)-
      --van-number-keyboard-delete-font-sizevar(--van-font-size-lg)-
      --van-number-keyboard-title-colorvar(--van-gray-7)-
      --van-number-keyboard-title-height34px-
      --van-number-keyboard-title-font-sizevar(--van-font-size-lg)-
      --van-number-keyboard-close-padding0 var(--van-padding-md)-
      --van-number-keyboard-close-colorvar(--van-text-link-color)-
      --van-number-keyboard-close-font-sizevar(--van-font-size-md)-
      --van-number-keyboard-button-text-colorvar(--van-white)-
      --van-number-keyboard-button-background-colorvar(--van-primary-color)-
      --van-number-keyboard-z-index100-

      常见问题

      在桌面端无法操作组件?

      参见桌面端适配


      介绍

      带网格的输入框组件,可以用于输入密码、短信验证码等场景,通常与数字键盘组件配合使用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { PasswordInput, NumberKeyboard } from 'vant';const app = createApp();app.use(PasswordInput);app.use(NumberKeyboard);

      代码演示

      基础用法

      搭配数字键盘组件来实现密码输入功能。


      <!-- 密码输入框 --><van-password-input  :value="value"  :focused="showKeyboard"  @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard  v-model="value"  :show="showKeyboard"  @blur="showKeyboard = false"/>
      import { ref } from 'vue';export default {  setup() {    const value = ref('123');    const showKeyboard = ref(true);    return {      value,      showKeyboard,    };  },};

      自定义长度

      通过 length 属性来设置密码长度。


      <van-password-input  :value="value"  :length="4"  :focused="showKeyboard"  @focus="showKeyboard = true"/>

      格子间距

      通过 gutter 属性来设置格子之间的间距。


      <van-password-input  :value="value"  :gutter="10"  :focused="showKeyboard"  @focus="showKeyboard = true"/>

      明文展示

      将 mask 设置为 false 可以明文展示输入的内容,适用于短信验证码等场景。


      <van-password-input  :value="value"  :mask="false"  :focused="showKeyboard"  @focus="showKeyboard = true"/>

      提示信息

      通过 info 属性设置提示信息,通过 error-info 属性设置错误提示,例如当输入六位时提示密码错误。


      <van-password-input  :value="value"  info="密码为 6 位数字"  :error-info="errorInfo"  :focused="showKeyboard"  @focus="showKeyboard = true"/><van-number-keyboard  v-model="value"  :show="showKeyboard"  @blur="showKeyboard = false"/>
      import { ref, watch } from 'vue';export default {  setup() {    const value = ref('123');    const errorInfo = ref('');    const showKeyboard = ref(true);    watch(value, (newVal) => {      if (newVal.length === 6 && newVal !== '123456') {        errorInfo.value = '密码错误';      } else {        errorInfo.value = '';      }    });    return {      value,      errorInfo,      showKeyboard,    };  },};

      API

      Props

      参数说明类型默认值
      value密码值string''
      info输入框下方文字提示string-
      error-info输入框下方错误提示string-
      length密码最大长度number | string6
      gutter输入框格子之间的间距,如 20px 2em,默认单位为pxnumber | string0
      mask是否隐藏密码内容booleantrue
      focused是否已聚焦,聚焦时会显示光标booleanfalse

      Events

      事件名说明回调参数
      focus输入框聚焦时触发-

      样式变量

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

      名称默认值描述
      --van-password-input-height50px-
      --van-password-input-margin0 var(--van-padding-md)-
      --van-password-input-font-size20px-
      --van-password-input-border-radius6px-
      --van-password-input-background-colorvar(--van-white)-
      --van-password-input-info-colorvar(--van-gray-6)-
      --van-password-input-info-font-sizevar(--van-font-size-md)-
      --van-password-input-error-info-colorvar(--van-danger-color)-
      --van-password-input-dot-size10px-
      --van-password-input-dot-colorvar(--van-black)-
      --van-password-input-cursor-colorvar(--van-text-color)-
      --van-password-input-cursor-width1px-
      --van-password-input-cursor-height40%-
      --van-password-input-cursor-animation-duration1s-


      介绍

      提供多个选项集合供用户选择,支持单列选择和多列级联,通常与弹出层组件配合使用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Picker } from 'vant';const app = createApp();app.use(Picker);

      代码演示

      基础用法

      选项配置

      Picker 组件通过 columns 属性配置选项数据,columns 是一个包含字符串或对象的数组。

      顶部栏

      顶部栏包含标题、确认按钮和取消按钮,点击确认按钮触发 confirm 事件,点击取消按钮触发 cancel 事件。

      基础用法

      <van-picker  title="标题"  :columns="columns"  @confirm="onConfirm"  @cancel="onCancel"  @change="onChange"/>
      import { Toast } from 'vant';export default {  setup() {    const columns = ['杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '金华'];    const onConfirm = (value, index) => {      Toast(`当前值: ${value}, 当前索引: ${index}`);    };    const onChange = (value, index) => {      Toast(`当前值: ${value}, 当前索引: ${index}`);    };    const onCancel = () => Toast('取消');    return {      columns,      onChange,      onCancel,      onConfirm,    };  },};

      默认选中项

      单列选择时,可以通过 default-index 属性设置初始选中项的索引。

      默认选中

      <van-picker title="标题" :columns="columns" :default-index="2" />

      多列选择

      columns 属性可以通过对象数组的形式配置多列选择,对象中可以配置选项数据、初始选中项等,详细格式见下方表格

      多列选择

      <van-picker title="标题" :columns="columns" />
      export default {  setup() {    const columns = [      // 第一列      {        values: ['周一', '周二', '周三', '周四', '周五'],        defaultIndex: 2,      },      // 第二列      {        values: ['上午', '下午', '晚上'],        defaultIndex: 1,      },    ];    return { columns };  },};

      级联选择

      使用 columns 的 children 字段可以实现选项级联的效果。如果级联层级较多,推荐使用 Cascader 级联选项组件

      级联选择

      <van-picker title="标题" :columns="columns" />
      export default {  setup() {    const columns = [      {        text: '浙江',        children: [          {            text: '杭州',            children: [{ text: '西湖区' }, { text: '余杭区' }],          },          {            text: '温州',            children: [{ text: '鹿城区' }, { text: '瓯海区' }],          },        ],      },      {        text: '福建',        children: [          {            text: '福州',            children: [{ text: '鼓楼区' }, { text: '台江区' }],          },          {            text: '厦门',            children: [{ text: '思明区' }, { text: '海沧区' }],          },        ],      },    ];    return { columns };  },};
      级联选择的数据嵌套深度需要保持一致,如果部分选项没有子选项,可以使用空字符串进行占位。

      禁用选项

      选项可以为对象结构,通过设置 disabled 来禁用该选项。

      禁用选项

      <van-picker :columns="columns" />
      export default {  setup() {    const columns = [      { text: '杭州', disabled: true },      { text: '宁波' },      { text: '温州' },    ];    return { columns };  },};

      动态设置选项

      通过 Picker 上的实例方法可以更灵活地控制选择器,比如使用 setColumnValues 方法实现多列联动。

      动态选项设置

      <van-picker ref="picker" :columns="columns" @change="onChange" />
      import { ref } from 'vue';export default {  setup() {    const picker = ref(null);    const cities = {      浙江: ['杭州', '宁波', '温州', '嘉兴', '湖州'],      福建: ['福州', '厦门', '莆田', '三明', '泉州'],    };    const columns = [      { values: Object.keys(cities) },      { values: cities['浙江'] },    ];    const onChange = (values) => {      picker.value.setColumnValues(1, cities[values[0]]);    };    return {      picker,      columns,      onChange,    };  },};

      加载状态

      若选择器数据是异步获取的,可以通过 loading 属性显示加载提示。

      加载状态

      <van-picker :columns="state.columns" :loading="state.loading" />
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      columns: [],      loading: true,    });    setTimeout(() => {      state.loading = false;      state.columns = ['选项'];    }, 1000);    return { state };  },};

      搭配弹出层使用

      在实际场景中,Picker 通常作为用于辅助表单填写,可以搭配 Popup 和 Field 实现该效果。

      搭配弹出层使用

      <van-field  v-model="state.value"  readonly  clickable  label="城市"  placeholder="选择城市"  @click="state.showPicker = true"/><van-popup v-model:show="state.showPicker" round position="bottom">  <van-picker    :columns="columns"    @cancel="state.showPicker = false"    @confirm="onConfirm"  /></van-popup>
      import { reactive } from 'vue';export default {  setup() {    const columns = ['杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '金华'];    const state = reactive({      value: '',      showPicker: false,    });    const onConfirm = (value) => {      state.value = value;      state.showPicker = false;    };    return {      state,      columns,      onConfirm,    };  },};

      自定义 Columns 的结构

      自定义

      <van-picker  :title="标题"  :columns="columns"  :columns-field-names="customFieldName"/>
      export default {  setup() {    const columns = [      {        cityName: '浙江',        cities: [          {            cityName: '杭州',            cities: [{ cityName: '西湖区' }, { cityName: '余杭区' }],          },          {            cityName: '温州',            cities: [{ cityName: '鹿城区' }, { cityName: '瓯海区' }],          },        ],      },      {        cityName: '福建',        cities: [          {            cityName: '福州',            cities: [{ cityName: '鼓楼区' }, { cityName: '台江区' }],          },          {            cityName: '厦门',            cities: [{ cityName: '思明区' }, { cityName: '海沧区' }],          },        ],      },    ];    const customFieldName = {      text: 'cityName',      children: 'cities',    };    return {      columns,      customFieldName,    };  },};

      API

      Props

      参数说明类型默认值
      columns对象数组,配置每一列显示的数据Column[][]
      columns-field-names自定义 columns 结构中的字段object{ text: 'text', values: 'values', children: 'children' }
      title顶部栏标题string-
      confirm-button-text确认按钮文字string确认
      cancel-button-text取消按钮文字string取消
      toolbar-position顶部栏位置,可选值为 bottomstringtop
      loading是否显示加载状态booleanfalse
      show-toolbar是否显示顶部栏booleantrue
      allow-html是否允许选项内容中渲染 HTMLbooleanfalse
      default-index单列选择时,默认选中项的索引number | string0
      item-height选项高度,支持 px vw vh rem 单位,默认 pxnumber | string44
      visible-item-count可见的选项个数number | string6
      swipe-duration快速滑动时惯性滚动的时长,单位 msnumber | string1000

      Events

      当选择器有多列时,事件回调参数会返回数组。

      事件名说明回调参数
      confirm点击完成按钮时触发单列:选中值,选中值对应的索引
      多列:所有列选中值,所有列选中值对应的索引
      cancel点击取消按钮时触发单列:选中值,选中值对应的索引
      多列:所有列选中值,所有列选中值对应的索引
      change选项改变时触发单列:选中值,选中值对应的索引
      多列:所有列选中值,当前列对应的索引

      Slots

      名称说明参数
      toolbar v3.1.2自定义整个顶部栏的内容-
      title自定义标题内容-
      confirm自定义确认按钮内容-
      cancel自定义取消按钮内容-
      option自定义选项内容option: string | object
      columns-top自定义选项上方内容-
      columns-bottom自定义选项下方内容-

      Column 数据结构

      当传入多列数据时,columns 为一个对象数组,数组中的每一个对象配置每一列,每一列有以下 key:

      键名说明类型
      values列中对应的备选值Array<string | number>
      defaultIndex初始选中项的索引,默认为 0number
      className为对应列添加额外的类名string | Array | object
      children级联选项Column

      方法

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

      方法名说明参数返回值
      getValues获取所有列选中的值-values
      setValues设置所有列选中的值values-
      getIndexes获取所有列选中值对应的索引-indexes
      setIndexes设置所有列选中值对应的索引indexes-
      getColumnValue获取对应列选中的值columnIndexvalue
      setColumnValue设置对应列选中的值columnIndex, value-
      getColumnIndex获取对应列选中项的索引columnIndexoptionIndex
      setColumnIndex设置对应列选中项的索引columnIndex, optionIndex-
      getColumnValues获取对应列中所有选项columnIndexvalues
      setColumnValues设置对应列中所有选项columnIndex, values-
      confirm停止惯性滚动并触发 confirm 事件--

      样式变量

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

      名称默认值描述
      --van-picker-background-colorvar(--van-white)-
      --van-picker-toolbar-height44px-
      --van-picker-title-font-sizevar(--van-font-size-lg)-
      --van-picker-title-line-heightvar(--van-line-height-md)-
      --van-picker-action-padding0 var(--van-padding-md)-
      --van-picker-action-font-sizevar(--van-font-size-md)-
      --van-picker-confirm-action-colorvar(--van-text-link-color)-
      --van-picker-cancel-action-colorvar(--van-gray-6)-
      --van-picker-option-padding0 var(--van-padding-base)-
      --van-picker-option-font-sizevar(--van-font-size-lg)-
      --van-picker-option-text-colorvar(--van-black)-
      --van-picker-option-disabled-opacity0.3-
      --van-picker-loading-icon-colorvar(--van-primary-color)-
      --van-picker-loading-mask-colorrgba(255, 255, 255, 0.9)-

      常见问题

      在桌面端无法操作组件?

      参见桌面端适配


      介绍

      在一组备选项中进行单选。

      实例演示

      引入

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

      import { createApp } from 'vue';import { RadioGroup, Radio } from 'vant';const app = createApp();app.use(Radio);app.use(RadioGroup);

      代码演示

      基础用法

      通过 v-model 绑定值当前选中项的 name。


      <van-radio-group v-model="checked">  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>
      import { ref } from 'vue';export default {  setup() {    const checked = ref('1');    return { checked };  },};

      水平排列

      将 direction 属性设置为 horizontal 后,单选框组会变成水平排列。


      <van-radio-group v-model="checked" direction="horizontal">  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>

      禁用状态

      通过 disabled 属性禁止选项切换,在 Radio 上设置 disabled 可以禁用单个选项。


      <van-radio-group v-model="checked" disabled>  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>

      自定义形状

      将 shape 属性设置为 square,单选框的形状会变成方形。


      <van-radio-group v-model="checked">  <van-radio name="1" shape="square">单选框 1</van-radio>  <van-radio name="2" shape="square">单选框 2</van-radio></van-radio-group>

      自定义颜色

      通过 checked-color 属性设置选中状态的图标颜色。


      <van-radio-group v-model="checked">  <van-radio name="1" checked-color="#ee0a24">单选框 1</van-radio>  <van-radio name="2" checked-color="#ee0a24">单选框 2</van-radio></van-radio-group>

      自定义大小

      通过 icon-size 属性可以自定义图标的大小。


      <van-radio-group v-model="checked">  <van-radio name="1" icon-size="24px">单选框 1</van-radio>  <van-radio name="2" icon-size="24px">单选框 2</van-radio></van-radio-group>

      自定义图标

      通过 icon 插槽自定义图标,并通过 slotProps 判断是否为选中状态。


      <van-radio-group v-model="checked">  <van-radio name="1">    单选框 1    <template #icon="props">      <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" />    </template>  </van-radio>  <van-radio name="2">    单选框 2    <template #icon="props">      <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" />    </template>  </van-radio></van-radio-group><style>  .img-icon {    height: 20px;  }</style>
      import { ref } from 'vue';export default {  setup() {    const checked = ref('1');    return {      checked,      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

      禁用文本点击

      设置 label-disabled 属性后,点击图标以外的内容不会触发单选框切换。


      <van-radio-group v-model="checked">  <van-radio name="1" label-disabled>单选框 1</van-radio>  <van-radio name="2" label-disabled>单选框 2</van-radio></van-radio-group>

      与 Cell 组件一起使用

      此时你需要再引入 Cell 和 CellGroup 组件。


      <van-radio-group v-model="checked">  <van-cell-group>    <van-cell title="单选框 1" clickable @click="checked = '1'">      <template #right-icon>        <van-radio name="1" />      </template>    </van-cell>    <van-cell title="单选框 2" clickable @click="checked = '2'">      <template #right-icon>        <van-radio name="2" />      </template>    </van-cell>  </van-cell-group></van-radio-group>

      API

      Radio Props

      参数说明类型默认值
      name标识符any-
      shape形状,可选值为 squarestringround
      disabled是否为禁用状态booleanfalse
      label-disabled是否禁用文本内容点击booleanfalse
      label-position文本位置,可选值为 leftstringright
      icon-size图标大小,默认单位为pxnumber | string20px
      checked-color选中状态颜色string#1989fa

      RadioGroup Props

      参数说明类型默认值
      v-model当前选中项的标识符any-
      disabled是否禁用所有单选框booleanfalse
      direction排列方向,可选值为horizontalstringvertical
      icon-size所有单选框的图标大小,默认单位为pxnumber | string20px
      checked-color所有单选框的选中状态颜色string#1989fa

      Radio Events

      事件名说明回调参数
      click点击单选框时触发event: MouseEvent

      RadioGroup Events

      事件名说明回调参数
      change当绑定值变化时触发的事件name: string

      Radio Slots

      名称说明参数
      default自定义文本-
      icon自定义图标{ checked: boolean, disabled: boolean }

      样式变量

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

      名称默认值描述
      --van-radio-size20px-
      --van-radio-border-colorvar(--van-gray-5)-
      --van-radio-transition-durationvar(--van-animation-duration-fast)-
      --van-radio-label-marginvar(--van-padding-xs)-
      --van-radio-label-colorvar(--van-text-color)-
      --van-radio-checked-icon-colorvar(--van-primary-color)-
      --van-radio-disabled-icon-colorvar(--van-gray-5)-
      --van-radio-disabled-label-colorvar(--van-gray-5)-
      --van-radio-disabled-background-colorvar(--van-border-color)-


      介绍

      用于对事物进行评级操作。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Rate } from 'vant';const app = createApp();app.use(Rate);

      代码演示

      基础用法

      通过 v-model 来绑定当前评分值。


      <van-rate v-model="value" />
      import { ref } from 'vue';export default {  setup() {    const value = ref(3);    return { value };  },};

      自定义图标

      通过 icon 属性设置选中时的图标,void-icon 属性设置未选中时的图标。


      <van-rate v-model="value" icon="like" void-icon="like-o" />

      自定义样式

      通过 size 属性设置图标大小,color 属性设置选中时的颜色,void-color 设置未选中时的颜色。


      <van-rate  v-model="value"  :size="25"  color="#ffd21e"  void-icon="star"  void-color="#eee"/>

      半星

      设置 allow-half 属性后可以选中半星。


      <van-rate v-model="value" allow-half />
      import { ref } from 'vue';export default {  setup() {    const value = ref(2.5);    return { value };  },};

      自定义数量

      通过 count 属性设置评分总数。


      <van-rate v-model="value" :count="6" />

      禁用状态

      通过 disabled 属性来禁用评分。


      <van-rate v-model="value" disabled />

      只读状态

      通过 readonly 属性将评分设置为只读状态。


      <van-rate v-model="value" readonly />

      只读状态显示小数

      设置 readonly 和 allow-half 属性后,Rate 组件可以展示任意小数结果。


      <van-rate v-model="value" readonly allow-half />
      import { ref } from 'vue';export default {  setup() {    const value = ref(3.3);    return { value };  },};

      监听 change 事件

      评分变化时,会触发 change 事件。


      <van-rate v-model="value" @change="onChange" />
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(3);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      onChange,    };  },};

      API

      Props

      参数说明类型默认值
      v-model当前分值number-
      count图标总数number | string5
      size图标大小,默认单位为pxnumber | string20px
      gutter图标间距,默认单位为pxnumber | string4px
      color选中时的颜色string#ee0a24
      void-color未选中时的颜色string#c8c9cc
      disabled-color禁用时的颜色string#c8c9cc
      icon选中时的图标名称或图片链接stringstar
      void-icon未选中时的图标名称或图片链接stringstar-o
      icon-prefix图标类名前缀,同 Icon 组件的 class-prefix 属性stringvan-icon
      allow-half是否允许半选booleanfalse
      readonly是否为只读状态,只读状态下无法修改评分booleanfalse
      disabled是否禁用评分booleanfalse
      touchable是否可以通过滑动手势选择评分booleantrue

      Events

      事件名说明回调参数
      change当前分值变化时触发的事件当前分值

      样式变量

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

      名称默认值描述
      --van-rate-icon-size20px-
      --van-rate-icon-guttervar(--van-padding-base)-
      --van-rate-icon-void-colorvar(--van-gray-5)-
      --van-rate-icon-full-colorvar(--van-danger-color)-
      --van-rate-icon-disabled-colorvar(--van-gray-5)-


      介绍

      用于搜索场景的输入框组件。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Search } from 'vant';const app = createApp();app.use(Search);

      代码演示

      基础用法

      v-model 用于控制搜索框中的文字,background 可以自定义搜索框外部背景色。


      <van-search v-model="value" placeholder="请输入搜索关键词" />
      import { ref } from 'vue';export default {  setup() {    const value = ref('');    return { value };  },};

      事件监听

      Search 组件提供了 search 和 cancel 事件,search 事件在点击键盘上的搜索/回车按钮后触发,cancel 事件在点击搜索框右侧取消按钮时触发。


      <form action="/">  <van-search    v-model="value"    show-action    placeholder="请输入搜索关键词"    @search="onSearch"    @cancel="onCancel"  /></form>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref('');    const onSearch = (val) => Toast(val);    const onCancel = () => Toast('取消');    return {      value,      onSearch,      onCancel,    };  },};
      Tips: 在 van-search 外层增加 form 标签,且 action 不为空,即可在 iOS 输入法中显示搜索按钮。

      搜索框内容对齐

      通过 input-align 属性设置搜索框内容的对齐方式,可选值为 center、right。


      <van-search  v-model="value"  placeholder="请输入搜索关键词"  input-align="center"/>

      禁用搜索框

      通过 disabled 属性禁用搜索框。


      <van-search v-model="value" disabled placeholder="请输入搜索关键词" />

      自定义背景色

      通过 background 属性可以设置搜索框外部的背景色,通过 shape 属性设置搜索框的形状,可选值为 round。


      <van-search  v-model="value"  shape="round"  background="#4fc08d"  placeholder="请输入搜索关键词"/>

      自定义按钮

      使用 action 插槽可以自定义右侧按钮的内容。使用插槽后,cancel 事件将不再触发。


      <van-search  v-model="value"  show-action  label="地址"  placeholder="请输入搜索关键词"  @search="onSearch">  <template #action>    <div @click="onSearch">搜索</div>  </template></van-search>

      API

      Props

      参数说明类型默认值
      label搜索框左侧文本string-
      shape搜索框形状,可选值为 roundstringsquare
      background搜索框外部背景色string#f2f2f2
      maxlength输入的最大字符数number | string-
      placeholder占位提示文字string-
      clearable是否启用清除图标,点击清除图标后会清空输入框booleantrue
      clear-icon v3.0.12清除图标名称或图片链接stringclear
      clear-trigger显示清除图标的时机,always 表示输入框不为空时展示,
      focus 表示输入框聚焦且不为空时展示
      stringfocus
      autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
      show-action是否在搜索框右侧显示取消按钮booleanfalse
      action-text取消按钮文字boolean取消
      disabled是否禁用输入框booleanfalse
      readonly是否将输入框设为只读状态,只读状态下无法输入内容booleanfalse
      error是否将输入内容标红booleanfalse
      error-message底部错误提示文案,为空时不展示string-
      formatter v3.0.12输入内容格式化函数(val: string) => string-
      format-trigger v3.0.12格式化函数触发的时机,可选值为 onBlurstringonChange
      input-align输入框内容对齐方式,可选值为 center rightstringleft
      left-icon输入框左侧图标名称或图片链接stringsearch
      right-icon输入框右侧图标名称或图片链接string-

      Events

      事件名说明回调参数
      search确定搜索时触发value: string (当前输入的值)
      update:model-value输入框内容变化时触发value: string (当前输入的值)
      focus输入框获得焦点时触发event: Event
      blur输入框失去焦点时触发event: Event
      click-input点击输入区域时触发event: MouseEvent
      clear点击清除按钮后触发event: MouseEvent
      cancel点击取消按钮时触发-

      方法

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

      方法名说明参数返回值
      focus获取输入框焦点--
      blur取消输入框焦点--

      Slots

      名称说明
      left自定义左侧内容(搜索框外)
      action自定义右侧内容(搜索框外),设置show-action属性后展示
      label自定义左侧文本(搜索框内)
      left-icon自定义左侧图标(搜索框内)
      right-icon自定义右侧图标(搜索框内)

      样式变量

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

      名称默认值描述
      --van-search-padding10px var(--van-padding-sm)-
      --van-search-background-colorvar(--van-white)-
      --van-search-content-background-colorvar(--van-gray-1)-
      --van-search-input-height34px-
      --van-search-label-padding0 5px-
      --van-search-label-colorvar(--van-text-color)-
      --van-search-label-font-sizevar(--van-font-size-md)-
      --van-search-left-icon-colorvar(--van-gray-6)-
      --van-search-action-padding0 var(--van-padding-xs)-
      --van-search-action-text-colorvar(--van-text-color)-
      --van-search-action-font-sizevar(--van-font-size-md)-

      常见问题

      在桌面端点击清除按钮无效?

      清除按钮监听是的移动端 Touch 事件,参见桌面端适配


      介绍

      滑动输入条,用于在给定的范围内选择一个值。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Slider } from 'vant';const app = createApp();app.use(Slider);

      代码演示

      基础用法


      <van-slider v-model="value" @change="onChange" />
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(50);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      onChange,    };  },};

      双滑块

      添加 range 属性就可以开启双滑块模式,确保 value 的值是一个数组。


      <van-slider v-model="value" range @change="onChange" />
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    // 双滑块模式时,值必须是数组    const value = ref([10, 50]);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      onChange,    };  },};

      指定选择范围


      <van-slider v-model="value" :min="-50" :max="50" />

      禁用


      <van-slider v-model="value" disabled />

      指定步长


      <van-slider v-model="value" :step="10" />

      自定义样式


      <van-slider v-model="value" bar-height="4px" active-color="#ee0a24" />

      自定义按钮


      <van-slider v-model="value" active-color="#ee0a24">  <template #button>    <div class="custom-button">{{ value }}</div>  </template></van-slider><style>  .custom-button {    width: 26px;    color: #fff;    font-size: 10px;    line-height: 18px;    text-align: center;    background-color: #ee0a24;    border-radius: 100px;  }</style>

      垂直方向

      设置 vertical 属性后,滑块会垂直展示,且高度为 100% 父元素高度。


      <div :style="{ height: '150px' }">  <van-slider v-model="value" vertical @change="onChange" />  <van-slider    v-model="value2"    range    vertical    style="margin-left: 100px;"    @change="onChange"  /></div>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(50);    const value2 = ref([10, 50]);    const onChange = (value) => Toast('当前值:' + value);    return {      value,      value2,      onChange,    };  },};

      API

      Props

      参数说明类型默认值
      v-model当前进度百分比,在双滑块模式下为数组格式number | [number, number]0
      max最大值number | string100
      min最小值number | string0
      step步长number | string1
      bar-height进度条高度,默认单位为 pxnumber | string2px
      button-size滑块按钮大小,默认单位为 pxnumber | string24px
      active-color进度条激活态颜色string#1989fa
      inactive-color进度条非激活态颜色string#e5e5e5
      range是否开启双滑块模式booleanfalse
      disabled是否禁用滑块booleanfalse
      readonly v3.0.5是否为只读状态,只读状态下无法修改滑块的值booleanfalse
      vertical是否垂直展示booleanfalse

      Events

      事件名说明回调参数
      update:model-value进度变化时实时触发value: number
      change进度变化且结束拖动后触发value: number
      drag-start开始拖动时触发event: TouchEvent
      drag-end结束拖动时触发event: TouchEvent

      Slots

      名称说明参数
      button自定义滑块按钮{ value: number }
      left-button v3.1.3自定义左侧滑块按钮(双滑块模式下){ value: number }
      right-button v3.1.3自定义右侧滑块按钮 (双滑块模式下){ value: number }

      样式变量

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

      名称默认值描述
      --van-slider-active-background-colorvar(--van-primary-color)-
      --van-slider-inactive-background-colorvar(--van-gray-3)-
      --van-slider-disabled-opacityvar(--van-disabled-opacity)-
      --van-slider-bar-height2px-
      --van-slider-button-width24px-
      --van-slider-button-height24px-
      --van-slider-button-border-radius50%-
      --van-slider-button-background-colorvar(--van-white)-
      --van-slider-button-box-shadow0 1px 2px rgba(0, 0, 0, 0.5)-


      介绍

      步进器由增加按钮、减少按钮和输入框组成,用于在一定范围内输入、调整数字。

      实例演示

      引入

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


      import { createApp } from 'vue';import { Stepper } from 'vant';const app = createApp();app.use(Stepper);

      代码演示

      基础用法

      通过 v-model 绑定输入值,可以通过 change 事件监听到输入值的变化。

      <van-stepper v-model="value" />
      import { ref } from 'vue';export default {  setup() {    const value = ref(1);    return { value };  },};

      步长设置

      通过 step 属性设置每次点击增加或减少按钮时变化的值,默认为 1。

      <van-stepper v-model="value" step="2" />

      限制输入范围

      通过 min 和 max 属性限制输入值的范围。

      <van-stepper v-model="value" min="5" max="8" />

      限制输入整数

      设置 integer 属性后,输入框将限制只能输入整数。

      <van-stepper v-model="value" integer />

      禁用状态

      通过设置 disabled 属性来禁用步进器,禁用状态下无法点击按钮或修改输入框。

      <van-stepper v-model="value" disabled />

      禁用输入框

      通过设置 disable-input 属性来禁用输入框,此时按钮仍然可以点击。

      <van-stepper v-model="value" disable-input />

      固定小数位数

      通过设置 decimal-length 属性可以保留固定的小数位数。

      <van-stepper v-model="value" step="0.2" :decimal-length="1" />

      自定义大小

      通过 input-width 属性设置输入框宽度,通过 button-size 属性设置按钮大小和输入框高度。

      <van-stepper v-model="value" input-width="40px" button-size="32px" />

      异步变更

      通过 before-change 属性可以在输入值变化前进行校验和拦截。

      <van-stepper v-model="value" :before-change="beforeChange" />
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const value = ref(1);    const beforeChange = (value) => {      Toast.loading({ forbidClick: true });      return new Promise((resolve) => {        setTimeout(() => {          Toast.clear();          // 在 resolve 函数中返回 true 或 false          resolve(true);        }, 500);      });    };    return {      value,      beforeChange,    };  },};

      圆角风格

      将 theme 设置为 round 来展示圆角风格的步进器。

      <van-stepper v-model="value" theme="round" button-size="22" disable-input />

      API

      Props

      参数说明类型默认值
      v-model当前输入的值number | string-
      min最小值number | string1
      max最大值number | string-
      default-value初始值,当 v-model 为空时生效number | string1
      step步长,每次点击时改变的值number | string1
      name标识符,可以在 change 事件回调参数中获取number | string-
      input-width输入框宽度,默认单位为 pxnumber | string32px
      button-size按钮大小以及输入框高度,默认单位为 pxnumber | string28px
      decimal-length固定显示的小数位数number | string-
      theme样式风格,可选值为 roundstring-
      placeholder输入框占位提示文字string-
      integer是否只允许输入整数booleanfalse
      disabled是否禁用步进器booleanfalse
      disable-plus是否禁用增加按钮booleanfalse
      disable-minus是否禁用减少按钮booleanfalse
      disable-input是否禁用输入框booleanfalse
      before-change输入值变化前的回调函数,返回 false 可阻止输入,支持返回 Promise(value: number | string) => boolean | Promise<boolean>false
      show-plus是否显示增加按钮booleantrue
      show-minus是否显示减少按钮booleantrue
      show-input是否显示输入框booleantrue
      long-press是否开启长按手势booleantrue
      allow-empty是否允许输入的值为空booleanfalse

      Events

      事件名说明回调参数
      change当绑定值变化时触发的事件value: string, detail: { name: string }
      overlimit点击不可用的按钮时触发-
      plus点击增加按钮时触发-
      minus点击减少按钮时触发-
      focus输入框聚焦时触发event: Event
      blur输入框失焦时触发event: Event

      样式变量

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

      名称默认值描述
      --van-stepper-active-color#e8e8e8-
      --van-stepper-background-colorvar(--van-active-color)-
      --van-stepper-button-icon-colorvar(--van-text-color)-
      --van-stepper-button-disabled-colorvar(--van-background-color)-
      --van-stepper-button-disabled-icon-colorvar(--van-gray-5)-
      --van-stepper-button-round-theme-colorvar(--van-danger-color)-
      --van-stepper-input-width32px-
      --van-stepper-input-height28px-
      --van-stepper-input-font-sizevar(--van-font-size-md)-
      --van-stepper-input-line-heightnormal-
      --van-stepper-input-text-colorvar(--van-text-color)-
      --van-stepper-input-disabled-text-colorvar(--van-gray-5)-
      --van-stepper-input-disabled-background-colorvar(--van-active-color)-
      --van-stepper-border-radiusvar(--van-border-radius-md)-

      常见问题

      为什么 value 有时候会变成 string 类型?

      这是因为用户输入过程中可能出现小数点或空值,比如 1.,这种情况下组件会抛出字符串类型。

      如果希望 value 保持 number 类型,可以在 v-model 上添加 number 修饰符:

      <van-stepper v-model.number="value" />


      介绍

      用于在打开和关闭状态之间进行切换。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Switch } from 'vant';const app = createApp();app.use(Switch);

      代码演示

      基础用法

      通过 v-model 绑定开关的选中状态,true 表示开,false 表示关。

      <van-switch v-model="checked" />
      import { ref } from 'vue';export default {  setup() {    const checked = ref(true);    return { checked };  },};

      禁用状态

      通过 disabled 属性来禁用开关,禁用状态下开关不可点击。

      <van-switch v-model="checked" disabled />

      加载状态

      通过 loading 属性设置开关为加载状态,加载状态下开关不可点击。

      <van-switch v-model="checked" loading />

      自定义大小

      通过 size 属性自定义开关的大小。

      <van-switch v-model="checked" size="24px" />

      自定义颜色

      active-color 属性表示打开时的背景色,inactive-color 表示关闭时的背景色。

      <van-switch v-model="checked" active-color="#ee0a24" inactive-color="#dcdee0" />

      异步控制

      需要异步控制开关时,可以使用 modelValue 属性和 update:model-value 事件代替 v-model,并在事件回调函数中手动处理开关状态。

      <van-switch :model-value="checked" @update:model-value="onUpdateValue" />
      import { ref } from 'vue';import { Dialog } from 'vant';export default {  setup() {    const checked = ref(true);    const onUpdateValue = (newValue) => {      Dialog.confirm({        title: '提醒',        message: '是否切换开关?',      }).then(() => {        checked.value = newValue;      });    };    return {      checked,      onUpdateValue,    };  },};

      搭配单元格使用

      <van-cell center title="标题">  <template #right-icon>    <van-switch v-model="checked" size="24" />  </template></van-cell>

      API

      Props

      参数说明类型默认值
      v-model开关选中状态anyfalse
      loading是否为加载状态booleanfalse
      disabled是否为禁用状态booleanfalse
      size开关尺寸,默认单位为pxnumber | string30px
      active-color打开时的背景色string#1989fa
      inactive-color关闭时的背景色stringwhite
      active-value打开时对应的值anytrue
      inactive-value关闭时对应的值anyfalse

      Events

      事件名说明回调参数
      change开关状态切换时触发value: any
      click点击时触发event: MouseEvent

      样式变量

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

      名称默认值描述
      --van-switch-size30px-
      --van-switch-width2em-
      --van-switch-height1em-
      --van-switch-node-size1em-
      --van-switch-node-background-colorvar(--van-white)-
      --van-switch-node-box-shadow0 3px 1px 0 rgba(0, 0, 0, 0.05)-
      --van-switch-background-colorvar(--van-white)-
      --van-switch-on-background-colorvar(--van-primary-color)-
      --van-switch-transition-durationvar(--van-animation-duration-base)-
      --van-switch-disabled-opacityvar(--van-disabled-opacity)-
      --van-switch-bordervar(--van-border-width-base) solid rgba(0, 0, 0, 0.1)-


      介绍

      用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图和上传进度。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Uploader } from 'vant';const app = createApp();app.use(Uploader);

      代码演示

      基础用法

      文件上传完毕后会触发 after-read 回调函数,获取到对应的 file 对象。

      <van-uploader :after-read="afterRead" />
      export default {  setup() {    const afterRead = (file) => {      // 此时可以自行将文件上传至服务器      console.log(file);    };    return {      afterRead,    };  },};

      文件预览

      通过 v-model 可以绑定已经上传的文件列表,并展示文件列表的预览图。

      <van-uploader v-model="fileList" multiple />
      import { ref } from 'vue';export default {  setup() {    const fileList = ref([      { url: 'https://img.yzcdn.cn/vant/leaf.jpg' },      // Uploader 根据文件后缀来判断是否为图片文件      // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明      { url: 'https://cloud-image', isImage: true },    ]);    return {      fileList,    };  },};

      上传状态

      通过 status 属性可以标识上传状态,uploading 表示上传中,failed 表示上传失败,done 表示上传完成。

      <van-uploader v-model="fileList" :after-read="afterRead" />
      import { ref } from 'vue';export default {  setup() {    const fileList = ref([      {        url: 'https://img.yzcdn.cn/vant/leaf.jpg',        status: 'uploading',        message: '上传中...',      },      {        url: 'https://img.yzcdn.cn/vant/tree.jpg',        status: 'failed',        message: '上传失败',      },    ]);    const afterRead = (file) => {      file.status = 'uploading';      file.message = '上传中...';      setTimeout(() => {        file.status = 'failed';        file.message = '上传失败';      }, 1000);    };    return {      fileList,      afterRead,    };  },};

      限制上传数量

      通过 max-count 属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。

      <van-uploader v-model="fileList" multiple :max-count="2" />
      import { ref } from 'vue';export default {  setup() {    const fileList = ref([]);    return {      fileList,    };  },};

      限制上传大小

      通过 max-size 属性可以限制上传文件的大小,超过大小的文件会被自动过滤,这些文件信息可以通过 oversize 事件获取。

      <van-uploader multiple :max-size="500 * 1024" @oversize="onOversize" />
      import { Toast } from 'vant';export default {  setup() {    const onOversize = (file) => {      console.log(file);      Toast('文件大小不能超过 500kb');    };    return {      onOversize,    };  },};

      如果需要针对不同类型的文件来作出不同的大小限制,可以在 max-size 属性中传入一个函数,在函数中通过 file.type 区分文件类型,返回 true 表示超出限制,false 表示未超出限制。

      <van-uploader multiple :max-size="isOverSize" />
      import { Toast } from 'vant';export default {  setup() {    const isOverSize = (file) => {      const maxSize = file.type === 'image/jpeg' ? 500 * 1024 : 1000 * 1024;      return file.size >= maxSize;    };    return {      isOverSize,    };  },};

      自定义上传样式

      通过默认插槽可以自定义上传区域的样式。

      <van-uploader>  <van-button icon="plus" type="primary">上传文件</van-button></van-uploader>

      自定义预览样式

      通过 preview-cover 插槽可以自定义覆盖在预览区域上方的内容。

      <van-uploader v-model="fileList">  <template #preview-cover="{ file }">    <div class="preview-cover van-ellipsis">{{ file.name }}</div>  </template></van-uploader><style>  .preview-cover {    position: absolute;    bottom: 0;    box-sizing: border-box;    width: 100%;    padding: 4px;    color: #fff;    font-size: 12px;    text-align: center;    background: rgba(0, 0, 0, 0.3);  }</style>

      上传前置处理

      通过传入 beforeRead 函数可以在上传前进行校验和处理,返回 true 表示校验通过,返回 false 表示校验失败。支持返回 Promise 对 file 对象进行自定义处理,例如压缩图片。

      <van-uploader :before-read="beforeRead" />
      import { Toast } from 'vant';export default {  setup() {    // 返回布尔值    const beforeRead = (file) => {      if (file.type !== 'image/jpeg') {        Toast('请上传 jpg 格式图片');        return false;      }      return true;    };    // 返回 Promise    const asyncBeforeRead = (file) => {      return new Promise((resolve, reject) => {        if (file.type !== 'image/jpeg') {          Toast('请上传 jpg 格式图片');          reject();        } else {          const img = new File(['foo'], 'bar.jpg', {            type: 'image/jpeg',          });          resolve(img);        }      });    };    return {      beforeRead,      asyncBeforeRead,    };  },};

      禁用文件上传

      通过 disabled 属性禁用文件上传。

      <van-uploader disabled />

      自定义单个图片预览

      在 v-model 数组中设置单个预览图片属性,支持 imageFit deletable previewSize beforeDelete。

      <van-uploader v-model="fileList" :deletable="false" />
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const fileList = ref([      { url: 'https://img.yzcdn.cn/vant/leaf.jpg' },      {        url: 'https://img.yzcdn.cn/vant/sand.jpg',        deletable: true,        beforeDelete: () => {          Toast('自定义单个预览图片的事件和样式');        },      },      {        url: 'https://img.yzcdn.cn/vant/tree.jpg',        deletable: true,        imageFit: 'contain',        previewSize: 120,      },    ]);    return { fileList };  },};

      API

      Props

      参数说明类型默认值
      v-model已上传的文件列表FileListItem[]-
      accept允许上传的文件类型,详细说明stringimage/*
      name标识符,可以在回调函数的第二项参数中获取number | string-
      preview-size预览图和上传区域的尺寸,默认单位为 pxnumber | string80px
      preview-image是否在上传完成后展示预览图booleantrue
      preview-full-image是否在点击预览图后展示全屏图片预览booleantrue
      preview-options全屏图片预览的配置项,可选值见 ImagePreviewobject-
      multiple是否开启图片多选,部分安卓机型不支持booleanfalse
      disabled是否禁用文件上传booleanfalse
      readonly v3.1.5是否将上传区域设置为只读状态booleanfalse
      deletable是否展示删除按钮booleantrue
      show-upload是否展示上传区域booleantrue
      lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
      capture图片选取模式,可选值为 camera (直接调起摄像头)string-
      after-read文件读取完成后的回调函数Function-
      before-read文件读取前的回调函数,返回 false 可终止文件读取,
      支持返回 Promise
      Function-
      before-delete文件删除前的回调函数,返回 false 可终止文件读取,
      支持返回 Promise
      Function-
      max-size v3.0.17文件大小限制,单位为 bytenumber | string | (file: File) => boolean-
      max-count文件上传数量限制number | string-
      result-type文件读取结果类型,可选值为 file textstringdataUrl
      upload-text上传区域文字提示string-
      image-fit预览图裁剪模式,可选值见 Image 组件stringcover
      upload-icon上传区域图标名称或图片链接stringphotograph
      注意:accept、capture 和 multiple 为浏览器 input 标签的原生属性,移动端各种机型对这些属性的支持程度有所差异,因此在不同机型和 WebView 下可能出现一些兼容性问题。

      Events

      事件名说明回调参数
      oversize文件大小超过限制时触发同 after-read
      click-upload v3.1.5点击上传区域时触发event: MouseEvent
      click-preview点击预览图时触发同 after-read
      close-preview关闭全屏图片预览时触发-
      delete删除文件预览时触发同 after-read

      Slots

      名称说明参数
      default自定义上传区域-
      preview-cover自定义覆盖在预览区域上方的内容item: FileListItem

      回调参数

      before-read、after-read、before-delete 执行时会传递以下回调参数:

      参数名说明类型
      filefile 对象object
      detail额外信息,包含 name 和 index 字段object

      ResultType 可选值

      result-type 字段表示文件读取结果的类型,上传大文件时,建议使用 file 类型,避免卡顿。

      描述
      file结果仅包含 File 对象
      text结果包含 File 对象,以及文件的文本内容
      dataUrl结果包含 File 对象,以及文件对应的 base64 编码

      方法

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

      方法名说明参数返回值
      closeImagePreview关闭全屏的图片预览--
      chooseFile主动调起文件选择,由于浏览器安全限制,只有在用户触发操作的上下文中调用才有效--

      类型定义

      通过 UploaderInstance 获取 Uploader 实例的类型定义。

      import { ref } from 'vue';import type { UploaderInstance } from 'vant';const uploaderRef = ref<UploaderInstance>();uploaderRef.value?.chooseFile();

      样式变量

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

      名称默认值描述
      --van-uploader-size80px-
      --van-uploader-icon-size24px-
      --van-uploader-icon-colorvar(--van-gray-4)-
      --van-uploader-text-colorvar(--van-gray-6)-
      --van-uploader-text-font-sizevar(--van-font-size-sm)-
      --van-uploader-upload-background-colorvar(--van-gray-1)-
      --van-uploader-upload-active-colorvar(--van-active-color)-
      --van-uploader-delete-colorvar(--van-white)-
      --van-uploader-delete-icon-size14px-
      --van-uploader-delete-background-colorrgba(0, 0, 0, 0.7)-
      --van-uploader-file-background-colorvar(--van-background-color)-
      --van-uploader-file-icon-size20px-
      --van-uploader-file-icon-colorvar(--van-gray-7)-
      --van-uploader-file-name-padding0 var(--van-padding-base)-
      --van-uploader-file-name-margin-topvar(--van-padding-xs)-
      --van-uploader-file-name-font-sizevar(--van-font-size-sm)-
      --van-uploader-file-name-text-colorvar(--van-gray-7)-
      --van-uploader-mask-text-colorvar(--van-white)-
      --van-uploader-mask-background-colorfade(var(--van-gray-8), 88%)-
      --van-uploader-mask-icon-size22px-
      --van-uploader-mask-message-font-sizevar(--van-font-size-sm)-
      --van-uploader-mask-message-line-heightvar(--van-line-height-xs)-
      --van-uploader-loading-icon-size22px-
      --van-uploader-loading-icon-colorvar(--van-white)-
      --van-uploader-disabled-opacityvar(--van-disabled-opacity)-

      常见问题

      拍照上传的图片被旋转 90 度?

      部分手机在拍照上传时会出现图片被旋转 90 度的问题,这个问题可以通过 compressorjs 或其他开源库进行处理。

      compressorjs 是一个开源的图片处理库,提供了图片压缩、图片旋转等能力。

      示例

      使用 compressorjs 进行处理的示例代码如下:

      <van-uploader :before-read="beforeRead" />
      import Compressor from 'compressorjs';export default {  setup() {    const beforeRead = (file) => {      return new Promise((resolve) => {        // compressorjs 默认开启 checkOrientation 选项        // 会将图片修正为正确方向        new Compressor(file, {          success: resolve,          error(err) {            console.log(err.message);          },        });      });    };    return {      beforeRead,    };  },};

      上传 HEIC/HEIF 格式的图片后无法展示?

      目前 Chrome、Safari 等浏览器不支持展示 HEIC/HEIF 格式的图片,因此上传后无法在 Uploader 组件中进行预览。

      [HEIF] 格式的兼容性请参考 caniuse


      介绍

      底部弹起的模态面板,包含与当前情境相关的多个选项。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ActionSheet } from 'vant';const app = createApp();app.use(ActionSheet);

      代码演示

      基础用法

      动作面板通过 actions 属性来定义选项,actions 属性是一个由对象构成的数组,数组中的每个对象配置一列,对象格式见文档下方表格。

      <van-cell is-link title="基础用法" @click="show = true" /><van-action-sheet v-model:show="show" :actions="actions" @select="onSelect" />
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const show = ref(false);    const actions = [      { name: '选项一' },      { name: '选项二' },      { name: '选项三' },    ];    const onSelect = (item) => {      // 默认情况下点击选项时不会自动收起      // 可以通过 close-on-click-action 属性开启自动收起      show.value = false;      Toast(item.name);    };    return {      show,      actions,      onSelect,    };  },};

      展示取消按钮

      设置 cancel-text 属性后,会在底部展示取消按钮,点击后关闭当前面板并触发 cancel 事件。

      <van-action-sheet  v-model:show="show"  :actions="actions"  cancel-text="取消"  close-on-click-action  @cancel="onCancel"/>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const show = ref(false);    const actions = [      { name: '选项一' },      { name: '选项二' },      { name: '选项三' },    ];    const onCancel = () => Toast('取消');    return {      show,      actions,      onCancel,    };  },};

      展示描述信息

      通过 description 可以在菜单顶部显示描述信息,通过选项的 subname 属性可以在选项文字的右侧展示描述信息。

      <van-action-sheet  v-model:show="show"  :actions="actions"  cancel-text="取消"  description="这是一段描述信息"  close-on-click-action/>
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const actions = [      { name: '选项一' },      { name: '选项二' },      { name: '选项三', subname: '描述信息' },    ];    return {      show,      actions,    };  },};

      选项状态

      可以通过 loading 和 disabled 将选项设置为加载状态或禁用状态,或者通过color设置选项的颜色

      <van-action-sheet  v-model:show="show"  :actions="actions"  cancel-text="取消"  close-on-click-action/>
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const actions = [      { name: '着色选项', color: '#ee0a24' },      { name: '禁用选项', disabled: true },      { name: '加载选项', loading: true },    ];    return {      show,      actions,    };  },};

      自定义面板

      通过插槽可以自定义面板的展示内容,同时可以使用title属性展示标题栏

      <van-action-sheet v-model:show="show" title="标题">  <div class="content">内容</div></van-action-sheet><style>  .content {    padding: 16px 16px 160px;  }</style>

      API

      Props

      参数说明类型默认值
      v-model:show是否显示动作面板booleanfalse
      actions面板选项列表Action[][]
      title顶部标题string-
      cancel-text取消按钮文字string-
      description选项上方的描述信息string-
      closeable是否显示关闭图标booleantrue
      close-icon关闭图标名称或图片链接stringcross
      duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
      round是否显示圆角booleantrue
      overlay是否显示遮罩层booleantrue
      overlay-class自定义遮罩层类名string | Array | object-
      overlay-style自定义遮罩层样式object-
      lock-scroll是否锁定背景滚动booleantrue
      lazy-render是否在显示弹层时才渲染节点booleantrue
      close-on-popstate是否在页面回退时自动关闭booleanfalse
      close-on-click-action是否在点击选项后关闭booleanfalse
      close-on-click-overlay是否在点击遮罩层后关闭booleantrue
      safe-area-inset-bottom是否开启底部安全区适配booleantrue
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-
      before-close v3.1.4关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-

      Action 数据结构

      actions 属性是一个由对象构成的数组,数组中的每个对象配置一列,对象可以包含以下值:

      键名说明类型
      name标题string
      subname二级标题string
      color选项文字颜色string
      className为对应列添加额外的 classstring | Array | object
      loading是否为加载状态boolean
      disabled是否为禁用状态boolean
      callback点击时触发的回调函数action: Action

      Events

      事件名说明回调参数
      select点击选项时触发,禁用或加载状态下不会触发action: Action, index: number
      cancel点击取消按钮时触发-
      open打开面板时触发-
      close关闭面板时触发-
      opened打开面板且动画结束后触发-
      closed关闭面板且动画结束后触发-
      click-overlay点击遮罩层时触发event: MouseEvent

      Slots

      名称说明
      default自定义面板的展示内容
      description自定义描述文案
      cancel v3.0.10自定义取消按钮内容

      样式变量

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

      名称默认值描述
      --van-action-sheet-max-height80%-
      --van-action-sheet-header-height48px-
      --van-action-sheet-header-font-sizevar(--van-font-size-lg)-
      --van-action-sheet-description-colorvar(--van-gray-6)-
      --van-action-sheet-description-font-sizevar(--van-font-size-md)-
      --van-action-sheet-description-line-heightvar(--van-line-height-md)-
      --van-action-sheet-item-backgroundvar(--van-white)-
      --van-action-sheet-item-font-sizevar(--van-font-size-lg)-
      --van-action-sheet-item-line-heightvar(--van-line-height-lg)-
      --van-action-sheet-item-text-colorvar(--van-text-color)-
      --van-action-sheet-item-disabled-text-colorvar(--van-gray-5)-
      --van-action-sheet-subname-colorvar(--van-gray-6)-
      --van-action-sheet-subname-font-sizevar(--van-font-size-sm)-
      --van-action-sheet-subname-line-heightvar(--van-line-height-sm)-
      --van-action-sheet-close-icon-size22px-
      --van-action-sheet-close-icon-colorvar(--van-gray-5)-
      --van-action-sheet-close-icon-active-colorvar(--van-gray-6)-
      --van-action-sheet-close-icon-padding0 var(--van-padding-md)-
      --van-action-sheet-cancel-text-colorvar(--van-gray-7)-
      --van-action-sheet-cancel-padding-topvar(--van-padding-xs)-
      --van-action-sheet-cancel-padding-colorvar(--van-background-color)-
      --van-action-sheet-loading-icon-size22px-


      Dialog 弹出框

      介绍

      弹出模态框,常用于消息提示、消息确认,或在当前页面内完成特定的交互操作,支持函数调用和组件调用两种方式。

      实例演示

      函数调用

      Dialog 是一个函数,调用后会直接在页面中弹出相应的模态框。

      import { Dialog } from 'vant';Dialog({ message: '提示' });

      组件调用

      通过组件调用 Dialog 时,可以通过下面的方式进行注册:

      import { createApp } from 'vue';import { Dialog } from 'vant';// 全局注册const app = createApp();app.use(Dialog);// 局部注册export default {  components: {    [Dialog.Component.name]: Dialog.Component,  },};

      代码演示

      消息提示

      用于提示一些消息,只包含一个确认按钮。

      Dialog.alert({  title: '标题',  message: '弹窗内容',}).then(() => {  // on close});Dialog.alert({  message: '弹窗内容',}).then(() => {  // on close});

      消息确认

      用于确认消息,包含取消和确认按钮。

      Dialog.confirm({  title: '标题',  message: '弹窗内容',})  .then(() => {    // on confirm  })  .catch(() => {    // on cancel  });

      圆角按钮风格

      将 theme 选项设置为 round-button 可以展示圆角按钮风格的弹窗。

      Dialog.alert({  title: '标题',  message: '弹窗内容',  theme: 'round-button',}).then(() => {  // on close});Dialog.alert({  message: '弹窗内容',  theme: 'round-button',}).then(() => {  // on close});

      异步关闭

      通过 beforeClose 属性可以传入一个回调函数,在弹窗关闭前进行特定操作。

      const beforeClose = (action) =>  new Promise((resolve) => {    setTimeout(() => {      if (action === 'confirm') {        resolve(true);      } else {        // 拦截取消操作        resolve(false);      }    }, 1000);  });Dialog.confirm({  title: '标题',  message: '弹窗内容',  beforeClose,});

      全局方法

      通过 app.use 全局注册 Dialog 组件后,会自动在 app 的所有子组件上挂载 $dialog 方法,在所有组件内部都可以直接调用此方法。

      export default {  mounted() {    this.$dialog.alert({      message: '弹窗内容',    });  },};
      Tips: 由于 setup 选项中无法访问 this,因此不能使用上述方式,请通过 import 引入。

      组件调用

      如果需要在弹窗内嵌入组件或其他自定义内容,可以使用组件调用的方式。

      <van-dialog v-model:show="show" title="标题" show-cancel-button>  <img src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow"  /></van-dialog>
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    return { show };  },};

      API

      方法

      方法名说明参数返回值
      Dialog展示弹窗options: DialogOptionsPromise<void>
      Dialog.alert展示消息提示弹窗options: DialogOptionsPromise<void>
      Dialog.confirm展示消息确认弹窗options: DialogOptionsPromise<void>
      Dialog.setDefaultOptions修改默认配置,对所有 Dialog 生效options: DialogOptionsvoid
      Dialog.resetDefaultOptions重置默认配置,对所有 Dialog 生效-void
      Dialog.close关闭弹窗-void

      DialogOptions

      通过函数调用 Dialog 时,支持传入以下选项:

      参数说明类型默认值
      title标题string-
      width弹窗宽度,默认单位为 pxnumber | string320px
      message文本内容,支持通过   换行string | () => JSX.ELement-
      messageAlign内容对齐方式,可选值为 left rightstringcenter
      theme样式风格,可选值为 round-buttonstringdefault
      className自定义类名string | Array | object-
      showConfirmButton是否展示确认按钮booleantrue
      showCancelButton是否展示取消按钮booleanfalse
      confirmButtonText确认按钮文案string确认
      confirmButtonColor确认按钮颜色string#ee0a24
      cancelButtonText取消按钮文案string取消
      cancelButtonColor取消按钮颜色stringblack
      overlay是否展示遮罩层booleantrue
      overlayClass自定义遮罩层类名string | Array | object-
      overlayStyle自定义遮罩层样式object-
      closeOnPopstate是否在页面回退时自动关闭booleantrue
      closeOnClickOverlay是否在点击遮罩层后关闭弹窗booleanfalse
      lockScroll是否锁定背景滚动booleantrue
      allowHtml是否允许 message 内容中渲染 HTMLbooleanfalse
      beforeClose关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-
      transition动画类名,等价于 transition 的 name 属性string-
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Elementbody

      Props

      通过组件调用 Dialog 时,支持以下 Props:

      参数说明类型默认值
      v-model:show是否显示弹窗boolean-
      title标题string-
      width弹窗宽度,默认单位为 pxnumber | string320px
      message文本内容,支持通过   换行string | () => JSX.ELement-
      message-align内容水平对齐方式,可选值为 left rightstringcenter
      theme样式风格,可选值为 round-buttonstringdefault
      show-confirm-button是否展示确认按钮booleantrue
      show-cancel-button是否展示取消按钮booleanfalse
      confirm-button-text确认按钮文案string确认
      confirm-button-color确认按钮颜色string#ee0a24
      cancel-button-text取消按钮文案string取消
      cancel-button-color取消按钮颜色stringblack
      overlay是否展示遮罩层booleantrue
      overlay-class自定义遮罩层类名string-
      overlay-style自定义遮罩层样式object-
      close-on-popstate是否在页面回退时自动关闭booleantrue
      close-on-click-overlay是否在点击遮罩层后关闭弹窗booleanfalse
      lazy-render是否在显示弹层时才渲染节点booleantrue
      lock-scroll是否锁定背景滚动booleantrue
      allow-html是否允许 message 内容中渲染 HTMLbooleanfalse
      before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-
      transition动画类名,等价于 transition 的 name 属性string-
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-

      Events

      通过组件调用 Dialog 时,支持以下事件:

      事件说明回调参数
      confirm点击确认按钮时触发-
      cancel点击取消按钮时触发-
      open打开弹窗时触发-
      close关闭弹窗时触发-
      opened打开弹窗且动画结束后触发-
      closed关闭弹窗且动画结束后触发-

      Slots

      通过组件调用 Dialog 时,支持以下插槽:

      名称说明
      default自定义内容
      title自定义标题
      footer v3.0.10自定义底部按钮区域

      样式变量

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

      名称默认值描述
      --van-dialog-width320px-
      --van-dialog-small-screen-width90%-
      --van-dialog-font-sizevar(--van-font-size-lg)-
      --van-dialog-transitionvar(--van-animation-duration-base)-
      --van-dialog-border-radius16px-
      --van-dialog-background-colorvar(--van-white)-
      --van-dialog-header-font-weightvar(--van-font-weight-bold)-
      --van-dialog-header-line-height24px-
      --van-dialog-header-padding-top26px-
      --van-dialog-header-isolated-paddingvar(--van-padding-lg) 0-
      --van-dialog-message-paddingvar(--van-padding-lg)-
      --van-dialog-message-font-sizevar(--van-font-size-md)-
      --van-dialog-message-line-heightvar(--van-line-height-md)-
      --van-dialog-message-max-height60vh-
      --van-dialog-has-title-message-text-colorvar(--van-gray-7)-
      --van-dialog-has-title-message-padding-topvar(--van-padding-xs)-
      --van-dialog-button-height48px-
      --van-dialog-round-button-height36px-
      --van-dialog-confirm-button-text-colorvar(--van-danger-color)-

      常见问题

      在 beforeRouteLeave 里调用 Dialog 无法展示?

      将 closeOnPopstate 属性设置为 false 即可。

      Dialog.alert({  title: '标题',  message: '弹窗内容',  closeOnPopstate: false,}).then(() => {  // on close});

      在 JSX 中渲染 Dialog 组件无法展示?

      请注意 Dialog 是一个函数,Dialog.Component 才是 Dialog 对应的组件。JSX 调用弹窗的正确姿势如下:

      export default {  setup() {    const show = ref(false);    return () => <Dialog.Component v-model={[show, 'show']} />;  },};


      介绍

      向下弹出的菜单列表。

      实例演示

      引入

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

      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="padding: 5px 16px;">      <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菜单展开方向,可选值为upstringdown
      z-index菜单栏 z-index 层级number | string10
      duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.2
      overlay是否显示遮罩层booleantrue
      close-on-click-overlay是否在点击遮罩层后关闭菜单booleantrue
      close-on-click-outside是否在点击外部元素后关闭菜单booleantrue

      DropdownItem Props

      参数说明类型默认值
      v-model当前选中项对应的 valuenumber | string-
      title菜单项标题string当前选中项文字
      options选项数组Option[][]
      disabled是否禁用菜单booleanfalse
      lazy-render是否在首次展开时才渲染菜单内容booleantrue
      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-height48px-
      --van-dropdown-menu-background-colorvar(--van-white)-
      --van-dropdown-menu-box-shadow0 2px 12px fade(var(--van-gray-7), 12)-
      --van-dropdown-menu-title-font-size15px-
      --van-dropdown-menu-title-text-colorvar(--van-text-color)-
      --van-dropdown-menu-title-active-text-colorvar(--van-danger-color)-
      --van-dropdown-menu-title-disabled-text-colorvar(--van-gray-6)-
      --van-dropdown-menu-title-padding0 var(--van-padding-xs)-
      --van-dropdown-menu-title-line-heightvar(--van-line-height-lg)-
      --van-dropdown-menu-option-active-colorvar(--van-danger-color)-
      --van-dropdown-menu-content-max-height80%-
      --van-dropdown-item-z-index10-

      常见问题

      父元素设置 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>


      介绍

      加载图标,用于表示加载中的过渡状态。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Loading } from 'vant';const app = createApp();app.use(Loading);

      代码演示

      加载类型

      通过 type 属性可以设置加载图标的类型,默认为 circular,可选值为 spinner。

      <van-loading /><van-loading type="spinner" />

      自定义颜色

      通过 color 属性设置加载图标的颜色。

      <van-loading color="#1989fa" /><van-loading type="spinner" color="#1989fa" />

      自定义大小

      通过 size 属性设置加载图标的大小,默认单位为 px。

      <van-loading size="24" /><van-loading type="spinner" size="24px" />

      加载文案

      可以使用默认插槽在图标的右侧插入加载文案。

      <van-loading size="24px">加载中...</van-loading>

      垂直排列

      设置 vertical 属性后,图标和文案会垂直排列。

      <van-loading size="24px" vertical>加载中...</van-loading>

      自定义文案颜色

      通过 color 或者 text-color 属性设置加载文案的颜色。

      <!-- 可修改文案和加载图标的颜色 --><van-loading color="#0094ff" /><!-- 只修改文案颜色 --><van-loading text-color="#0094ff" />

      API

      Props

      参数说明类型默认值
      color颜色string#c9c9c9
      type类型,可选值为 spinnerstringcircular
      size加载图标大小,默认单位为 pxnumber | string30px
      text-size文字大小,默认单位为 pxnumber | string14px
      text-color文字颜色string#c9c9c9
      vertical是否垂直排列图标和文字内容booleanfalse

      Slots

      名称说明
      default加载文案

      样式变量

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

      名称默认值描述
      --van-loading-text-colorvar(--van-gray-6)-
      --van-loading-text-font-sizevar(--van-font-size-md)-
      --van-loading-spinner-colorvar(--van-gray-5)-
      --van-loading-spinner-size30px-
      --van-loading-spinner-animation-duration0.8s-


      介绍

      在页面顶部展示消息提示,支持函数调用和组件调用两种方式。

      实例演示

      函数调用

      Notify 是一个函数,调用后会直接在页面中弹出相应的消息提示。

      import { Notify } from 'vant';Notify('通知内容');

      组件调用

      通过组件调用 Notify 时,可以通过下面的方式进行注册:

      import { createApp } from 'vue';import { Notify } from 'vant';// 全局注册const app = createApp();app.use(Notify);// 局部注册export default {  components: {    [Notify.Component.name]: Notify.Component,  },};

      代码演示

      基础用法

      Notify('通知内容');

      通知类型

      支持 primary、success、warning、danger 四种通知类型,默认为 danger。

      // 主要通知Notify({ type: 'primary', message: '通知内容' });// 成功通知Notify({ type: 'success', message: '通知内容' });// 危险通知Notify({ type: 'danger', message: '通知内容' });// 警告通知Notify({ type: 'warning', message: '通知内容' });

      自定义通知

      自定义消息通知的颜色和展示时长。

      Notify({  message: '自定义颜色',  color: '#ad0000',  background: '#ffe1e1',});Notify({  message: '自定义时长',  duration: 1000,});

      全局方法

      通过 app.use 全局注册 Notify 组件后,会自动在 app 的所有子组件上挂载 $notify 方法,便于在组件内调用。

      export default {  mounted() {    this.$notify('提示文案');  },};
      Tips: 由于 setup 选项中无法访问 this,因此不能使用上述方式,请通过 import 引入。

      组件调用

      如果需要在 Notify 内嵌入组件或其他自定义内容,可以使用组件调用的方式。

      <van-button type="primary" text="组件调用" @click="showNotify" /><van-notify v-model:show="show" type="success">  <van-icon name="bell" style="margin-right: 4px;" />  <span>通知内容</span></van-notify>
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    const showNotify = () => {      show.value = true;      setTimeout(() => {        show.value = false;      }, 2000);    };    return {      show,      showNotify,    };  },};

      API

      方法

      方法名说明参数返回值
      Notify展示提示options | messagenotify 实例
      Notify.clear关闭提示-void
      Notify.setDefaultOptions修改默认配置,对所有 Notify 生效optionsvoid
      Notify.resetDefaultOptions重置默认配置,对所有 Notify 生效-void

      Options

      参数说明类型默认值
      type类型,可选值为 primary success warningstringdanger
      message展示文案,支持通过 换行string-
      duration展示时长(ms),值为 0 时,notify 不会消失number | string3000
      color字体颜色stringwhite
      background背景颜色string-
      className自定义类名string | Array | object-
      lockScroll v3.0.7是否锁定背景滚动booleanfalse
      onClick点击时的回调函数(event: MouseEvent): void-
      onOpened完全展示后的回调函数() => void-
      onClose关闭时的回调函数() => void-

      样式变量

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

      名称默认值描述
      --van-notify-text-colorvar(--van-white)-
      --van-notify-paddingvar(--van-padding-xs) var(--van-padding-md)-
      --van-notify-font-sizevar(--van-font-size-md)-
      --van-notify-line-heightvar(--van-line-height-md)-
      --van-notify-primary-background-colorvar(--van-primary-color)-
      --van-notify-success-background-colorvar(--van-success-color)-
      --van-notify-danger-background-colorvar(--van-danger-color)-
      --van-notify-warning-background-colorvar(--van-warning-color)-


      介绍

      创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Overlay } from 'vant';const app = createApp();app.use(Overlay);

      代码演示

      基础用法

      <van-button type="primary" text="显示遮罩层" @click="show = true" /><van-overlay :show="show" @click="show = false" />
      import { ref } from 'vue';export default {  setup() {    const show = ref(false);    return { show };  },};

      嵌入内容

      通过默认插槽可以在遮罩层上嵌入任意内容。

      <van-overlay :show="show" @click="show = false">  <div class="wrapper" @click.stop>    <div class="block" />  </div></van-overlay><style>  .wrapper {    display: flex;    align-items: center;    justify-content: center;    height: 100%;  }  .block {    width: 120px;    height: 120px;    background-color: #fff;  }</style>

      API

      Props

      参数说明类型默认值
      show是否展示遮罩层booleanfalse
      z-indexz-index 层级number | string1
      duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
      class-name自定义类名string-
      custom-style自定义样式object-
      lock-scroll是否锁定背景滚动,锁定时蒙层里的内容也将无法滚动booleantrue

      Events

      事件名说明回调参数
      click点击时触发event: MouseEvent

      Slots

      名称说明
      default默认插槽,用于在遮罩层上方嵌入内容

      样式变量

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

      名称默认值描述
      --van-overlay-z-index1-
      --van-overlay-background-colorrgba(0, 0, 0, 0.7)-


      介绍

      用于提供下拉刷新的交互操作。

      实例演示

      引入

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

      import { createApp } from 'vue';import { PullRefresh } from 'vant';const app = createApp();app.use(PullRefresh);

      代码演示

      基础用法

      下拉刷新时会触发 refresh 事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将 v-model 设置为 false,表示加载完成。

      <van-pull-refresh v-model="state.loading" @refresh="onRefresh">  <p>刷新次数: {{ state.count }}</p></van-pull-refresh>
      import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const state = reactive({      count: 0,      loading: false,    });    const onRefresh = () => {      setTimeout(() => {        Toast('刷新成功');        state.loading = false;        state.count++;      }, 1000);    };    return {      state,      onRefresh,    };  },};

      成功提示

      通过 success-text 可以设置刷新成功后的顶部提示文案。

      <van-pull-refresh  v-model="isLoading"  success-text="刷新成功"  @refresh="onRefresh">  <p>刷新次数: {{ count }}</p></van-pull-refresh>

      自定义提示

      通过插槽可以自定义下拉刷新过程中的提示内容。

      <van-pull-refresh v-model="isLoading" :head-height="80" @refresh="onRefresh">  <!-- 下拉提示,通过 scale 实现一个缩放效果 -->  <template #pulling="props">    <img      class="doge"      src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"       :style="{ transform: `scale(${props.distance / 80})` }"    />  </template>  <!-- 释放提示 -->  <template #loosing>    <img class="doge" src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"  />  </template>  <!-- 加载提示 -->  <template #loading>    <img class="doge" src="https://img.yzcdn.cn/vant/doge-fire.jpg" rel="external nofollow"  />  </template>  <p>刷新次数: {{ count }}</p></van-pull-refresh><style>  .doge {    width: 140px;    height: 72px;    margin-top: 8px;    border-radius: 4px;  }</style>

      API

      Props

      参数说明类型默认值
      v-model是否处于加载中状态boolean-
      pulling-text下拉过程提示文案string下拉即可刷新...
      loosing-text释放过程提示文案string释放即可刷新...
      loading-text加载过程提示文案string加载中...
      success-text刷新成功提示文案string-
      success-duration刷新成功提示展示时长(ms)number | string500
      animation-duration动画时长number | string300
      head-height顶部内容高度number | string50
      pull-distance v3.0.8触发下拉刷新的距离number | string与 head-height 一致
      disabled是否禁用下拉刷新booleanfalse

      Events

      事件名说明回调参数
      refresh下拉刷新时触发-

      Slots

      名称说明参数
      default自定义内容-
      normal非下拉状态时顶部内容-
      pulling下拉过程中顶部内容{ distance: 当前下拉距离 }
      loosing释放过程中顶部内容{ distance: 当前下拉距离 }
      loading加载过程中顶部内容{ distance: 当前下拉距离 }
      success刷新成功提示内容-

      样式变量

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

      名称默认值描述
      --van-pull-refresh-head-height50px-
      --van-pull-refresh-head-font-sizevar(--van-font-size-md)-
      --van-pull-refresh-head-text-colorvar(--van-gray-6)-
      --van-pull-refresh-loading-icon-size16px-

      常见问题

      PullRefresh 的内容未填满屏幕时,只有一部分区域可以下拉?

      默认情况下,下拉区域的高度是和内容高度保持一致的,如果需要让下拉区域始终为全屏,可以给 PullRefresh 设置一个与屏幕大小相等的最小高度:

      <van-pull-refresh style="min-height: 100vh;" />

      PullRefresh 的触发条件是?

      PullRefresh 的触发条件是「父级滚动元素的滚动条在顶部位置」。

      • 如果最近一个可滚动的父级元素是 window,则要求 window.pageYOffset === 0。
      • 如果最近一个可滚动的父级元素是 Element,则要求 Element.scrollTop === 0。

      在桌面端无法操作组件?

      参见桌面端适配


      介绍

      底部弹起的分享面板,用于展示各分享渠道对应的操作按钮,不含具体的分享逻辑。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ShareSheet } from 'vant';const app = createApp();app.use(ShareSheet);

      代码演示

      基础用法

      分享面板通过 options 属性来定义分享选项,数组的每一项是一个对象,对象格式见文档下方表格。

      <van-cell title="显示分享面板" @click="showShare = true" /><van-share-sheet  v-model:show="showShare"  title="立即分享给好友"  :options="options"  @select="onSelect"/>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const showShare = ref(false);    const options = [      { name: '微信', icon: 'wechat' },      { name: '微博', icon: 'weibo' },      { name: '复制链接', icon: 'link' },      { name: '分享海报', icon: 'poster' },      { name: '二维码', icon: 'qrcode' },    ];    const onSelect = (option) => {      Toast(option.name);      showShare.value = false;    };    return {      options,      onSelect,      showShare,    };  },};

      展示多行选项

      当分享选项的数量较多时,可以将 options 定义为数组嵌套的格式,每个子数组会作为一行选项展示。

      <van-share-sheet  v-model:show="showShare"  title="立即分享给好友"  :options="options"/>
      import { ref } from 'vue';export default {  setup() {    const showShare = ref(false);    const options = [      [        { name: '微信', icon: 'wechat' },        { name: '朋友圈', icon: 'wechat-moments' },        { name: '微博', icon: 'weibo' },        { name: 'QQ', icon: 'qq' },      ],      [        { name: '复制链接', icon: 'link' },        { name: '分享海报', icon: 'poster' },        { name: '二维码', icon: 'qrcode' },        { name: '小程序码', icon: 'weapp-qrcode' },      ],    ];    return {      options,      showShare,    };  },};

      自定义图标

      除了使用内置的几种图标外,可以直接在 icon 中传入图片 URL 来使用自定义的图标。

      <van-share-sheet v-model:show="showShare" :options="options" />
      import { ref } from 'vue';export default {  setup() {    const showShare = ref(false);    const options = [      {        name: '名称',        icon: 'https://img.yzcdn.cn/vant/custom-icon-fire.png',      },      {        name: '名称',        icon: 'https://img.yzcdn.cn/vant/custom-icon-light.png',      },      {        name: '名称',        icon: 'https://img.yzcdn.cn/vant/custom-icon-water.png',      },    ];    return {      options,      showShare,    };  },};

      展示描述信息

      通过 description 属性可以设置标题下方的描述文字, 在 options 内设置 description 属性可以添加分享选项描述。

      <van-share-sheet  v-model:show="showShare"  :options="options"  title="立即分享给好友"  description="描述信息"/>
      import { ref } from 'vue';export default {  setup() {    const showShare = ref(false);    const options = [      { name: '微信', icon: 'wechat' },      { name: '微博', icon: 'weibo' },      { name: '复制链接', icon: 'link', description: '描述信息' },      { name: '分享海报', icon: 'poster' },      { name: '二维码', icon: 'qrcode' },    ];    return {      options,      showShare,    };  },};

      API

      Props

      参数说明类型默认值
      v-model:show是否显示分享面板booleanfalse
      options分享选项Option[][]
      title顶部标题string-
      cancel-text取消按钮文字,传入空字符串可以隐藏按钮string'取消'
      description标题下方的辅助描述文字string-
      duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
      overlay是否显示遮罩层booleantrue
      overlay-class自定义遮罩层类名string | Array | object-
      overlay-style自定义遮罩层样式object-
      lock-scroll是否锁定背景滚动booleantrue
      lazy-render是否在显示弹层时才渲染内容booleantrue
      close-on-popstate是否在页面回退时自动关闭booleantrue
      close-on-click-overlay是否在点击遮罩层后关闭booleantrue
      safe-area-inset-bottom是否开启底部安全区适配booleantrue
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-
      before-close v3.1.4关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(action: string) => boolean | Promise<boolean>-

      Option 数据结构

      options 属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:

      键名说明类型
      name分享渠道名称string
      description分享选项描述string
      icon图标,可选值为 wechat weibo qq link qrcode poster weapp-qrcode wechat-moments,支持传入图片 URLstring
      className分享选项类名string

      Events

      事件名说明回调参数
      select点击分享选项时触发option: Option, index: number
      cancel点击取消按钮时触发-
      open打开面板时触发-
      close关闭面板时触发-
      opened打开面板且动画结束后触发-
      closed关闭面板且动画结束后触发-
      click-overlay点击遮罩层时触发event: MouseEvent

      Slots

      名称说明
      title自定义顶部标题
      description自定义描述文字
      cancel v3.0.10自定义取消按钮内容

      样式变量

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

      名称默认值描述
      --van-share-sheet-header-paddingvar(--van-padding-sm) var(--van-padding-md) var(--van-padding-base)-
      --van-share-sheet-title-colorvar(--van-text-color)-
      --van-share-sheet-title-font-sizevar(--van-font-size-md)-
      --van-share-sheet-title-line-heightvar(--van-line-height-md)-
      --van-share-sheet-description-colorvar(--van-gray-6)-
      --van-share-sheet-description-font-sizevar(--van-font-size-sm)-
      --van-share-sheet-description-line-height16px-
      --van-share-sheet-icon-size48px-
      --van-share-sheet-option-name-colorvar(--van-gray-7)-
      --van-share-sheet-option-name-font-sizevar(--van-font-size-sm)-
      --van-share-sheet-option-description-colorvar(--van-gray-5)-
      --van-share-sheet-option-description-font-sizevar(--van-font-size-sm)-
      --van-share-sheet-cancel-button-font-sizevar(--van-font-size-lg)-
      --van-share-sheet-cancel-button-height48px-
      --van-share-sheet-cancel-button-backgroundvar(--van-white)-

      常见问题

      如何实现分享逻辑?

      在不同的 App 或浏览器中,存在各式各样的分享接口或分享方式,因此 ShareSheet 组件不提供具体的分享逻辑,需要开发者根据业务场景自行实现。

      微信内分享

      由于微信未提供分享相关的 API,需要引导用户点击右上角进行分享。

      App 内分享

      可以通过 JSBridge 调用原生应用的 SDK 进行分享。

      分享海报或二维码

      可以通过 Popup 组件以弹层的形式展示图片,然后引导用户保存图片进行分享。


      介绍

      可以左右滑动来展示操作按钮的单元格组件。

      实例演示

      引入

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

      import { createApp } from 'vue';import { SwipeCell } from 'vant';const app = createApp();app.use(SwipeCell);

      代码演示

      基础用法

      SwipeCell 组件提供了 left 和 right 两个插槽,用于定义两侧滑动区域的内容。

      <van-swipe-cell>  <template #left>    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template #right>    <van-button square type="danger" text="删除" />    <van-button square type="primary" text="收藏" />  </template></van-swipe-cell>

      自定义内容

      SwipeCell 可以嵌套任意内容,比如嵌套一个商品卡片。

      <van-swipe-cell>  <van-card    num="2"    price="2.00"    desc="描述信息"    title="商品标题"    class="goods-card"    thumb="https://img.yzcdn.cn/vant/cat.jpeg"  />  <template #right>    <van-button square text="删除" type="danger" class="delete-button" />  </template></van-swipe-cell><style>  .goods-card {    margin: 0;    background-color: @white;  }  .delete-button {    height: 100%;  }</style>

      异步关闭

      通过传入 before-close 回调函数,可以自定义两侧滑动内容关闭时的行为。

      <van-swipe-cell :before-close="beforeClose">  <template #left>    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template #right>    <van-button square type="danger" text="删除" />  </template></van-swipe-cell>
      import { Dialog } from 'vant';export default {  setup() {    // position 为关闭时点击的位置    const beforeClose = ({ position }) => {      switch (position) {        case 'left':        case 'cell':        case 'outside':          return true;        case 'right':          return new Promise((resolve) => {            Dialog.confirm({              title: '确定删除吗?',            }).then(resolve);          });      }    };    return { beforeClose };  },};

      API

      Props

      参数说明类型默认值
      name标识符,可以在事件参数中获取到number | string''
      left-width指定左侧滑动区域宽度,单位为 pxnumber | stringauto
      right-width指定右侧滑动区域宽度,单位为 pxnumber | stringauto
      before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(args) => boolean | Promise<boolean>-
      disabled是否禁用滑动booleanfalse
      stop-propagation是否阻止滑动事件冒泡booleanfalse

      Slots

      名称说明
      default默认显示的内容
      left左侧滑动区域的内容
      right右侧滑动区域的内容

      Events

      事件名说明回调参数
      click点击时触发position: 'left' | 'right' | 'cell' | 'outside'
      open打开时触发{ name: string | number, position: 'left' | 'right' }
      close关闭时触发{ name: string | number, position: 'left' | 'right' | 'cell' | 'outside' }

      beforeClose 参数

      beforeClose 的第一个参数为对象,对象中包含以下属性:

      参数名说明类型
      name标识符string | number
      position关闭时的点击位置'left' | 'right' | 'cell' | 'outside'

      方法

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

      方法名说明参数返回值
      open打开单元格侧边栏position: left | right-
      close收起单元格侧边栏--

      类型定义

      通过 SwipeCellInstance 获取 SwipeCell 实例的类型定义。

      import { ref } from 'vue';import type { SwipeCellInstance } from 'vant';const swipeCellRef = ref<SwipeCellInstance>();swipeCellRef.value?.close();

      样式变量

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

      名称默认值描述
      --van-switch-cell-padding-topvar(--van-cell-vertical-padding) - 1px-
      --van-switch-cell-padding-bottomvar(--van-cell-vertical-padding) - 1px-
      --van-switch-cell-large-padding-topvar(--van-cell-large-vertical-padding) - 1px-
      --van-switch-cell-large-padding-bottomvar(--van-cell-large-vertical-padding) - 1px-

      常见问题

      在桌面端无法操作组件?

      参见桌面端适配


      介绍

      在右上角展示徽标数字或小红点。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Badge } from 'vant';const app = createApp();app.use(Badge);

      代码演示

      基础用法

      设置 content 属性后,Badge 会在子元素的右上角显示对应的徽标,也可以通过 dot 来显示小红点。

      <van-badge :content="5">  <div class="child" /></van-badge><van-badge :content="10">  <div class="child" /></van-badge><van-badge content="Hot">  <div class="child" /></van-badge><van-badge dot>  <div class="child" /></van-badge><style>  .child {    width: 40px;    height: 40px;    background: #f2f3f5;    border-radius: 4px;  }</style>

      最大值

      设置 max 属性后,当 content 的数值超过最大值时,会自动显示为 {max}+。

      <van-badge :content="20" max="9">  <div class="child" /></van-badge><van-badge :content="50" max="20">  <div class="child" /></van-badge><van-badge :content="200" max="99">  <div class="child" /></van-badge>

      自定义颜色

      通过 color 属性来设置徽标的颜色。

      <van-badge :content="5" color="#1989fa">  <div class="child" /></van-badge><van-badge :content="10" color="#1989fa">  <div class="child" /></van-badge><van-badge dot color="#1989fa">  <div class="child" /></van-badge>

      自定义徽标内容

      通过 content 插槽可以自定义徽标的内容,比如插入一个图标。

      <van-badge>  <div class="child" />  <template #content>    <van-icon name="success" class="badge-icon" />  </template></van-badge><van-badge>  <div class="child" />  <template #content>    <van-icon name="cross" class="badge-icon" />  </template></van-badge><van-badge>  <div class="child" />  <template #content>    <van-icon name="down" class="badge-icon" />  </template></van-badge>
      .badge-icon {  display: block;  font-size: 10px;  line-height: 16px;}

      独立展示

      当 Badge 没有子元素时,会作为一个独立的元素进行展示。

      <van-badge :content="20" /><van-badge :content="200" max="99" />

      API

      Props

      参数说明类型默认值
      content徽标内容number | string-
      color徽标背景颜色string#ee0a24
      dot是否展示为小红点booleanfalse
      max最大值,超过最大值会显示 {max}+,仅当 content 为数字时有效number | string-
      offset v3.0.5设置徽标的偏移量,数组的两项分别对应水平和垂直方向的偏移量,默认单位为 px[number | string, number | string]-
      show-zero v3.0.10当 content 为数字 0 时,是否展示徽标booleantrue

      Slots

      名称说明
      default徽标包裹的子元素
      content自定义徽标内容

      样式变量

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

      名称默认值描述
      --van-badge-size16px-
      --van-badge-colorvar(--van-white)-
      --van-badge-padding0 3px-
      --van-badge-font-sizevar(--van-font-size-sm)-
      --van-badge-font-weightvar(--van-font-weight-bold)-
      --van-badge-border-widthvar(--van-border-width-base)-
      --van-badge-background-colorvar(--van-danger-color)-
      --van-badge-dot-colorvar(--van-danger-color)-
      --van-badge-dot-size8px-
      --van-badge-font-family-apple-system-font, Helvetica Neue, Arial, sans-serif-


      介绍

      圆环形的进度条组件,支持进度渐变动画。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Circle } from 'vant';const app = createApp();app.use(Circle);

      代码演示

      基础用法

      rate 属性表示进度条的目标进度,v-model:current-rate 表示动画过程中的实时进度。当 rate 发生变化时,v-model:current-rate 会以 speed 的速度变化,直至达到 rate 设定的值。

      <van-circle  v-model:current-rate="currentRate"  :rate="30"  :speed="100"  :text="text"/>
      import { ref, computed } from 'vue';export default {  setup() {    const currentRate = ref(0);    const text = computed(() => currentRate.value.toFixed(0) + '%');    return {      text,      currentRate,    };  },};

      宽度定制

      通过 stroke-width 属性来控制进度条宽度。

      <van-circle  v-model:current-rate="currentRate"  :rate="rate"  :stroke-width="60"  text="宽度定制"/>

      颜色定制

      通过 color 属性来控制进度条颜色,layer-color 属性来控制轨道颜色。

      <van-circle  v-model:current-rate="currentRate"  :rate="rate"  layer-color="#ebedf0"  text="颜色定制"/>

      渐变色

      color 属性支持传入对象格式来定义渐变色。

      <van-circle  v-model:current-rate="currentRate"  :rate="rate"  :color="gradientColor"  text="渐变色"/>
      import { ref } from 'vue';export default {  setup() {    const currentRate = ref(0);    const gradientColor = {      '0%': '#3fecff',      '100%': '#6149f6',    };    return {      currentRate,      gradientColor,    };  },};

      逆时针方向

      将 clockwise 设置为 false,进度会从逆时针方向开始。

      <van-circle  v-model:current-rate="currentRate"  :rate="rate"  :clockwise="false"  text="逆时针方向"/>

      大小定制

      通过 size 属性设置圆环直径。

      <van-circle  v-model:current-rate="currentRate"  :rate="rate"  size="120px"  text="大小定制"/>

      API

      Props

      参数说明类型默认值
      v-model:current-rate当前进度number-
      rate目标进度number | string100
      size圆环直径,默认单位为 pxnumber | string100px
      color进度条颜色,传入对象格式可以定义渐变色string | object#1989fa
      layer-color轨道颜色stringwhite
      fill填充颜色stringnone
      speed动画速度(单位为 rate/s)number | string0
      text文字string-
      stroke-width进度条宽度number | string40
      stroke-linecap进度条端点的形状,可选值为 square buttstringround
      clockwise是否顺时针增加booleantrue

      Slots

      名称说明
      default自定义文字内容

      样式变量

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

      名称默认值描述
      --van-circle-size100px-
      --van-circle-colorvar(--van-primary-color)-
      --van-circle-layer-colorvar(--van-white)-
      --van-circle-text-colorvar(--van-text-color)-
      --van-circle-text-font-weightvar(--van-font-weight-bold)-
      --van-circle-text-font-sizevar(--van-font-size-md)-
      --van-circle-text-line-heightvar(--van-line-height-md)-


      介绍

      将一组内容放置在多个折叠面板中,点击面板的标题可以展开或收缩其内容。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Collapse, CollapseItem } from 'vant';const app = createApp();app.use(Collapse);app.use(CollapseItem);

      代码演示

      基础用法

      通过 v-model 控制展开的面板列表,activeNames 为数组格式。

      <van-collapse v-model="activeNames">  <van-collapse-item title="标题1" name="1">内容</van-collapse-item>  <van-collapse-item title="标题2" name="2">内容</van-collapse-item>  <van-collapse-item title="标题3" name="3">内容</van-collapse-item></van-collapse>
      import { ref } from 'vue';export default {  setup() {    const activeNames = ref(['1']);    return { activeNames };  },};

      手风琴

      通过 accordion 可以设置为手风琴模式,最多展开一个面板,此时 activeName 为字符串格式。

      <van-collapse v-model="activeName" accordion>  <van-collapse-item title="标题1" name="1">内容</van-collapse-item>  <van-collapse-item title="标题2" name="2">内容</van-collapse-item>  <van-collapse-item title="标题3" name="3">内容</van-collapse-item></van-collapse>
      import { ref } from 'vue';export default {  setup() {    const activeName = ref('1');    return { activeName };  },};

      禁用状态

      通过 disabled 属性来禁用单个面板。

      <van-collapse v-model="activeNames">  <van-collapse-item title="标题1" name="1">内容</van-collapse-item>  <van-collapse-item title="标题2" name="2" disabled>内容</van-collapse-item>  <van-collapse-item title="标题3" name="3" disabled>内容</van-collapse-item></van-collapse>

      自定义标题内容

      通过 title 插槽可以自定义标题栏的内容。

      <van-collapse v-model="activeNames">  <van-collapse-item name="1">    <template #title>      <div>标题1 <van-icon name="question-o" /></div>    </template>    内容  </van-collapse-item>  <van-collapse-item title="标题2" name="2" icon="shop-o">    内容  </van-collapse-item></van-collapse>
      import { ref } from 'vue';export default {  setup() {    const activeNames = ref(['1']);    return { activeNames };  },};

      API

      Collapse Props

      参数说明类型默认值
      v-model当前展开面板的 name手风琴模式:number | string
      非手风琴模式:(number | string)[]
      -
      accordion是否开启手风琴模式booleanfalse
      border是否显示外边框booleantrue

      Collapse Events

      事件名说明回调参数
      change切换面板时触发activeNames: 类型与 v-model 绑定的值一致

      CollapseItem Props

      参数说明类型默认值
      name唯一标识符,默认为索引值number | stringindex
      icon标题栏左侧图标名称或图片链接string-
      size标题栏大小,可选值为 largestring-
      title标题栏左侧内容number | string-
      value标题栏右侧内容number | string-
      label标题栏描述信息number | string-
      border是否显示内边框booleantrue
      is-link是否展示标题栏右侧箭头并开启点击反馈booleantrue
      disabled是否禁用面板booleanfalse
      readonly v3.0.12是否为只读状态,只读状态下无法操作面板booleanfalse
      title-class左侧标题额外类名string-
      value-class右侧内容额外类名string-
      label-class描述信息额外类名string-

      CollapseItem 方法

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

      方法名说明参数返回值
      toggle切换面试展开状态,传 true 为展开,false 为收起,不传参为切换expand?: boolean-

      类型定义

      通过 CollapseItemInstance 获取 CollapseItem 实例的类型定义。

      import { ref } from 'vue';import type { CollapseItemInstance } from 'vant';const collapseItemRef = ref<CollapseItemInstance>();collapseItemRef.value?.toggle();

      CollapseItem Slots

      名称说明
      default面板内容
      title自定义标题栏左侧内容
      value自定义标题栏右侧内容
      label v3.1.1自定义标题栏描述信息
      icon自定义标题栏左侧图标
      right-icon自定义标题栏右侧图标

      样式变量

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

      名称默认值描述
      --van-collapse-item-transition-durationvar(--van-animation-duration-base)-
      --van-collapse-item-content-paddingvar(--van-padding-sm) var(--van-padding-md)-
      --van-collapse-item-content-font-sizevar(--van-font-size-md)-
      --van-collapse-item-content-line-height1.5-
      --van-collapse-item-content-text-colorvar(--van-gray-6)-
      --van-collapse-item-content-background-colorvar(--van-white)-
      --van-collapse-item-title-disabled-colorvar(--van-gray-5)-


      介绍

      用于实时展示倒计时数值,支持毫秒精度。

      实例演示

      引入

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

      import { createApp } from 'vue';import { CountDown } from 'vant';const app = createApp();app.use(CountDown);

      代码演示

      基础用法

      time 属性表示倒计时总时长,单位为毫秒。

      <van-count-down :time="time" />
      import { ref } from 'vue';export default {  setup() {    const time = ref(30 * 60 * 60 * 1000);    return { time };  },};

      自定义格式

      通过 format 属性设置倒计时文本的内容。

      <van-count-down :time="time" format="DD 天 HH 时 mm 分 ss 秒" />

      毫秒级渲染

      倒计时默认每秒渲染一次,设置 millisecond 属性可以开启毫秒级渲染。

      <van-count-down millisecond :time="time" format="HH:mm:ss:SS" />

      自定义样式

      通过插槽自定义倒计时的样式,timeData 对象格式见下方表格。

      <van-count-down :time="time">  <template #default="timeData">    <span class="block">{{ timeData.hours }}</span>    <span class="colon">:</span>    <span class="block">{{ timeData.minutes }}</span>    <span class="colon">:</span>    <span class="block">{{ timeData.seconds }}</span>  </template></van-count-down><style>  .colon {    display: inline-block;    margin: 0 4px;    color: #ee0a24;  }  .block {    display: inline-block;    width: 22px;    color: #fff;    font-size: 12px;    text-align: center;    background-color: #ee0a24;  }</style>

      手动控制

      通过 ref 获取到组件实例后,可以调用 start、pause、reset 方法。

      <van-count-down  ref="countDown"  millisecond  :time="3000"  :auto-start="false"  format="ss:SSS"  @finish="onFinish"/><van-grid clickable>  <van-grid-item text="开始" icon="play-circle-o" @click="start" />  <van-grid-item text="暂停" icon="pause-circle-o" @click="pause" />  <van-grid-item text="重置" icon="replay" @click="reset" /></van-grid>
      import { Toast } from 'vant';export default {  setup() {    const countDown = ref(null);    const start = () => {      countDown.value.start();    };    const pause = () => {      countDown.value.pause();    };    const reset = () => {      countDown.value.reset();    };    const onFinish = () => Toast('倒计时结束');    return {      start,      pause,      reset,      onFinish,      countDown,    };  },};

      API

      Props

      参数说明类型默认值
      time倒计时时长,单位毫秒number | string0
      format时间格式stringHH:mm:ss
      auto-start是否自动开始倒计时booleantrue
      millisecond是否开启毫秒级渲染booleanfalse

      format 格式

      格式说明
      DD天数
      HH小时
      mm分钟
      ss秒数
      S毫秒(1 位)
      SS毫秒(2 位)
      SSS毫秒(3 位)

      Events

      事件名说明回调参数
      finish倒计时结束时触发-
      change倒计时变化时触发currentTime: CurrentTime

      Slots

      名称说明参数
      default自定义内容currentTime: CurrentTime

      CurrentTime 格式

      名称说明类型
      total剩余总时间(单位毫秒)number
      days剩余天数number
      hours剩余小时number
      minutes剩余分钟number
      seconds剩余秒数number
      milliseconds剩余毫秒number

      方法

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

      方法名说明参数返回值
      start开始倒计时--
      pause暂停倒计时--
      reset重设倒计时,若 auto-start 为 true,重设后会自动开始倒计时--

      类型定义

      通过 CountDownInstance 获取 CountDown 实例的类型定义。

      import { ref } from 'vue';import type { CountDownInstance } from 'vant';const countDownRef = ref<CountDownInstance>();countDownRef.value?.start();

      样式变量

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

      名称默认值描述
      --van-count-down-text-colorvar(--van-text-color)-
      --van-count-down-font-sizevar(--van-font-size-md)-
      --van-count-down-line-heightvar(--van-line-height-md)-

      常见问题

      在 iOS 系统上倒计时不生效?

      如果你遇到了在 iOS 上倒计时不生效的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。

      对此问题的详细解释:stackoverflow


      介绍

      用于将内容分隔为多个区域。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Divider } from 'vant';const app = createApp();app.use(Divider);

      代码演示

      基础用法

      默认渲染一条水平分割线。

      <van-divider />

      展示文字

      通过插槽在可以分割线中间插入内容。

      <van-divider>文字</van-divider>

      内容位置

      通过 content-position 指定内容所在位置。

      <van-divider content-position="left">文字</van-divider><van-divider content-position="right">文字</van-divider>

      虚线

      添加 dashed 属性使分割线渲染为虚线。

      <van-divider dashed>文字</van-divider>

      自定义样式

      可以直接通过 style 属性设置分割线的样式。

      <van-divider  :style="{ color: '#1989fa', borderColor: '#1989fa', padding: '0 16px' }">  文字</van-divider>

      API

      Props

      参数说明类型默认值
      dashed是否使用虚线booleanfalse
      hairline是否使用 0.5px 线booleantrue
      content-position内容位置,可选值为 left rightstringcenter

      Slots

      名称说明
      default内容

      样式变量

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

      名称默认值描述
      --van-divider-marginvar(--van-padding-md) 0-
      --van-divider-text-colorvar(--van-gray-6)-
      --van-divider-font-sizevar(--van-font-size-md)-
      --van-divider-line-height24px-
      --van-divider-border-colorvar(--van-border-color)-
      --van-divider-content-paddingvar(--van-padding-md)-
      --van-divider-content-left-width10%-
      --van-divider-content-right-width10%-


      介绍

      空状态时的占位提示。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Empty } from 'vant';const app = createApp();app.use(Empty);

      代码演示

      基础用法

      <van-empty description="描述文字" />

      图片类型

      Empty 组件内置了多种占位图片类型,可以在不同业务场景下使用。

      <!-- 通用错误 --><van-empty image="error" description="描述文字" /><!-- 网络错误 --><van-empty image="network" description="描述文字" /><!-- 搜索提示 --><van-empty image="search" description="描述文字" />

      自定义图片

      需要自定义图片时,可以在 image 属性中传入任意图片 URL。

      <van-empty  class="custom-image"  image="https://img.yzcdn.cn/vant/custom-empty-image.png"  description="描述文字"/><style>  .custom-image .van-empty__image {    width: 90px;    height: 90px;  }</style>

      底部内容

      通过默认插槽可以在 Empty 组件的下方插入内容。

      <van-empty description="描述文字">  <van-button round type="danger" class="bottom-button">按钮</van-button></van-empty><style>  .bottom-button {    width: 160px;    height: 40px;  }</style>

      API

      Props

      参数说明类型默认值
      image图片类型,可选值为 error network search,支持传入图片 URLstringdefault
      image-size图片大小,默认单位为 pxnumber | string-
      description图片下方的描述文字string-

      Slots

      名称说明
      default自定义底部内容
      image自定义图标
      description自定义描述文字

      样式变量

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

      名称默认值描述
      --van-empty-paddingvar(--van-padding-xl) 0-
      --van-empty-image-size160px-
      --van-empty-description-margin-topvar(--van-padding-md)-
      --van-empty-description-padding0 60px-
      --van-empty-description-colorvar(--van-gray-6)-
      --van-empty-description-font-sizevar(--van-font-size-md)-
      --van-empty-description-line-heightvar(--van-line-height-md)-
      --van-empty-bottom-margin-top24px-


      介绍

      图片放大预览,支持函数调用和组件调用两种方式。

      实例演示

      函数调用

      ImagePreview 是一个函数,调用函数后会直接在页面中展示图片预览界面。

      import { ImagePreview } from 'vant';ImagePreview(['https://img.yzcdn.cn/vant/apple-1.jpg']);

      组件调用

      通过组件调用 ImagePreview 时,可以通过下面的方式进行注册。

      import { createApp } from 'vue';import { ImagePreview } from 'vant';// 全局注册const app = createApp();app.use(ImagePreview);// 局部注册export default {  components: {    [ImagePreview.Component.name]: ImagePreview.Component,  },};

      代码演示

      基础用法

      直接传入图片数组,即可展示图片预览。

      ImagePreview([  'https://img.yzcdn.cn/vant/apple-1.jpg',  'https://img.yzcdn.cn/vant/apple-2.jpg',]);

      指定初始位置

      ImagePreview 支持传入配置对象,并通过 startPosition 选项指定图片的初始位置(索引值)。

      ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  startPosition: 1,});

      展示关闭按钮

      设置 closeable 属性后,会在弹出层的右上角显示关闭图标,并且可以通过 close-icon 属性自定义图标,使用close-icon-position 属性可以自定义图标位置。

      ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  closeable: true,});

      监听关闭事件

      通过 onClose 选项监听图片预览的关闭事件。

      import { Toast } from 'vant';ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  onClose() {    Toast('关闭');  },});

      异步关闭

      通过 beforeClose 属性可以拦截关闭行为。

      const instance = ImagePreview({  images: [    'https://img.yzcdn.cn/vant/apple-1.jpg',    'https://img.yzcdn.cn/vant/apple-2.jpg',  ],  beforeClose: () => false,});setTimeout(() => {  // 调用实例上的 close 方法手动关闭图片预览  instance.close();}, 2000);

      组件调用

      如果需要在图片预览内嵌入组件或其他自定义内容,可以使用组件调用的方式,调用前需要通过 app.use 注册组件。

      <van-image-preview  v-model:show="state.show"  :images="state.images"  @change="onChange">  <template v-slot:index>第{{ index }}页</template></van-image-preview>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      show: false,      index: 0,    });    const onChange = (index) => {      state.index = index;    };    return {      state,      images: [        'https://img.yzcdn.cn/vant/apple-1.jpg',        'https://img.yzcdn.cn/vant/apple-2.jpg',      ],      onChange,    };  },};

      API

      Options

      通过函数调用 ImagePreview 时,支持传入以下选项:

      参数名说明类型默认值
      images需要预览的图片 URL 数组string[][]
      startPosition图片预览起始位置索引number | string0
      swipeDuration动画时长,单位为 msnumber | string300
      showIndex是否显示页码booleantrue
      showIndicators是否显示轮播指示器booleanfalse
      loop是否开启循环播放booleantrue
      onClose关闭时的回调函数Function-
      onChange切换图片时的回调函数,回调参数为当前索引Function-
      onScale缩放图片时的回调函数,回调参数为当前索引和当前缩放值组成的对象Function-
      beforeClose关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(active: number) => boolean | Promise<boolean>-
      closeOnPopstate是否在页面回退时自动关闭booleantrue
      className自定义类名string | Array | object-
      maxZoom手势缩放时,最大缩放比例number | string3
      minZoom手势缩放时,最小缩放比例number | string1/3
      closeable是否显示关闭图标booleanfalse
      closeIcon关闭图标名称或图片链接stringclear
      closeIconPosition关闭图标位置,可选值为 top-left
      bottom-left bottom-right
      stringtop-right
      transition v3.0.8动画类名,等价于 transition 的 name 属性stringvan-fade
      overlay-style v3.0.8自定义遮罩层样式object-
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-

      Props

      通过组件调用 ImagePreview 时,支持以下 Props:

      参数说明类型默认值
      v-model:show是否展示图片预览booleanfalse
      images需要预览的图片 URL 数组string[][]
      start-position图片预览起始位置索引number | string0
      swipe-duration动画时长,单位为 msnumber | string300
      show-index是否显示页码booleantrue
      show-indicators是否显示轮播指示器booleanfalse
      loop是否开启循环播放booleantrue
      before-close关闭前的回调函数,返回 false 可阻止关闭,支持返回 Promise(active: number) => boolean | Promise<boolean>-
      close-on-popstate是否在页面回退时自动关闭booleantrue
      class-name自定义类名string | Array | object-
      max-zoom手势缩放时,最大缩放比例number | string3
      min-zoom手势缩放时,最小缩放比例number | string1/3
      closeable是否显示关闭图标booleanfalse
      close-icon关闭图标名称或图片链接stringclear
      close-icon-position关闭图标位置,可选值为 top-left
      bottom-left bottom-right
      stringtop-right
      transition v3.0.8动画类名,等价于 transition 的 name 属性stringvan-fade
      overlay-style v3.0.8自定义遮罩层样式object-
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Element-

      Events

      通过组件调用 ImagePreview 时,支持以下事件:

      事件说明回调参数
      close关闭时触发{ index: 索引, url: 图片链接 }
      closed关闭且且动画结束后触发-
      change切换当前图片时触发index: 当前图片的索引
      scale缩放当前图片时触发{ index: 当前图片的索引, scale: 当前缩放的值 }

      方法

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

      方法名说明参数返回值
      swipeTo 2.9.0切换到指定位置index: number, options: Options-

      Slots

      通过组件调用 ImagePreview 时,支持以下插槽:

      名称说明参数
      index自定义页码内容{ index: 当前图片的索引 }
      cover自定义覆盖在图片预览上方的内容-

      onClose 回调参数

      参数名说明类型
      url当前图片 URLstring
      index当前图片的索引值number

      onScale 回调参数

      参数名说明类型
      index当前图片的索引值number
      scale当前图片的缩放值number

      样式变量

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

      名称默认值描述
      --van-image-preview-index-text-colorvar(--van-white)-
      --van-image-preview-index-font-sizevar(--van-font-size-md)-
      --van-image-preview-index-line-heightvar(--van-line-height-md)-
      --van-image-preview-index-text-shadow0 1px 1px var(--van-gray-8)-
      --van-image-preview-overlay-background-colorrgba(0, 0, 0, 0.9)-
      --van-image-preview-close-icon-size22px-
      --van-image-preview-close-icon-colorvar(--van-gray-5)-
      --van-image-preview-close-icon-active-colorvar(--van-gray-6)-
      --van-image-preview-close-icon-marginvar(--van-padding-md)-
      --van-image-preview-close-icon-z-index1-

      常见问题

      在桌面端无法操作组件?

      参见桌面端适配

      在 JSX 中渲染 ImagePreview 组件无法展示?

      请注意 ImagePreview 是一个函数,ImagePreview.Component 才是 ImagePreview 对应的组件。JSX 调用图片预览的正确姿势如下:

      export default {  setup() {    const show = ref(false);    return () => <ImagePreview.Component v-model={[show, 'show']} />;  },};


      介绍

      当页面需要加载大量内容时,使用懒加载可以实现延迟加载页面可视区域外的内容,从而使页面加载更流畅。

      实例演示

      引入

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

      Lazyload 是 Vue 指令,使用前需要对指令进行注册。

      import { createApp } from 'vue';import { Lazyload } from 'vant';const app = createApp();app.use(Lazyload);// 注册时可以配置额外的选项app.use(Lazyload, {  lazyComponent: true,});

      代码演示

      基础用法

      将 v-lazy 指令的值设置为你需要懒加载的图片。

      <img v-for="img in imageList" v-lazy="img" />
      export default {  setup() {    return {      imageList: [        'https://img.yzcdn.cn/vant/apple-1.jpg',        'https://img.yzcdn.cn/vant/apple-2.jpg',      ],    };  },};

      背景图懒加载

      和图片懒加载不同,背景图懒加载需要使用 v-lazy:background-image,值设置为背景图片的地址,需要注意的是必须声明容器高度。

      <div v-for="img in imageList" v-lazy:background-image="img" />

      组件懒加载

      将需要懒加载的组件放在 lazy-component 标签中,即可实现组件懒加载。

      // 注册时设置`lazyComponent`选项app.use(Lazyload, {  lazyComponent: true,});
      <lazy-component>  <img v-for="img in imageList" v-lazy="img" /></lazy-component>

      API

      Options

      参数说明类型默认值
      loading加载时的图片string-
      error错误时的图片string-
      preload预加载高度的比例string-
      attempt尝试次数number3
      listenEvents监听的事件string[]scroll
      adapter适配器object-
      filter图片 URL 过滤object-
      lazyComponent是否能懒加载模块booleanfalse
      更多内容请参照:vue-lazyload 官方文档

      常见问题

      通过 CDN 引入 Vant 时,没有自动注册 Lazyload 组件?

      由于 Lazyload 组件在注册时可以传入一些配置项,所以我们不会自动注册 Lazyload 组件,需要手动进行注册:

      const app = Vue.createApp();app.use(vant.Lazyload, {  lazyComponent: true,});


      None

      介绍

      用于循环播放展示一组消息通知。

      实例演示

      引入

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

      import { createApp } from 'vue';import { NoticeBar } from 'vant';const app = createApp();app.use(NoticeBar);

      代码演示

      基础用法

      通过 text 属性设置通知栏的内容,通过 left-icon 属性设置通知栏左侧的图标。

      <van-notice-bar  left-icon="volume-o"  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>

      滚动播放

      通知栏的内容长度溢出时会自动开启滚动播放,通过 scrollable 属性可以控制该行为。

      <!-- 文字较短时,通过设置 scrollable 属性开启滚动播放 --><van-notice-bar scrollable text="技术是开发它的人的共同灵魂。" /><!-- 文字较长时,通过禁用 scrollable 属性关闭滚动播放 --><van-notice-bar  :scrollable="false"  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>

      多行展示

      文字较长时,可以通过设置 wrapable 属性来开启多行展示。

      <van-notice-bar  wrapable  :scrollable="false"  text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>

      通知栏模式

      通知栏支持 closeable 和 link 两种模式。

      <!-- closeable 模式,在右侧显示关闭按钮 --><van-notice-bar mode="closeable">技术是开发它的人的共同灵魂。</van-notice-bar><!-- link 模式,在右侧显示链接箭头 --><van-notice-bar mode="link">技术是开发它的人的共同灵魂。</van-notice-bar>

      自定义样式

      通过 color 属性设置文本颜色,通过 background 属性设置背景色。

      <van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o">  技术是开发它的人的共同灵魂。</van-notice-bar>

      垂直滚动

      搭配 NoticeBar 和 Swipe 组件可以实现垂直滚动的效果。

      <van-notice-bar left-icon="volume-o" :scrollable="false">  <van-swipe    vertical    class="notice-swipe"    :autoplay="3000"    :show-indicators="false"  >    <van-swipe-item>内容 1</van-swipe-item>    <van-swipe-item>内容 2</van-swipe-item>    <van-swipe-item>内容 3</van-swipe-item>  </van-swipe></van-notice-bar><style>  .notice-swipe {    height: 40px;    line-height: 40px;  }</style>

      API

      Props

      参数说明类型默认值
      mode通知栏模式,可选值为 closeable linkstring''
      text通知文本内容string''
      color通知文本颜色string#f60
      background滚动条背景string#fff7cc
      left-icon左侧图标名称或图片链接string-
      delay动画延迟时间 (s)number | string1
      speed滚动速率 (px/s)number | string60
      scrollable是否开启滚动播放,内容长度溢出时默认开启boolean-
      wrapable是否开启文本换行,只在禁用滚动时生效booleanfalse

      Events

      事件名说明回调参数
      click点击通知栏时触发event: MouseEvent
      close关闭通知栏时触发event: MouseEvent
      replay每当滚动栏重新开始滚动时触发-

      方法

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

      方法名说明参数返回值
      reset v3.1.1重置通知栏到初始状态--

      Slots

      名称内容
      default通知文本内容
      left-icon自定义左侧图标
      right-icon自定义右侧图标

      样式变量

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

      名称默认值描述
      --van-notice-bar-height40px-
      --van-notice-bar-padding0 var(--van-padding-md)-
      --van-notice-bar-wrapable-paddingvar(--van-padding-xs) var(--van-padding-md)-
      --van-notice-bar-text-colorvar(--van-orange-dark)-
      --van-notice-bar-font-sizevar(--van-font-size-md)-
      --van-notice-bar-line-height24px-
      --van-notice-bar-background-colorvar(--van-orange-light)-
      --van-notice-bar-icon-size16px-
      --van-notice-bar-icon-min-width24px-


      介绍

      弹出式的气泡菜单。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Popover } from 'vant';const app = createApp();app.use(Popover);

      代码演示

      基础用法

      当 Popover 弹出时,会基于 reference 插槽的内容进行定位。

      <van-popover v-model:show="showPopover" :actions="actions" @select="onSelect">  <template #reference>    <van-button type="primary">浅色风格</van-button>  </template></van-popover>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const showPopover = ref(false);    // 通过 actions 属性来定义菜单选项    const actions = [      { text: '选项一' },      { text: '选项二' },      { text: '选项三' },    ];    const onSelect = (action) => Toast(action.text);    return {      actions,      onSelect,      showPopover,    };  },};

      深色风格

      Popover 支持浅色和深色两种风格,默认为浅色风格,将 theme 属性设置为 dark 可切换为深色风格。

      <van-popover v-model:show="showPopover" theme="dark" :actions="actions">  <template #reference>    <van-button type="primary">深色风格</van-button>  </template></van-popover>
      import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    const actions = [      { text: '选项一' },      { text: '选项二' },      { text: '选项三' },    ];    return {      actions,      showPopover,    };  },};

      弹出位置

      通过 placement 属性来控制气泡的弹出位置。

      <van-popover placement="top" />

      placement 支持以下值:

      top           # 顶部中间位置top-start     # 顶部左侧位置top-end       # 顶部右侧位置left          # 左侧中间位置left-start    # 左侧上方位置left-end      # 左侧下方位置right         # 右侧中间位置right-start   # 右侧上方位置right-end     # 右侧下方位置bottom        # 底部中间位置bottom-start  # 底部左侧位置bottom-end    # 底部右侧位置

      展示图标

      在 actions 数组中,可以通过 icon 字段来定义选项的图标,支持传入图标名称或图片链接。

      <van-popover v-model:show="showPopover" :actions="actions">  <template #reference>    <van-button type="primary">展示图标</van-button>  </template></van-popover>
      import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    const actions = [      { text: '选项一', icon: 'add-o' },      { text: '选项二', icon: 'music-o' },      { text: '选项三', icon: 'more-o' },    ];    return {      actions,      showPopover,    };  },};

      禁用选项

      在 actions 数组中,可以通过 disabled 字段来禁用某个选项。

      <van-popover v-model:show="showPopover" :actions="actions">  <template #reference>    <van-button type="primary">禁用选项</van-button>  </template></van-popover>
      import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    const actions = [      { text: '选项一', disabled: true },      { text: '选项二', disabled: true },      { text: '选项三' },    ];    return {      actions,      showPopover,    };  },};

      自定义内容

      通过默认插槽,可以在 Popover 内部放置任意内容。

      <van-popover v-model:show="showPopover">  <van-grid    square    clickable    :border="false"    column-num="3"    style="width: 240px;"  >    <van-grid-item      v-for="i in 6"      :key="i"      text="选项"      icon="photo-o"      @click="showPopover = false"    />  </van-grid>  <template #reference>    <van-button type="primary">自定义内容</van-button>  </template></van-popover>
      import { ref } from 'vue';export default {  setup() {    const showPopover = ref(false);    return { showPopover };  },};

      API

      Props

      参数说明类型默认值
      v-model:show是否展示气泡弹出层booleanfalse
      actions选项列表Action[][]
      placement弹出位置stringbottom
      theme主题风格,可选值为 darkstringlight
      trigger触发方式,可选值为 manualclick
      duration动画时长,单位秒,设置为 0 可以禁用动画number | string0.3
      offset出现位置的偏移量[number, number][0, 8]
      overlay是否显示遮罩层booleanfalse
      overlay-class v3.0.10自定义遮罩层类名string | Array | object-
      overlay-style v3.0.10自定义遮罩层样式object-
      close-on-click-action是否在点击选项后关闭booleantrue
      close-on-click-outside是否在点击外部元素后关闭菜单booleantrue
      close-on-click-overlay v3.0.10是否在点击遮罩层后关闭菜单booleantrue
      teleport指定挂载的节点,等同于 Teleport 组件的 to 属性string | Elementbody
      icon-prefix v3.0.17图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon

      Action 数据结构

      actions 属性是一个由对象构成的数组,数组中的每个对象配置一列,对象可以包含以下值:

      键名说明类型
      text选项文字string
      icon文字左侧的图标,支持传入图标名称或图片链接string
      color选项文字颜色string
      disabled是否为禁用状态boolean
      className为对应选项添加额外的类名string | Array | object

      Events

      事件名说明回调参数
      select点击选项时触发action: Action, index: number
      open打开菜单时触发-
      close关闭菜单时触发-
      opened打开菜单且动画结束后触发-
      closed关闭菜单且动画结束后触发-
      click-overlay点击遮罩层时触发event: MouseEvent

      Slots

      名称说明
      default自定义菜单内容
      reference触发 Popover 显示的元素内容

      样式变量

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

      名称默认值描述
      --van-popover-arrow-size6px-
      --van-popover-border-radiusvar(--van-border-radius-lg)-
      --van-popover-action-width128px-
      --van-popover-action-height44px-
      --van-popover-action-font-sizevar(--van-font-size-md)-
      --van-popover-action-line-heightvar(--van-line-height-md)-
      --van-popover-action-icon-size20px-
      --van-popover-light-text-colorvar(--van-text-color)-
      --van-popover-light-background-colorvar(--van-white)-
      --van-popover-light-action-disabled-text-colorvar(--van-gray-5)-
      --van-popover-dark-text-colorvar(--van-white)-
      --van-popover-dark-background-color#4a4a4a-
      --van-popover-dark-action-disabled-text-colorvar(--van-gray-6)-

      常见问题

      Popover 的点击事件无法正确触发?

      这种情况通常是由于项目中引入了 fastclick 库导致的。建议移除 fastclick,或者配置 fastclick 的 ignore 规则



      介绍

      用于展示操作的当前进度。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Progress } from 'vant';const app = createApp();app.use(Progress);

      代码演示

      基础用法

      进度条默认为蓝色,使用 percentage 属性来设置当前进度。

      <van-progress :percentage="50" />

      线条粗细

      通过 stroke-width 可以设置进度条的粗细。

      <van-progress :percentage="50" stroke-width="8" />

      置灰

      设置 inactive 属性后进度条将置灰。

      <van-progress inactive :percentage="50" />

      样式定制

      可以使用 pivot-text 属性自定义文字,color 属性自定义进度条颜色。

      <van-progress pivot-text="橙色" color="#f2826a" :percentage="25" /><van-progress pivot-text="红色" color="#ee0a24" :percentage="50" /><van-progress  :percentage="75"  pivot-text="紫色"  pivot-color="#7232dd"  color="linear-gradient(to right, #be99ff, #7232dd)"/>

      API

      Props

      参数说明类型默认值
      percentage进度百分比number | string0
      stroke-width进度条粗细,默认单位为pxnumber | string4px
      color进度条颜色string#1989fa
      track-color轨道颜色string#e5e5e5
      pivot-text进度文字内容string百分比
      pivot-color进度文字背景色string同进度条颜色
      text-color进度文字颜色stringwhite
      inactive是否置灰booleanfalse
      show-pivot是否显示进度文字booleantrue

      方法

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

      方法名说明参数返回值
      resize外层元素大小变化后,可以调用此方法来触发重绘--

      样式变量

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

      名称默认值描述
      --van-progress-height4px-
      --van-progress-colorvar(--van-primary-color)-
      --van-progress-background-colorvar(--van-gray-3)-
      --van-progress-pivot-padding0 5px-
      --van-progress-pivot-text-colorvar(--van-white)-
      --van-progress-pivot-font-sizevar(--van-font-size-xs)-
      --van-progress-pivot-line-height1.6-
      --van-progress-pivot-background-colorvar(--van-primary-color)-

      常见问题

      组件从隐藏状态切换到显示状态时,渲染不正确?

      Progress 组件在挂载时,会获取自身的宽度,并计算出进度条的样式。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示正确的进度。

      解决方法

      方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

      <!-- Before --><van-progress v-show="show" /><!-- After --><van-progress v-if="show" />

      方法二,调用组件的 resize 方法来主动触发重绘:

      <van-progress v-show="show" ref="progress" />
      this.$refs.progress.resize();


      介绍

      用于在内容加载过程中展示一组占位图形。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Skeleton } from 'vant';const app = createApp();app.use(Skeleton);

      代码演示

      基础用法

      通过 title 属性显示标题占位图,通过 row 属性配置占位段落行数。

      <van-skeleton title :row="3" />

      显示头像

      通过 avatar 属性显示头像占位图。

      <van-skeleton title avatar :row="3" />

      展示子组件

      将 loading 属性设置成 false 表示内容加载完成,此时会隐藏占位图,并显示 Skeleton 的子组件。

      <van-skeleton title avatar :row="3" :loading="loading">  <div>实际内容</div></van-skeleton>
      import { ref, onMounted } from 'vue';export default {  setup() {    const loading = ref(true);    onMounted(() => {      loading.value = false;    });    return {      loading,    };  },};

      API

      Props

      参数说明类型默认值
      row段落占位图行数number | string0
      row-width段落占位图宽度,可传数组来设置每一行的宽度number | string |
      (number | string)[]
      100%
      title是否显示标题占位图booleanfalse
      avatar是否显示头像占位图booleanfalse
      loading是否显示骨架屏,传 false 时会展示子组件内容booleantrue
      animate是否开启动画booleantrue
      round是否将标题和段落显示为圆角风格booleanfalse
      title-width标题占位图宽度number | string40%
      avatar-size头像占位图大小number | string32px
      avatar-shape头像占位图形状,可选值为 squarestringround

      样式变量

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

      名称默认值描述
      --van-skeleton-row-height16px-
      --van-skeleton-row-background-colorvar(--van-active-color)-
      --van-skeleton-row-margin-topvar(--van-padding-sm)-
      --van-skeleton-title-width40%-
      --van-skeleton-avatar-size32px-
      --van-skeleton-avatar-background-colorvar(--van-active-color)-
      --van-skeleton-animation-duration1.2s-


      介绍

      用于展示操作流程的各个环节,让用户了解当前的操作在整体流程中的位置。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Step, Steps } from 'vant';const app = createApp();app.use(Step);app.use(Steps);

      代码演示

      基础用法

      active 属性表示当前步骤的索引,从 0 起计。

      <van-steps :active="active">  <van-step>买家下单</van-step>  <van-step>商家接单</van-step>  <van-step>买家提货</van-step>  <van-step>交易完成</van-step></van-steps>
      import { ref } from 'vue';export default {  setup() {    const active = ref(1);    return { active };  },};

      自定义样式

      可以通过 active-icon 和 active-color 属性设置激活状态下的图标和颜色。

      <van-steps :active="active" active-icon="success" active-color="#38f">  <van-step>买家下单</van-step>  <van-step>商家接单</van-step>  <van-step>买家提货</van-step>  <van-step>交易完成</van-step></van-steps>

      竖向步骤条

      可以通过设置 direction 属性来改变步骤条的显示方向。

      <van-steps direction="vertical" :active="0">  <van-step>    <h3>【城市】物流状态1</h3>    <p>2016-07-12 12:40</p>  </van-step>  <van-step>    <h3>【城市】物流状态2</h3>    <p>2016-07-11 10:00</p>  </van-step>  <van-step>    <h3>快件已发货</h3>    <p>2016-07-10 09:30</p>  </van-step></van-steps>

      API

      Steps Props

      参数说明类型默认值
      active当前步骤对应的索引值number | string0
      direction步骤条方向,可选值为 verticalstringhorizontal
      active-icon当前步骤对应的底部图标,可选值见 Icon 组件stringchecked
      inactive-icon非当前步骤对应的底部图标,可选值见 Icon 组件string-
      finish-icon v3.0.7已完成步骤对应的底部图标,优先级高于 inactive-icon,可选值见 Icon 组件string-
      active-color当前步骤和已完成步骤的颜色string#07c160
      inactive-color未激活步骤的颜色string#969799
      icon-prefix v3.0.15图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon

      Step Slots

      名称说明
      active-icon自定义激活状态图标
      inactive-icon自定义未激活状态图标
      finish-icon v3.0.7自定义已完成步骤对应的底部图标,优先级高于 inactive-icon

      Steps Events

      事件名说明回调参数
      click-step点击步骤的标题或图标时触发index: number

      样式变量

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

      名称默认值描述
      --van-step-text-colorvar(--van-gray-6)-
      --van-step-active-colorvar(--van-success-color)-
      --van-step-process-text-colorvar(--van-text-color)-
      --van-step-font-sizevar(--van-font-size-md)-
      --van-step-line-colorvar(--van-border-color)-
      --van-step-finish-line-colorvar(--van-success-color)-
      --van-step-finish-text-colorvar(--van-text-color)-
      --van-step-icon-size12px-
      --van-step-circle-size5px-
      --van-step-circle-colorvar(--van-gray-6)-
      --van-step-horizontal-title-font-sizevar(--van-font-size-sm)-
      --van-steps-background-colorvar(--van-white)-


      介绍

      Sticky 组件与 CSS 中 position: sticky 属性实现的效果一致,当组件在屏幕范围内时,会按照正常的布局排列,当组件滚出屏幕范围时,始终会固定在屏幕顶部。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Sticky } from 'vant';const app = createApp();app.use(Sticky);

      代码演示

      基础用法

      将内容包裹在 Sticky 组件内即可。

      <van-sticky>  <van-button type="primary">基础用法</van-button></van-sticky>

      吸顶距离

      通过 offset-top 属性可以设置组件在吸顶时与顶部的距离。

      <van-sticky :offset-top="50">  <van-button type="primary">吸顶距离</van-button></van-sticky>

      指定容器

      通过 container 属性可以指定组件的容器,页面滚动时,组件会始终保持在容器范围内,当组件即将超出容器底部时,会固定在容器的底部。

      <div ref="container" style="height: 150px;">  <van-sticky :container="container">    <van-button type="warning">指定容器</van-button>  </van-sticky></div>
      export default {  setup() {    const container = ref(null);    return { container };  },};

      吸底距离

      将 position 设置为 bottom 可以让组件吸附在底部。通过 offset-bottom 属性可以设置组件在吸底时与底部的距离。

      <van-sticky :offset-bottom="50" position="bottom">  <van-button type="primary">吸底距离</van-button></van-sticky>

      API

      Props

      参数说明类型默认值
      position v3.0.6吸附位置,可选值为 bottomstringtop
      offset-top吸顶时与顶部的距离,支持 px vw vh rem 单位,默认 pxnumber | string0
      offset-bottom v3.0.6吸底时与底部的距离,支持 px vw vh rem 单位,默认 pxnumber | string0
      z-index吸顶时的 z-indexnumber | string99
      container容器对应的 HTML 节点Element-

      Events

      事件名说明回调参数
      change v3.0.10当吸顶状态改变时触发isFixed: boolean
      scroll滚动时触发{ scrollTop: number, isFixed: boolean }

      样式变量

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

      名称默认值描述
      --van-sticky-z-index99-


      介绍

      用于循环播放一组图片或内容。

      实例演示

      引入

      通过以下方式来全局注册组件,更多注册方式请参考组件注册import { createApp } from 'vue';

      import { Swipe, SwipeItem } from 'vant';const app = createApp();app.use(Swipe);app.use(SwipeItem);

      代码演示

      基础用法

      每个 SwipeItem 代表一张轮播卡片,可以通过 autoplay 属性设置自动轮播的间隔。

      <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe><style>  .my-swipe .van-swipe-item {    color: #fff;    font-size: 20px;    line-height: 150px;    text-align: center;    background-color: #39a9ed;  }</style>

      懒加载

      当 Swipe 中含有图片时,可以通过 lazy-render 属性来开启懒加载模式。在懒加载模式下,只会渲染当前页和下一页。

      <van-swipe :autoplay="3000" lazy-render>  <van-swipe-item v-for="image in images" :key="image">    <img :src="image" />  </van-swipe-item></van-swipe>
      export default {  setup() {    const images = [      'https://img.yzcdn.cn/vant/apple-1.jpg',      'https://img.yzcdn.cn/vant/apple-2.jpg',    ];    return { images };  },};

      监听 change 事件

      在每一页轮播结束后,会触发 change 事件。

      <van-swipe @change="onChange">  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe>
      import { Toast } from 'vant';export default {  setup() {    const onChange = (index) => Toast('当前 Swipe 索引:' + index);    return { onChange };  },};

      纵向滚动

      设置 vertical 属性后滑块会纵向排列,此时需要指定滑块容器的高度。

      <van-swipe style="height: 200px;" vertical>  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe>

      自定义滑块大小

      滑块默认宽度为 100%,可以通过 width 属性设置单个滑块的宽度。纵向滚动模式下,可以通过 height 属性设置单个滑块的高度。

      <van-swipe :loop="false" :width="300">  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item></van-swipe>
      目前不支持在循环滚动模式下自定义滑块大小,因此需要将 loop 设置为 false。

      自定义指示器

      通过 indicator 插槽可以自定义指示器的样式。

      <van-swipe>  <van-swipe-item>1</van-swipe-item>  <van-swipe-item>2</van-swipe-item>  <van-swipe-item>3</van-swipe-item>  <van-swipe-item>4</van-swipe-item>  <template #indicator="{ active }">    <div class="custom-indicator">{{ active + 1 }}/4</div>  </template></van-swipe><style>  .custom-indicator {    position: absolute;    right: 5px;    bottom: 5px;    padding: 2px 5px;    font-size: 12px;    background: rgba(0, 0, 0, 0.1);  }</style>

      API

      Swipe Props

      参数说明类型默认值
      autoplay自动轮播间隔,单位为 msnumber | string-
      duration动画时长,单位为 msnumber | string500
      initial-swipe初始位置索引值number | string0
      width滑块宽度,单位为 pxnumber | stringauto
      height滑块高度,单位为 pxnumber | stringauto
      loop是否开启循环播放booleantrue
      show-indicators是否显示指示器booleantrue
      vertical是否为纵向滚动booleanfalse
      touchable是否可以通过手势滑动booleantrue
      stop-propagation是否阻止滑动事件冒泡booleantrue
      lazy-render是否延迟渲染未展示的轮播booleanfalse
      indicator-color指示器颜色string#1989fa

      Swipe Events

      事件名说明回调参数
      change每一页轮播结束后触发index, 当前页的索引

      SwipeItem Events

      事件名说明回调参数
      click点击时触发event: MouseEvent

      Swipe 方法

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

      方法名说明参数返回值
      prev切换到上一轮播--
      next切换到下一轮播--
      swipeTo切换到指定位置index: number, options: SwipeToOptions-
      resize外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘--

      类型定义

      通过 SwipeInstance 获取 Swipe 实例的类型定义。

      import { ref } from 'vue';import type { SwipeInstance } from 'vant';const swipeRef = ref<SwipeInstance>();swipeRef.value?.next();

      SwipeToOptions 格式

      名称说明类型
      immediate是否跳过动画boolean

      Swipe Slots

      名称说明参数
      default轮播内容-
      indicator v3.0.16自定义指示器{ active: number }

      样式变量

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

      名称默认值描述
      --van-swipe-indicator-size6px-
      --van-swipe-indicator-marginvar(--van-padding-sm)-
      --van-swipe-indicator-active-opacity1-
      --van-swipe-indicator-inactive-opacity0.3-
      --van-swipe-indicator-active-background-colorvar(--van-primary-color)-
      --van-swipe-indicator-inactive-background-colorvar(--van-border-color)-

      常见问题

      滑动轮播时为什么触发了 click 事件?

      这种情况通常是由于项目中引入了 fastclick 库导致的。fastclick 的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。

      将 Swipe 组件的 stop-propagation 属性设置为 false 即可避免该问题。

      在桌面端无法操作组件?

      参见桌面端适配

      Swipe 组件功能太少,无法实现复杂效果?

      Vant 中的 Swipe 组件是比较轻量的,因此功能也比较基础。如果需要更复杂的轮播效果,推荐使用社区里一些优质的轮播库,比如 vue-awesome-swiper

      组件从隐藏状态切换到显示状态时,无法正确渲染?

      Swipe 组件在挂载时,会获取自身的宽度,并计算出轮播图的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法正确计算位置。

      解决方法

      方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

      <!-- Before --><van-swipe v-show="show" /><!-- After --><van-swipe v-if="show" />

      方法二,调用组件的 resize 方法来主动触发重绘:

      <van-swipe v-show="show" ref="swipe" />
      this.$refs.swipe.resize();


      介绍

      用于标记关键词和概括主要内容。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Tag } from 'vant';const app = createApp();app.use(Tag);

      代码演示

      基础用法

      通过 type 属性控制标签颜色。

      <van-tag type="primary">标签</van-tag><van-tag type="success">标签</van-tag><van-tag type="danger">标签</van-tag><van-tag type="warning">标签</van-tag>

      空心样式

      设置 plain 属性设置为空心样式。

      <van-tag plain type="primary">标签</van-tag>

      圆角样式

      通过 round 设置为圆角样式。

      <van-tag round type="primary">标签</van-tag>

      标记样式

      通过 mark 设置为标记样式(半圆角)。

      <van-tag mark type="primary">标签</van-tag>

      可关闭标签

      添加 closeable 属性表示标签是可关闭的,关闭标签时会触发 close 事件,在 close 事件中可以执行隐藏标签的逻辑。

      <van-tag :show="show" closeable size="medium" type="primary" @close="close">  标签</van-tag>
      import { ref } from 'vue';export default {  setup() {    const show = ref(true);    const close = () => {      show.value = false;    };    return {      show,      close,    };  },};

      标签大小

      通过 size 属性调整标签大小。

      <van-tag type="primary">标签</van-tag><van-tag type="primary" size="medium">标签</van-tag><van-tag type="primary" size="large">标签</van-tag>

      自定义颜色

      通过 color 和 text-color 属性设置标签颜色。

      <van-tag color="#7232dd">标签</van-tag><van-tag color="#ffe1e1" text-color="#ad0000">标签</van-tag><van-tag color="#7232dd" plain>标签</van-tag>

      API

      Props

      参数说明类型默认值
      type类型,可选值为 primary success danger warningstringdefault
      size大小, 可选值为 large mediumstring-
      color标签颜色string-
      show是否展示标签booleantrue
      plain是否为空心样式booleanfalse
      round是否为圆角样式booleanfalse
      mark是否为标记样式booleanfalse
      text-color文本颜色,优先级高于 color 属性stringwhite
      closeable是否为可关闭标签booleanfalse

      Slots

      名称说明
      default标签显示内容

      Events

      事件名说明回调参数
      click点击时触发event: MouseEvent
      close关闭标签时触发event: MouseEvent

      样式变量

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

      名称默认值描述
      --van-tag-padding0 var(--van-padding-base)-
      --van-tag-text-colorvar(--van-white)-
      --van-tag-font-sizevar(--van-font-size-sm)-
      --van-tag-border-radius2px-
      --van-tag-line-height16px-
      --van-tag-medium-padding2px 6px-
      --van-tag-large-paddingvar(--van-padding-base) var(--van-padding-xs)-
      --van-tag-large-border-radiusvar(--van-border-radius-md)-
      --van-tag-large-font-sizevar(--van-font-size-md)-
      --van-tag-round-border-radiusvar(--van-border-radius-max)-
      --van-tag-danger-colorvar(--van-danger-color)-
      --van-tag-primary-colorvar(--van-primary-color)-
      --van-tag-success-colorvar(--van-success-color)-
      --van-tag-warning-colorvar(--van-warning-color)-
      --van-tag-default-colorvar(--van-gray-6)-
      --van-tag-plain-background-colorvar(--van-white)-


      介绍

      用于为页面相关操作提供便捷交互。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ActionBar, ActionBarIcon, ActionBarButton } from 'vant';const app = createApp();app.use(ActionBar);app.use(ActionBarIcon);app.use(ActionBarButton);

      代码演示

      基础用法

      <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" @click="onClickIcon" />  <van-action-bar-icon icon="cart-o" text="购物车" @click="onClickIcon" />  <van-action-bar-icon icon="shop-o" text="店铺" @click="onClickIcon" />  <van-action-bar-button type="danger" text="立即购买" @click="onClickButton" /></van-action-bar>
      import { Toast } from 'vant';export default {  setup() {    const onClickIcon = () => Toast('点击图标');    const onClickButton = () => Toast('点击按钮');    return {      onClickIcon,      onClickButton,    };  },};

      徽标提示

      在 ActionBarIcon 组件上设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

      <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" dot />  <van-action-bar-icon icon="cart-o" text="购物车" badge="5" />  <van-action-bar-icon icon="shop-o" text="店铺" badge="12" />  <van-action-bar-button type="warning" text="加入购物车" />  <van-action-bar-button type="danger" text="立即购买" /></van-action-bar>

      自定义图标颜色

      通过 ActionBarIcon 的 color 属性可以自定义图标的颜色。

      <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" color="#ee0a24" />  <van-action-bar-icon icon="cart-o" text="购物车" />  <van-action-bar-icon icon="star" text="已收藏" color="#ff5000" />  <van-action-bar-button type="warning" text="加入购物车" />  <van-action-bar-button type="danger" text="立即购买" /></van-action-bar>

      自定义按钮颜色

      通过 ActionBarButton 的 color 属性可以自定义按钮的颜色,支持传入 linear-gradient 渐变色。

      <van-action-bar>  <van-action-bar-icon icon="chat-o" text="客服" />  <van-action-bar-icon icon="shop-o" text="店铺" />  <van-action-bar-button color="#be99ff" type="warning" text="加入购物车" />  <van-action-bar-button color="#7232dd" type="danger" text="立即购买" /></van-action-bar>

      API

      ActionBar Props

      参数说明类型默认值
      safe-area-inset-bottom是否开启底部安全区适配booleantrue

      ActionBarIcon Props

      参数说明类型默认值
      text按钮文字string-
      icon图标string-
      color图标颜色string#323233
      icon-class图标额外类名string | Array | object-
      icon-prefix v3.0.17图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon
      dot是否显示图标右上角小红点booleanfalse
      badge图标右上角徽标的内容number | string-
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse

      ActionBarButton Props

      参数说明类型默认值
      text按钮文字string-
      type按钮类型,可选值为 primary info warning dangerstringdefault
      color按钮颜色,支持传入 linear-gradient 渐变色string-
      icon左侧图标名称或图片链接string-
      disabled是否禁用按钮booleanfalse
      loading是否显示为加载状态booleanfalse
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse

      ActionBarIcon Slots

      名称说明
      default文本内容
      icon自定义图标

      ActionBarButton Slots

      名称说明
      default按钮显示内容

      样式变量

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

      名称默认值描述
      --van-action-bar-background-colorvar(--van-white)-
      --van-action-bar-height50px-
      --van-action-bar-icon-width48px-
      --van-action-bar-icon-height100%-
      --van-action-bar-icon-colorvar(--van-text-color)-
      --van-action-bar-icon-size18px-
      --van-action-bar-icon-font-sizevar(--van-font-size-xs)-
      --van-action-bar-icon-active-colorvar(--van-active-color)-
      --van-action-bar-icon-text-colorvar(--van-gray-7)-
      --van-action-bar-icon-background-colorvar(--van-white)-
      --van-action-bar-button-height40px-
      --van-action-bar-button-warning-colorvar(--van-gradient-orange)-
      --van-action-bar-button-danger-colorvar(--van-gradient-red)-


      介绍

      宫格可以在水平方向上把页面分隔成等宽度的区块,用于展示内容或进行页面导航。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Grid, GridItem } from 'vant';const app = createApp();app.use(Grid);app.use(GridItem);

      代码演示

      基础用法

      通过 icon 属性设置格子内的图标,text 属性设置文字内容。

      <van-grid>  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" /></van-grid>

      自定义列数

      默认一行展示四个格子,可以通过 column-num 自定义列数。

      <van-grid :column-num="3">  <van-grid-item v-for="value in 6" :key="value" icon="photo-o" text="文字" /></van-grid>

      自定义内容

      通过插槽可以自定义格子展示的内容。

      <van-grid :border="false" :column-num="3">  <van-grid-item>    <van-image src="https://img.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow"  />  </van-grid-item>  <van-grid-item>    <van-image src="https://img.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow"  />  </van-grid-item>  <van-grid-item>    <van-image src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow"  />  </van-grid-item></van-grid>

      正方形格子

      设置 square 属性后,格子的高度会和宽度保持一致。

      <van-grid square>  <van-grid-item v-for="value in 8" :key="value" icon="photo-o" text="文字" /></van-grid>

      格子间距

      通过 gutter 属性设置格子之间的距离。

      <van-grid :gutter="10">  <van-grid-item v-for="value in 8" :key="value" icon="photo-o" text="文字" /></van-grid>

      内容横排

      将 direction 属性设置为 horizontal,可以让宫格的内容呈横向排列。

      <van-grid direction="horizontal" :column-num="3">  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" />  <van-grid-item icon="photo-o" text="文字" /></van-grid>

      页面导航

      通过 to 属性设置 vue-router 跳转链接,通过 url 属性设置 URL 跳转链接。

      <van-grid clickable :column-num="2">  <van-grid-item icon="home-o" text="路由跳转" to="/" />  <van-grid-item icon="search" text="URL 跳转" url="/vant/mobile.html" /></van-grid>

      徽标提示

      设置 dot 属性后,会在图标右上角展示一个小红点。设置 badge 属性后,会在图标右上角展示相应的徽标。

      <van-grid :column-num="2">  <van-grid-item icon="home-o" text="文字" dot />  <van-grid-item icon="search" text="文字" badge="99+" /></van-grid>

      API

      Grid Props

      参数说明类型默认值
      column-num列数number | string4
      icon-size图标大小,默认单位为pxnumber | string28px
      gutter格子之间的间距,默认单位为pxnumber | string0
      border是否显示边框booleantrue
      center是否将格子内容居中显示booleantrue
      square是否将格子固定为正方形booleanfalse
      clickable是否开启格子点击反馈booleanfalse
      direction格子内容排列的方向,可选值为 horizontalstringvertical

      GridItem Props

      参数说明类型默认值
      text文字string-
      icon图标名称或图片链接string-
      icon-prefix图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon
      icon-color图标颜色,等同于 Icon 组件的 color 属性string-
      reverse v3.1.0是否调换图标和文本的位置booleanfalse
      dot是否显示图标右上角小红点booleanfalse
      badge图标右上角徽标的内容number | string-
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse

      GridItem Events

      事件名说明回调参数
      click点击格子时触发event: MouseEvent

      GridItem Slots

      名称说明
      default自定义宫格的所有内容
      icon自定义图标
      text自定义文字

      样式变量

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

      名称默认值描述
      --van-grid-item-content-paddingvar(--van-padding-md) var(--van-padding-xs)-
      --van-grid-item-content-background-colorvar(--van-white)-
      --van-grid-item-content-active-colorvar(--van-active-color)-
      --van-grid-item-icon-size28px-
      --van-grid-item-text-colorvar(--van-gray-7)-
      --van-grid-item-text-font-sizevar(--van-font-size-sm)-


      介绍

      用于列表的索引分类显示和快速定位。

      实例演示

      引入

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

      import { createApp } from 'vue';import { IndexBar, IndexAnchor } from 'vant';const app = createApp();app.use(IndexBar);app.use(IndexAnchor);

      代码演示

      基础用法

      点击索引栏时,会自动跳转到对应的 IndexAnchor 锚点位置。

      <van-index-bar>  <van-index-anchor index="A" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-index-anchor index="B" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  ...</van-index-bar>

      自定义索引列表

      可以通过 index-list 属性自定义展示的索引字符列表。

      <van-index-bar :index-list="indexList">  <van-index-anchor index="1">标题1</van-index-anchor>  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  <van-index-anchor index="2">标题2</van-index-anchor>  <van-cell title="文本" />  <van-cell title="文本" />  <van-cell title="文本" />  ...</van-index-bar>
      export default {  setup() {    return {      indexList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],    };  },};

      API

      IndexBar Props

      参数说明类型默认值
      index-list索引字符列表string[] | number[]A-Z
      z-indexz-index 层级number | string1
      sticky是否开启锚点自动吸顶booleantrue
      sticky-offset-top锚点自动吸顶时与顶部的距离number0
      highlight-color索引字符高亮颜色string#ee0a24
      teleport v3.0.19指定索引栏挂载的节点string | Element-

      IndexAnchor Props

      参数说明类型默认值
      index索引字符number | string-

      IndexBar Events

      事件名说明回调参数
      select点击索引栏的字符时触发index: number | string
      change当前高亮的索引字符变化时触发index: number | string

      IndexBar 方法

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

      方法名说明参数返回值
      scrollTo滚动到指定锚点index: number | string-

      IndexAnchor Slots

      名称说明
      default锚点位置显示内容,默认为索引字符

      样式变量

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

      名称默认值描述
      --van-index-bar-sidebar-z-index2-
      --van-index-bar-index-font-sizevar(--van-font-size-xs)-
      --van-index-bar-index-line-heightvar(--van-line-height-xs)-
      --van-index-bar-index-active-colorvar(--van-danger-color)-
      --van-index-anchor-z-index1-
      --van-index-anchor-padding0 var(--van-padding-md)-
      --van-index-anchor-text-colorvar(--van-text-color)-
      --van-index-anchor-font-weightvar(--van-font-weight-bold)-
      --van-index-anchor-font-sizevar(--van-font-size-md)-
      --van-index-anchor-line-height32px-
      --van-index-anchor-background-colortransparent-
      --van-index-anchor-sticky-text-colorvar(--van-danger-color)-
      --van-index-anchor-sticky-background-colorvar(--van-white)-


      介绍

      为页面提供导航功能,常用于页面顶部。

      实例演示

      引入

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

      import { createApp } from 'vue';import { NavBar } from 'vant';const app = createApp();app.use(NavBar);

      代码演示

      基础用法

      <van-nav-bar  title="标题"  left-text="返回"  right-text="按钮"  left-arrow  @click-left="onClickLeft"  @click-right="onClickRight"/>
      import { Toast } from 'vant';export default {  setup() {    const onClickLeft = () => Toast('返回');    const onClickRight = () => Toast('按钮');    return {      onClickLeft,      onClickRight,    };  },};

      使用插槽

      通过插槽自定义导航栏两侧的内容。

      <van-nav-bar title="标题" left-text="返回" left-arrow>  <template #right>    <van-icon name="search" size="18" />  </template></van-nav-bar>

      API

      Props

      参数说明类型默认值
      title标题string''
      left-text左侧文案string''
      right-text右侧文案string''
      left-arrow是否显示左侧箭头booleanfalse
      border是否显示下边框booleantrue
      fixed是否固定在顶部booleanfalse
      placeholder固定在顶部时,是否在标签位置生成一个等高的占位元素booleanfalse
      z-index导航栏 z-indexnumber | string1
      safe-area-inset-top是否开启顶部安全区适配booleanfalse

      Slots

      名称说明
      title自定义标题
      left自定义左侧区域内容
      right自定义右侧区域内容

      Events

      事件名说明回调参数
      click-left点击左侧按钮时触发event: MouseEvent
      click-right点击右侧按钮时触发event: MouseEvent

      样式变量

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

      名称默认值描述
      --van-nav-bar-height46px-
      --van-nav-bar-background-colorvar(--van-white)-
      --van-nav-bar-arrow-size16px-
      --van-nav-bar-icon-colorvar(--van-primary-color)-
      --van-nav-bar-text-colorvar(--van-primary-color)-
      --van-nav-bar-title-font-sizevar(--van-font-size-lg)-
      --van-nav-bar-title-text-colorvar(--van-text-color)-
      --van-nav-bar-z-index1-


      介绍

      数据量过多时,采用分页的形式将数据分隔,每次只加载一个页面。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Pagination } from 'vant';const app = createApp();app.use(Pagination);

      代码演示

      基础用法

      通过 v-model 来绑定当前页码。

      <van-pagination v-model="currentPage" :total-items="24" :items-per-page="5" />
      import { ref } from 'vue';export default {  setup() {    const currentPage = ref(1);    return { currentPage };  },};

      简单模式

      将 mode 设置为 simple 来切换到简单模式,此时分页器不会展示具体的页码按钮。

      <van-pagination v-model="currentPage" :page-count="12" mode="simple" />

      显示省略号

      设置 force-ellipses 后会展示省略号按钮,点击后可以快速跳转。

      <van-pagination  v-model="currentPage"  :total-items="125"  :show-page-size="3"  force-ellipses/>

      自定义按钮

      通过 prev-text、next-text 等插槽来自定义分页按钮的内容。

      <van-pagination v-model="currentPage" :total-items="50" :show-page-size="5">  <template #prev-text>    <van-icon name="arrow-left" />  </template>  <template #next-text>    <van-icon name="arrow" />  </template>  <template #page="{ text }">{{ text }}</template></van-pagination>

      API

      Props

      参数说明类型默认值
      v-model当前页码number-
      mode显示模式,可选值为 simplestringmulti
      prev-text上一页按钮文字string上一页
      next-text下一页按钮文字string下一页
      page-count总页数number | string根据页数计算
      total-items总记录数number | string0
      items-per-page每页记录数number | string10
      show-page-size显示的页码个数number | string5
      force-ellipses是否显示省略号booleanfalse

      Events

      事件名说明回调参数
      change页码改变时触发-

      Slots

      名称描述参数
      page自定义页码{ number: number, text: string, active: boolean }
      prev-text自定义上一页按钮文字-
      next-text自定义下一页按钮文字-

      样式变量

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

      名称默认值描述
      --van-pagination-height40px-
      --van-pagination-font-sizevar(--van-font-size-md)-
      --van-pagination-item-width36px-
      --van-pagination-item-default-colorvar(--van-primary-color)-
      --van-pagination-item-disabled-colorvar(--van-gray-7)-
      --van-pagination-item-disabled-background-colorvar(--van-background-color)-
      --van-pagination-background-colorvar(--van-white)-
      --van-pagination-desc-colorvar(--van-gray-7)-
      --van-pagination-disabled-opacityvar(--van-disabled-opacity)-


      介绍

      垂直展示的导航栏,用于在不同的内容区域之间进行切换。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Sidebar, SidebarItem } from 'vant';const app = createApp();app.use(Sidebar);app.use(SidebarItem);

      代码演示

      基础用法

      通过 v-model 绑定当前选中项的索引。

      <van-sidebar v-model="active">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" /></van-sidebar>
      import { ref } from 'vue';export default {  setup() {    const active = ref(0);    return { active };  },};

      徽标提示

      设置 dot 属性后,会在右上角展示一个小红点;设置 badge 属性后,会在右上角展示相应的徽标。

      <van-sidebar v-model="active">  <van-sidebar-item title="标签名称" dot />  <van-sidebar-item title="标签名称" badge="5" />  <van-sidebar-item title="标签名称" badge="20" /></van-sidebar>

      禁用选项

      通过 disabled 属性禁用选项。

      <van-sidebar v-model="active">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" disabled />  <van-sidebar-item title="标签名称" /></van-sidebar>

      监听切换事件

      设置 change 方法来监听切换导航项时的事件。

      <van-sidebar v-model="active" @change="onChange">  <van-sidebar-item title="标签名 1" />  <van-sidebar-item title="标签名 2" />  <van-sidebar-item title="标签名 3" /></van-sidebar>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const active = ref(0);    const onChange = (index) => Toast(`标签名 ${index + 1}`);    return {      active,      onChange,    };  },};

      API

      Sidebar Props

      参数说明类型默认值
      v-model当前导航项的索引number | string0

      Sidebar Events

      事件名说明回调参数
      change切换导航项时触发index: number

      SidebarItem Props

      参数说明类型默认值
      title内容string''
      dot是否显示右上角小红点booleanfalse
      badge图标右上角徽标的内容number | string-
      disabled是否禁用该项booleanfalse
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse

      SidebarItem Events

      事件名说明回调参数
      click点击时触发index: number

      SidebarItem Slots

      NameDescription
      title自定义标题

      样式变量

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

      名称默认值描述
      --van-sidebar-width80px-
      --van-sidebar-font-sizevar(--van-font-size-md)-
      --van-sidebar-line-heightvar(--van-line-height-md)-
      --van-sidebar-text-colorvar(--van-text-color)-
      --van-sidebar-disabled-text-colorvar(--van-gray-5)-
      --van-sidebar-padding20px var(--van-padding-sm)-
      --van-sidebar-active-colorvar(--van-active-color)-
      --van-sidebar-background-colorvar(--van-background-color)-
      --van-sidebar-selected-font-weightvar(--van-font-weight-bold)-
      --van-sidebar-selected-text-colorvar(--van-text-color)-
      --van-sidebar-selected-border-width4px-
      --van-sidebar-selected-border-height16px-
      --van-sidebar-selected-border-colorvar(--van-danger-color)-
      --van-sidebar-selected-background-colorvar(--van-white)-


      介绍

      选项卡组件,用于在不同的内容区域之间进行切换。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Tab, Tabs } from 'vant';const app = createApp();app.use(Tab);app.use(Tabs);

      代码演示

      基础用法

      通过 v-model:active 绑定当前激活标签对应的索引值,默认情况下启用第一个标签。

      <van-tabs v-model:active="active">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab>  <van-tab title="标签 4">内容 4</van-tab></van-tabs>
      import { ref } from 'vue';export default {  setup() {    const active = ref(2);    return { active };  },};

      通过名称匹配

      在标签指定 name 属性的情况下,v-model:active 的值为当前标签的 name(此时无法通过索引值来匹配标签)。

      <van-tabs v-model:active="activeName">  <van-tab title="标签 1" name="a">内容 1</van-tab>  <van-tab title="标签 2" name="b">内容 2</van-tab>  <van-tab title="标签 3" name="c">内容 3</van-tab></van-tabs>
      import { ref } from 'vue';export default {  setup() {    const activeName = ref('a');    return { activeName };  },};

      标签栏滚动

      标签数量超过 5 个时,标签栏可以在水平方向上滚动,切换时会自动将当前标签居中。

      <van-tabs v-model:active="active">  <van-tab v-for="index in 8" :title="'标签 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

      禁用标签

      设置 disabled 属性即可禁用标签。

      <van-tabs v-model:active="active">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2" disabled>内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab></van-tabs>

      样式风格

      Tab 支持两种样式风格:line 和card,默认为 line 样式,可以通过 type 属性切换样式风格。

      <van-tabs v-model:active="active" type="card">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab></van-tabs>

      点击事件

      点击标签页时,会触发 click-tab 事件。

      <van-tabs v-model:active="active" @click-tab="onClickTab">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab></van-tabs>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const active = ref(0);    const onClickTab = ({ title }) => Toast(title);    return {      active,      onClickTab,    };  },};

      粘性布局

      通过 sticky 属性可以开启粘性布局,粘性布局下,标签页滚动到顶部时会自动吸顶。

      <van-tabs v-model:active="active" sticky>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

      自定义标签

      通过 title 插槽可以自定义标签内容。

      <van-tabs v-model:active="active">  <van-tab v-for="index in 2">    <template #title> <van-icon name="more-o" />选项 </template>    内容 {{ index }}  </van-tab></van-tabs>

      切换动画

      通过 animated 属性可以开启切换标签内容时的转场动画。

      <van-tabs v-model:active="active" animated>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

      滑动切换

      通过 swipeable 属性可以开启滑动切换标签页。

      <van-tabs v-model:active="active" swipeable>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

      滚动导航

      通过 scrollspy 属性可以开启滚动导航模式,该模式下,内容将会平铺展示。

      <van-tabs v-model:active="active" scrollspy sticky>  <van-tab v-for="index in 8" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

      异步切换

      通过 before-change 属性可以在切换标签前执行特定的逻辑。

      <van-tabs v-model:active="active" :before-change="beforeChange">  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>
      import { ref } from 'vue';export default {  setup() {    const active = ref(0);    const beforeChange = (index) => {      // 返回 false 表示阻止此次切换      if (index === 1) {        return false;      }      // 返回 Promise 来执行异步逻辑      return new Promise((resolve) => {        // 在 resolve 函数中返回 true 或 false        resolve(index !== 3);      });    };    return {      beforeChange,    };  },};
      Tips: 通过手势滑动不会触发 before-change 属性。

      API

      Tabs Props

      参数说明类型默认值
      v-model:active绑定当前选中标签的标识符number | string0
      type样式风格类型,可选值为 cardstringline
      color标签主题色string#ee0a24
      background标签栏背景色stringwhite
      duration动画时间,单位秒,设置为 0 可以禁用动画number | string0.3
      line-width底部条宽度,默认单位 pxnumber | string40px
      line-height底部条高度,默认单位 pxnumber | string3px
      animated是否开启切换标签内容时的转场动画booleanfalse
      border是否显示标签栏外边框,仅在 type="line" 时有效booleanfalse
      ellipsis是否省略过长的标题文字booleantrue
      sticky是否使用粘性定位布局booleanfalse
      swipeable是否开启手势左右滑动切换booleanfalse
      lazy-render是否开启延迟渲染(首次切换到标签时才触发内容渲染)booleantrue
      scrollspy是否开启滚动导航booleanfalse
      offset-top粘性定位布局下与顶部的最小距离,支持 px vw vh rem 单位,默认 pxnumber | string0
      swipe-threshold滚动阈值,标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动number | string5
      title-active-color标题选中态颜色string-
      title-inactive-color标题默认态颜色string-
      before-change切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise(name: number | string) => boolean | Promise<boolean>-

      Tab Props

      参数说明类型默认值
      title标题string-
      disabled是否禁用标签booleanfalse
      dot是否在标题右上角显示小红点booleanfalse
      badge图标右上角徽标的内容number | string-
      name标签名称,作为匹配的标识符number | string标签的索引值
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse
      title-style自定义标题样式string | Array | object-
      title-class自定义标题类名string | Array | object-

      Tabs Events

      事件名说明回调参数
      click-tab v3.1.4点击标签时触发{ name: string | number, title: string, event: MouseEvent, disabled: boolean }
      change当前激活的标签改变时触发name: string | number, title: string
      rendered标签内容首次渲染时触发(仅在开启延迟渲染后触发)name: string | number, title: string
      scroll滚动时触发,仅在 sticky 模式下生效{ scrollTop: number, isFixed: boolean }
      提示:click 和 disabled 事件已废弃,请使用 click-tab 事件代替。

      Tabs 方法

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

      方法名说明参数返回值
      resize外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘--
      scrollTo滚动到指定的标签页,在滚动导航模式下可用name: string | number-

      类型定义

      通过 TabsInstance 获取 Tabs 实例的类型定义。

      import { ref } from 'vue';import type { TabsInstance } from 'vant';const tabsRef = ref<TabsInstance>();tabsRef.value?.scrollTo(0);

      Tabs Slots

      名称说明
      nav-left标签栏左侧内容
      nav-right标签栏右侧内容
      nav-bottom v3.1.1标签栏下方内容

      Tab Slots

      名称说明
      default标签页内容
      title自定义标题

      样式变量

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

      名称默认值描述
      --van-tab-text-colorvar(--van-gray-7)-
      --van-tab-active-text-colorvar(--van-text-color)-
      --van-tab-disabled-text-colorvar(--van-gray-5)-
      --van-tab-font-sizevar(--van-font-size-md)-
      --van-tab-line-heightvar(--van-line-height-md)-
      --van-tabs-default-colorvar(--van-danger-color)-
      --van-tabs-line-height44px-
      --van-tabs-card-height30px-
      --van-tabs-nav-background-colorvar(--van-white)-
      --van-tabs-bottom-bar-width40px-
      --van-tabs-bottom-bar-height3px-
      --van-tabs-bottom-bar-colorvar(--van-danger-color)-

      常见问题

      组件从隐藏状态切换到显示状态时,底部条位置错误?

      Tabs 组件在挂载时,会获取自身的宽度,并计算出底部条的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示底部条位置。

      解决方法

      方法一,如果是使用 v-show 来控制组件展示的,则替换为 v-if 即可解决此问题:

      <!-- Before --><van-tabs v-show="show" /><!-- After --><van-tabs v-if="show" />

      方法二,调用组件的 resize 方法来主动触发重绘:

      <van-tabs v-show="show" ref="tabs" />
      this.$refs.tabs.resize();


      介绍

      底部导航栏,用于在不同页面之间进行切换。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Tabbar, TabbarItem } from 'vant';const app = createApp();app.use(Tabbar);app.use(TabbarItem);

      代码演示

      基础用法

      v-model 默认绑定选中标签的索引值,通过修改 v-model 即可切换选中的标签。

      <van-tabbar v-model="active">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="friends-o">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
      import { ref } from 'vue';export default {  setup() {    const active = ref(0);    return { active };  },};

      通过名称匹配

      在标签指定 name 属性的情况下,v-model 的值为当前标签的 name。

      <van-tabbar v-model="active">  <van-tabbar-item name="home" icon="home-o">标签</van-tabbar-item>  <van-tabbar-item name="search" icon="search">标签</van-tabbar-item>  <van-tabbar-item name="friends" icon="friends-o">标签</van-tabbar-item>  <van-tabbar-item name="setting" icon="setting-o">标签</van-tabbar-item></van-tabbar>
      import { ref } from 'vue';export default {  setup() {    const active = ref('home');    return { active };  },};

      徽标提示

      设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

      <van-tabbar v-model="active">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search" dot>标签</van-tabbar-item>  <van-tabbar-item icon="friends-o" badge="5">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o" badge="20">标签</van-tabbar-item></van-tabbar>

      自定义图标

      通过 icon 插槽自定义图标,可以通过 slot-scope 判断标签是否选中。

      <van-tabbar v-model="active">  <van-tabbar-item badge="3">    <span>自定义</span>    <template #icon="props">      <img :src="props.active ? icon.active : icon.inactive" />    </template>  </van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
      import { ref } from 'vue';export default {  setup() {    const active = ref(0);    const icon = {      active: 'https://img.yzcdn.cn/vant/user-active.png',      inactive: 'https://img.yzcdn.cn/vant/user-inactive.png',    };    return {      icon,      active,    };  },};

      自定义颜色

      通过 active-color 属性设置选中标签的颜色,通过 inactive-color 属性设置未选中标签的颜色。

      <van-tabbar v-model="active" active-color="#ee0a24" inactive-color="#000">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="friends-o">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>

      监听切换事件

      通过 change 事件来监听选中标签的变化。

      <van-tabbar v-model="active" @change="onChange">  <van-tabbar-item icon="home-o">标签 1</van-tabbar-item>  <van-tabbar-item icon="search">标签 2</van-tabbar-item>  <van-tabbar-item icon="friends-o">标签 3</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签 4</van-tabbar-item></van-tabbar>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const active = ref(0);    const onChange = (index) => Toast(`标签 ${index}`);    return {      icon,      onChange,    };  },};

      路由模式

      标签栏支持路由模式,用于搭配 vue-router 使用。路由模式下会匹配页面路径和标签的 to 属性,并自动选中对应的标签。

      <router-view /><van-tabbar route>  <van-tabbar-item replace to="/home" icon="home-o">标签</van-tabbar-item>  <van-tabbar-item replace to="/search" icon="search">标签</van-tabbar-item></van-tabbar>

      API

      Tabbar Props

      参数说明类型默认值
      v-model当前选中标签的名称或索引值number | string0
      fixed是否固定在底部booleantrue
      border是否显示外边框booleantrue
      z-index元素 z-indexnumber | string1
      active-color选中标签的颜色string#1989fa
      inactive-color未选中标签的颜色string#7d7e80
      route是否开启路由模式booleanfalse
      placeholder固定在底部时,是否在标签位置生成一个等高的占位元素booleanfalse
      safe-area-inset-bottom是否开启底部安全区适配,设置 fixed 时默认开启booleanfalse
      before-change切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise(name: number | string) => boolean | Promise<boolean>-

      Tabbar Events

      事件名说明回调参数
      change切换标签时触发active: number | string

      TabbarItem Props

      参数说明类型默认值
      name标签名称,作为匹配的标识符number | string当前标签的索引值
      icon图标名称或图片链接string-
      icon-prefix图标类名前缀,等同于 Icon 组件的 class-prefix 属性stringvan-icon
      dot是否显示图标右上角小红点booleanfalse
      badge图标右上角徽标的内容number | string-
      url点击后跳转的链接地址string-
      to点击后跳转的目标路由对象,等同于 vue-router 的 to 属性string | object-
      replace是否在跳转时替换当前页面历史booleanfalse

      TabbarItem Slots

      名称说明参数
      icon自定义图标active: boolean

      样式变量

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

      名称默认值描述
      --van-tabbar-height50px-
      --van-tabbar-z-index1-
      --van-tabbar-background-colorvar(--van-white)-
      --van-tabbar-item-font-sizevar(--van-font-size-sm)-
      --van-tabbar-item-text-colorvar(--van-gray-7)-
      --van-tabbar-item-active-colorvar(--van-primary-color)-
      --van-tabbar-item-active-background-colorvar(--van-white)-
      --van-tabbar-item-line-height1-
      --van-tabbar-item-icon-size22px-
      --van-tabbar-item-icon-margin-bottomvar(--van-padding-base)-


      介绍

      用于从一组相关联的数据集合中进行选择。

      实例演示

      引入

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

      import { createApp } from 'vue';import { TreeSelect } from 'vant';const app = createApp();app.use(TreeSelect);

      代码演示

      单选模式

      item 为分类显示所需的数据,数据格式见下方示例。main-active-index 表示左侧高亮选项的索引,active-id 表示右侧高亮选项的 id。

      <van-tree-select  v-model:active-id="state.activeId"  v-model:main-active-index="state.activeIndex"  :items="items"/>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      activeId: 1,      activeIndex: 0,    });    const items = [      {        text: '浙江',        children: [          { text: '杭州', id: 1 },          { text: '温州', id: 2 },        ],      },      {        text: '江苏',        children: [          { text: '南京', id: 5 },          { text: '无锡', id: 6 },        ],      },    ];    return {      state,      items,    };  },};

      多选模式

      active-id 为数组格式时,可以选中多个右侧选项。

      <van-tree-select  v-model:active-id="state.activeIds"  v-model:main-active-index="state.activeIndex"  :items="items"/>
      import { reactive } from 'vue';export default {  setup() {    const state = reactive({      activeId: [1, 2],      activeIndex: 0,    });    const items = [      {        text: '浙江',        children: [          { text: '杭州', id: 1 },          { text: '温州', id: 2 },        ],      },      {        text: '江苏',        children: [          { text: '南京', id: 5 },          { text: '无锡', id: 6 },        ],      },    ];    return {      state,      items,    };  },};

      自定义内容

      通过 content 插槽可以自定义右侧区域的内容。

      <van-tree-select  v-model:main-active-index="activeIndex"  height="55vw"  :items="items">  <template #content>    <van-image      v-if="activeIndex === 0"      src="https://img.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow"     />    <van-image      v-if="activeIndex === 1"      src="https://img.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow"     />  </template></van-tree-select>
      import { ref } from 'vue';export default {  setup() {    const activeIndex = ref(0);    return {      activeIndex,      items: [{ text: '分组 1' }, { text: '分组 2' }],    };  },};

      徽标提示

      设置 dot 属性后,会在图标右上角展示一个小红点;设置 badge 属性后,会在图标右上角展示相应的徽标。

      <van-tree-select  v-model:main-active-index="activeIndex"  height="55vw"  :items="items"/>
      import { ref } from 'vue';export default {  setup() {    const activeIndex = ref(0);    return {      activeIndex,      items: [        { text: '浙江', children: [], dot: true },        { text: '江苏', children: [], badge: 5 },      ],    };  },};

      API

      Props

      参数说明类型默认值
      items分类显示所需的数据Item[][]
      height高度,默认单位为pxnumber | string300
      main-active-index左侧选中项的索引number | string0
      active-id右侧选中项的 id,支持传入数组number | string |
      (number | string)[]
      0
      max右侧项最大选中个数number | stringInfinity
      selected-icon自定义右侧栏选中状态的图标stringsuccess

      Events

      事件名说明回调参数
      click-nav点击左侧导航时触发index:被点击的导航的索引
      click-item点击右侧选择项时触发data: 该点击项的数据

      Slots

      名称说明
      content自定义右侧区域内容

      Item 数据结构

      items 整体为一个数组,数组内包含一系列描述分类的对象,每个分类里,text表示当前分类的名称,children表示分类里的可选项。

      [  {    // 导航名称    text: '所有城市',    // 导航名称右上角徽标    badge: 3,    // 是否在导航名称右上角显示小红点    dot: true,    // 导航节点额外类名    className: 'my-class',    // 该导航下所有的可选项    children: [      {        // 名称        text: '温州',        // id,作为匹配选中状态的标识符        id: 1,        // 禁用选项        disabled: true,      },      {        text: '杭州',        id: 2,      },    ],  },];

      样式变量

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

      名称默认值描述
      --van-tree-select-font-sizevar(--van-font-size-md)-
      --van-tree-select-nav-background-colorvar(--van-background-color)-
      --van-tree-select-content-background-colorvar(--van-white)-
      --van-tree-select-nav-item-padding14px var(--van-padding-sm)-
      --van-tree-select-item-height48px-
      --van-tree-select-item-active-colorvar(--van-danger-color)-
      --van-tree-select-item-disabled-colorvar(--van-gray-5)-
      --van-tree-select-item-selected-size16px-


      介绍

      收货地址编辑组件,用于新建、更新、删除收货地址。

      实例演示

      引入

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

      import { createApp } from 'vue';import { AddressEdit } from 'vant';const app = createApp();app.use(AddressEdit);

      代码演示

      基础用法

      <van-address-edit  :area-list="areaList"  show-postal  show-delete  show-set-default  show-search-result  :search-result="searchResult"  :area-columns-placeholder="['请选择', '请选择', '请选择']"  @save="onSave"  @delete="onDelete"  @change-detail="onChangeDetail"/>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const searchResult = ref([]);    const onSave = () => Toast('save');    const onDelete = () => Toast('delete');    const onChangeDetail = (val) => {      if (val) {        searchResult.value = [          {            name: '黄龙万科中心',            address: '杭州市西湖区',          },        ];      } else {        searchResult.value = [];      }    };    return {      onSave,      onDelete,      areaList,      searchResult,      onChangeDetail,    };  },};

      API

      Props

      参数说明类型默认值
      area-list地区列表object-
      area-columns-placeholder地区选择列占位提示文字string[][]
      area-placeholder地区输入框占位提示文字string选择省 / 市 / 区
      address-info收货人信息初始值AddressInfo{}
      search-result详细地址搜索结果SearchResult[][]
      show-postal是否显示邮政编码booleanfalse
      show-delete是否显示删除按钮booleanfalse
      show-set-default是否显示默认地址栏booleanfalse
      show-search-result是否显示搜索结果booleanfalse
      show-area是否显示地区booleantrue
      show-detail是否显示详细地址booleantrue
      disable-area是否禁用地区选择booleanfalse
      save-button-text保存按钮文字string保存
      delete-button-text删除按钮文字string删除
      detail-rows详细地址输入框行数number | string1
      detail-maxlength详细地址最大长度number | string200
      is-saving是否显示保存按钮加载动画booleanfalse
      is-deleting是否显示删除按钮加载动画booleanfalse
      tel-validator手机号格式校验函数string => boolean-
      tel-maxlength手机号最大长度number | string-
      postal-validator邮政编码格式校验函数string => boolean-
      validator自定义校验函数(key, val) => string-

      Events

      事件名说明回调参数
      save点击保存按钮时触发content:表单内容
      focus输入框聚焦时触发key: 聚焦的输入框对应的 key
      delete确认删除地址时触发content:表单内容
      cancel-delete取消删除地址时触发content:表单内容
      select-search选中搜索结果时触发value: 搜索结果
      click-area点击收件地区时触发-
      change-area修改收件地区时触发values: 地区信息
      change-detail修改详细地址时触发value: 详细地址内容
      change-default切换是否使用默认地址时触发value: 是否选中

      Slots

      名称说明
      default在邮政编码下方插入内容

      方法

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

      方法名说明参数返回值
      setAddressDetail设置详细地址addressDetail: string-

      类型定义

      通过 AddressEditInstance 获取 AddressEdit 实例的类型定义。

      import { ref } from 'vue';import type { AddressEditInstance } from 'vant';const addressEditRef = ref<AddressEditInstance>();addressEditRef.value?.setAddressDetail('');

      AddressInfo 数据格式

      注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取。

      key说明类型
      name收货人姓名string
      tel收货人手机号string
      province省份string
      city城市string
      county区县string
      addressDetail详细地址string
      areaCode地区编码,通过 省市区选择 获取(必填)string
      postalCode邮政编码string
      isDefault是否为默认地址boolean

      SearchResult 数据格式

      key说明类型
      name地名string
      address详细地址string

      省市县列表数据格式

      请参考 Area 组件。

      样式变量

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

      名称默认值描述
      --van-address-edit-paddingvar(--van-padding-sm)-
      --van-address-edit-buttons-paddingvar(--van-padding-xl) var(--van-padding-base)-
      --van-address-edit-button-margin-bottomvar(--van-padding-sm)-
      --van-address-edit-button-font-sizevar(--van-font-size-lg)-
      --van-address-edit-detail-finish-colorvar(--van-primary-color)-
      --van-address-edit-detail-finish-font-sizevar(--van-font-size-sm)-


      介绍

      展示收货地址列表。

      实例演示

      引入

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

      import { createApp } from 'vue';import { AddressList } from 'vant';const app = createApp();app.use(AddressList);

      代码演示

      基础用法

      <van-address-list  v-model="chosenAddressId"  :list="list"  :disabled-list="disabledList"  disabled-text="以下地址超出配送范围"  default-tag-text="默认"  @add="onAdd"  @edit="onEdit"/>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const chosenAddressId = ref('1');    const list = [      {        id: '1',        name: '张三',        tel: '13000000000',        address: '浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室',        isDefault: true,      },      {        id: '2',        name: '李四',        tel: '1310000000',        address: '浙江省杭州市拱墅区莫干山路 50 号',      },    ];    const disabledList = [      {        id: '3',        name: '王五',        tel: '1320000000',        address: '浙江省杭州市滨江区江南大道 15 号',      },    ];    const onAdd = () => Toast('新增地址');    const onEdit = (item, index) => Toast('编辑地址:' + index);    return {      list,      onAdd,      onEdit,      disabledList,      chosenAddressId,    };  },};

      API

      Props

      参数说明类型默认值
      v-model当前选中地址的 idstring-
      list地址列表Address[][]
      disabled-list不可配送地址列表Address[][]
      disabled-text不可配送提示文案string-
      switchable是否允许切换地址booleantrue
      add-button-text底部按钮文字string新增地址
      default-tag-text默认地址标签文字string-

      Events

      事件名说明回调参数
      add点击新增按钮时触发-
      edit点击编辑按钮时触发item: Address, index: number
      select切换选中的地址时触发item: Address, index: number
      edit-disabled编辑不可配送的地址时触发item: Address, index: number
      select-disabled选中不可配送的地址时触发item: Address, index: number
      click-item点击任意地址时触发item: Address, index: number

      Address 数据结构

      键名说明类型
      id每条地址的唯一标识number | string
      name收货人姓名string
      tel收货人手机号number | string
      address收货地址string
      isDefault是否为默认地址boolean

      Slots

      名称说明参数
      default在列表下方插入内容-
      top在顶部插入内容-
      item-bottom在列表项底部插入内容item: Address
      tag v3.0.9自定义列表项标签内容item: Address

      样式变量

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

      名称默认值描述
      --van-address-list-paddingvar(--van-padding-sm) var(--van-padding-sm) 80px-
      --van-address-list-disabled-text-colorvar(--van-gray-6)-
      --van-address-list-disabled-text-paddingvar(--van-padding-base) * 5 0 var(--van-padding-md)-
      --van-address-list-disabled-text-font-sizevar(--van-font-size-md)-
      --van-address-list-disabled-text-line-heightvar(--van-line-height-md)-
      --van-address-list-add-button-z-index999-
      --van-address-list-item-paddingvar(--van-padding-sm)-
      --van-address-list-item-text-colorvar(--van-text-color)-
      --van-address-list-item-disabled-text-colorvar(--van-gray-5)-
      --van-address-list-item-font-size13px-
      --van-address-list-item-line-heightvar(--van-line-height-sm)-
      --van-address-list-item-radio-icon-colorvar(--van-danger-color)-
      --van-address-list-edit-icon-size20px-


      介绍

      省市区三级联动选择,通常与弹出层组件配合使用。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Area } from 'vant';const app = createApp();app.use(Area);

      代码演示

      基础用法

      初始化省市区组件时,需要通过 area-list 属性传入省市区数据。

      <van-area title="标题" :area-list="areaList" />

      areaList 格式

      areaList 为对象结构,包含 province_list、city_list、county_list 三个 key。

      每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。比如北京的地区码为 11,以 0 补足 6 位,为 110000。

      示例数据如下:

      const areaList = {  province_list: {    110000: '北京市',    120000: '天津市',  },  city_list: {    110100: '北京市',    120100: '天津市',  },  county_list: {    110101: '东城区',    110102: '西城区',    // ....  },};

      @vant/area-data

      Vant 官方提供了一份默认的省市区数据,可以通过 @vant/area-data 引入:

      yarn add @vant/area-data
      import { areaList } from '@vant/area-data';export default {  setup() {    return { areaList };  },};

      选中省市区

      如果想选中某个省市区,需要传入一个 value 属性,绑定对应的地区码。

      <van-area title="标题" :area-list="areaList" value="110101" />

      配置显示列

      可以通过 columns-num 属性配置省市区显示的列数,默认情况下会显示省市区,当你设置为 2,则只会显示省市选择。

      <van-area title="标题" :area-list="areaList" :columns-num="2" />

      配置列占位提示文字

      可以通过 columns-placeholder 属性配置每一列的占位提示文字。

      <van-area  title="标题"  :area-list="areaList"  :columns-placeholder="['请选择', '请选择', '请选择']"/>

      API

      Props

      参数说明类型默认值
      value当前选中项对应的地区码string-
      title顶部栏标题string-
      confirm-button-text确认按钮文字string确认
      cancel-button-text取消按钮文字string取消
      area-list省市区数据,格式见下方object-
      columns-placeholder列占位提示文字string[][]
      loading是否显示加载状态booleanfalse
      readonly是否为只读状态,只读状态下无法切换选项booleanfalse
      item-height选项高度,支持 px vw vh rem 单位,默认 pxnumber | string44
      columns-num显示列数,3-省市区,2-省市,1-省number | string3
      visible-item-count可见的选项个数number | string6
      swipe-duration快速滑动时惯性滚动的时长,单位 msnumber | string1000
      is-oversea-code根据地区码校验海外地址,海外地址会划分至单独的分类() => boolean-

      Events

      事件说明回调参数
      confirm点击右上方完成按钮result: ConfirmResult
      cancel点击取消按钮时-
      change选项改变时触发所有列选中值,当前列对应的索引

      ConfirmResult 格式

      confirm 事件返回的数据整体为一个数组,数组每一项对应一列选项中被选中的数据。

      [  {    code: '110000',    name: '北京市',  },  {    code: '110100',    name: '北京市',  },  {    code: '110101',    name: '东城区',  },];

      Slots

      名称说明参数
      toolbar v3.1.2自定义整个顶部栏的内容-
      title自定义标题内容-
      confirm v3.1.2自定义确认按钮内容-
      cancel v3.1.2自定义取消按钮内容-
      columns-top自定义选项上方内容-
      columns-bottom自定义选项下方内容-

      方法

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

      方法名说明参数返回值
      reset根据地区码重置所有选项,若不传地区码,则重置到第一项code?: string-

      类型定义

      通过 AreaInstance 获取 Area 实例的类型定义。

      import { ref } from 'vue';import type { AreaInstance } from 'vant';const areaRef = ref<AreaInstance>();areaRef.value?.reset();

      常见问题

      在桌面端无法操作组件?

      参见桌面端适配


      介绍

      商品卡片,用于展示商品的图片、价格等信息。

      实例演示

      引入

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

      import { createApp } from 'vue';import { Card } from 'vant';const app = createApp();app.use(Card);

      代码演示

      基础用法

      <van-card  num="2"  price="2.00"  desc="描述信息"  title="商品标题"  thumb="https://img.yzcdn.cn/vant/ipad.jpeg"/>

      营销信息

      通过 origin-price 设置商品原价,通过 tag 设置商品左上角标签。

      <van-card  num="2"  tag="标签"  price="2.00"  desc="描述信息"  title="商品标题"  thumb="https://img.yzcdn.cn/vant/ipad.jpeg"  origin-price="10.00"/>

      自定义内容

      Card 组件提供了多个插槽,可以灵活地自定义内容。

      <van-card  num="2"  price="2.00"  desc="描述信息"  title="商品标题"  thumb="https://img.yzcdn.cn/vant/ipad.jpeg">  <template #tags>    <van-tag plain type="danger">标签</van-tag>    <van-tag plain type="danger">标签</van-tag>  </template>  <template #footer>    <van-button size="mini">按钮</van-button>    <van-button size="mini">按钮</van-button>  </template></van-card>

      API

      Props

      参数说明类型默认值
      thumb左侧图片 URLstring-
      title标题string-
      desc描述string-
      tag图片角标string-
      num商品数量number | string-
      price商品价格number | string-
      origin-price商品划线原价number | string-
      centered内容是否垂直居中booleanfalse
      currency货币符号string¥
      thumb-link点击左侧图片后跳转的链接地址string-
      lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse

      Events

      事件名说明回调参数
      click点击时触发event: MouseEvent
      click-thumb点击自定义图片时触发event: MouseEvent

      Slots

      名称说明
      title自定义标题
      desc自定义描述
      num自定义数量
      price自定义价格
      origin-price自定义商品原价
      price-top自定义价格上方区域
      bottom自定义价格下方区域
      thumb自定义图片
      tag自定义图片角标
      tags自定义描述下方标签区域
      footer自定义右下角内容

      样式变量

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

      名称默认值描述
      --van-card-paddingvar(--van-padding-xs) var(--van-padding-md)-
      --van-card-font-sizevar(--van-font-size-sm)-
      --van-card-text-colorvar(--van-text-color)-
      --van-card-background-colorvar(--van-background-color-light)-
      --van-card-thumb-size88px-
      --van-card-thumb-border-radiusvar(--van-border-radius-lg)-
      --van-card-title-line-height16px-
      --van-card-desc-colorvar(--van-gray-7)-
      --van-card-desc-line-heightvar(--van-line-height-md)-
      --van-card-price-colorvar(--van-gray-8)-
      --van-card-origin-price-colorvar(--van-gray-6)-
      --van-card-num-colorvar(--van-gray-6)-
      --van-card-origin-price-font-sizevar(--van-font-size-xs)-
      --van-card-price-font-sizevar(--van-font-size-sm)-
      --van-card-price-integer-font-sizevar(--van-font-size-lg)-
      --van-card-price-font-familyvar(--van-price-integer-font-family)-


      介绍

      以卡片的形式展示联系人信息。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ContactCard } from 'vant';const app = createApp();app.use(ContactCard);

      代码演示

      添加联系人

      <van-contact-card type="add" @click="onAdd" />
      import { Toast } from 'vant';export default {  setup() {    const onAdd = () => Toast('新增');    return {      onAdd,    };  },};

      编辑联系人

      <van-contact-card  type="edit"  :name="currentContact.name"  :tel="currentContact.tel"  @click="onEdit"/>
      import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const currentContact = reactive({      name: '张三',      tel: '13000000000',    });    const onEdit = () => Toast('edit');    return {      onEdit,      currentContact,    };  },};

      不可编辑

      <van-contact-card type="edit" name="张三" tel="13000000000" :editable="false" />

      API

      Props

      参数说明类型默认值
      type卡片类型,可选值为 editstringadd
      name联系人姓名string-
      tel联系人手机号string-
      add-text添加时的文案提示string添加联系人

      Events

      事件名说明回调参数
      click点击时触发event: MouseEvent

      样式变量

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

      名称默认值描述
      --van-contact-card-paddingvar(--van-padding-md)-
      --van-contact-card-add-icon-size40px-
      --van-contact-card-add-icon-colorvar(--van-primary-color)-
      --van-contact-card-value-line-heightvar(--van-line-height-md)-


      介绍

      编辑并保存联系人信息。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ContactEdit } from 'vant';const app = createApp();app.use(ContactEdit);

      代码演示

      基础用法

      <van-contact-edit  is-edit  show-set-default  :contact-info="editingContact"  set-default-label="设为默认联系人"  @save="onSave"  @delete="onDelete"/>
      import { ref } from 'vue';import { Toast } from 'vant';export default {  setup() {    const editingContact = ref({});    const onSave = (contactInfo) => Toast('保存');    const onDelete = (contactInfo) => Toast('删除');    return {      onSave,      onDelete,      editingContact,    };  },};

      API

      Props

      参数说明类型默认值
      contact-info联系人信息Contact{}
      is-edit是否为编辑联系人booleanfalse
      is-saving是否显示保存按钮加载动画booleanfalse
      is-deleting是否显示删除按钮加载动画booleanfalse
      tel-validator手机号格式校验函数(tel: string) => boolean-
      show-set-default是否显示默认联系人栏booleanfalse
      set-default-label默认联系人栏文案string-

      Events

      事件名说明回调参数
      save点击保存按钮时触发content:表单内容
      delete点击删除按钮时触发content:表单内容

      Contact 数据结构

      键名说明类型
      name联系人姓名string
      tel联系人手机号number | string

      样式变量

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

      名称默认值描述
      --van-contact-edit-paddingvar(--van-padding-md)-
      --van-contact-edit-fields-radiusvar(--van-border-radius-md)-
      --van-contact-edit-buttons-paddingvar(--van-padding-xl) 0-
      --van-contact-edit-button-margin-bottomvar(--van-padding-sm)-
      --van-contact-edit-button-font-sizevar(--van-font-size-lg)-
      --van-contact-edit-field-label-width4.1em-


      介绍

      展示联系人列表。

      实例演示

      引入

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

      import { createApp } from 'vue';import { ContactList } from 'vant';const app = createApp();app.use(ContactList);

      代码演示

      基础用法

      <van-contact-list  v-model="state.chosenContactId"  :list="state.list"  default-tag-text="默认"  @add="onAdd"  @edit="onEdit"  @select="onSelect"/>
      import { reactive } from 'vue';import { Toast } from 'vant';export default {  setup() {    const state = reactive({      chosenContactId: '1',      list: [        {          id: '1',          name: '张三',          tel: '13000000000',          isDefault: true,        },        {          id: '2',          name: '李四',          tel: '1310000000',        },      ],    });    const onAdd = () => Toast('新增');    const onEdit = (contact) => Toast('编辑' + contact.id);    const onSelect = (contact) => Toast('选择' + contact.id);    return {      state,      onAdd,      onEdit,      onSelect,    };  },};

      API

      Props

      参数说明类型默认值
      v-model当前选中联系人的 idnumber | string-
      list联系人列表Contact[][]
      add-text新建按钮文案string新建联系人
      default-tag-text默认联系人标签文案string-

      Events

      事件名说明回调参数
      add点击新增按钮时触发-
      edit点击编辑按钮时触发contact: Contact,index: number
      select切换选中的联系人时触发contact: Contact,index: number

      Contact 数据结构

      键名说明类型
      id每位联系人的唯一标识number | string
      name联系人姓名string
      tel联系人手机号number | string
      isDefault是否为默认联系人boolean

      样式变量

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

      名称默认值描述
      --van-contact-list-edit-icon-size16px-
      --van-contact-list-add-button-z-index999-
      --van-contact-list-item-paddingvar(--van-padding-md)-
      --van-contact-list-item-radio-icon-colorvar(--van-danger-color)-


      介绍

      用于优惠券的兑换和选择。

      实例演示

      引入

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

      import { createApp } from 'vue';import { CouponCell, CouponList } from 'vant';const app = createApp();app.use(CouponCell);app.use(CouponList);

      代码演示

      基础用法

      <!-- 优惠券单元格 --><van-coupon-cell  :coupons="state.coupons"  :chosen-coupon="state.chosenCoupon"  @click="state.showList = true"/><!-- 优惠券列表 --><van-popup  v-model="state.showList"  round  position="bottom"  style="height: 90%; padding-top: 4px;">  <van-coupon-list    :coupons="state.coupons"    :chosen-coupon="state.chosenCoupon"    :disabled-coupons="disabledCoupons"    @change="onChange"    @exchange="onExchange"  /></van-popup>
      import { reactive } from 'vue';const coupon = {  available: 1,  condition: '无使用门槛
      最多优惠12元',  reason: '',  value: 150,  name: '优惠券名称',  startAt: 1489104000,  endAt: 1514592000,  valueDesc: '1.5',  unitDesc: '元',};export default {  setup() {    const state = reactive({      coupons: [coupon],      showList: false,      chosenCoupon: -1,    });    const onChange = (index) => {      state.showList = false;      state.chosenCoupon = index;    };    const onExchange = (code) => {      state.coupons.push(coupon);    };    return {      state,      onChange,      onExchange,      disabledCoupons: [coupon],    };  },};

      API

      CouponCell Props

      参数说明类型默认值
      title单元格标题string优惠券
      chosen-coupon当前选中优惠券的索引number | string-1
      coupons可用优惠券列表Coupon[][]
      editable能否切换优惠券booleantrue
      border是否显示内边框booleantrue
      currency货币符号string¥

      CouponList Props

      参数说明类型默认值
      v-model:code当前输入的兑换码string-
      chosen-coupon当前选中优惠券的索引number-1
      coupons可用优惠券列表Coupon[][]
      disabled-coupons不可用优惠券列表Coupon[][]
      enabled-title可用优惠券列表标题string可使用优惠券
      disabled-title不可用优惠券列表标题string不可使用优惠券
      exchange-button-text兑换按钮文字string兑换
      exchange-button-loading是否显示兑换按钮加载动画booleanfalse
      exchange-button-disabled是否禁用兑换按钮booleanfalse
      exchange-min-length兑换码最小长度number1
      displayed-coupon-index滚动至特定优惠券位置number-
      show-close-button是否显示列表底部按钮booleantrue
      close-button-text列表底部按钮文字string不使用优惠
      input-placeholder输入框文字提示string请输入优惠码
      show-exchange-bar是否展示兑换栏booleantrue
      currency货币符号string¥
      empty-image列表为空时的占位图stringhttps://img.yzcdn.cn/vant/coupon-empty.png
      show-count是否展示可用 / 不可用数量booleantrue

      CouponList Events

      事件名说明回调参数
      change优惠券切换回调index, 选中优惠券的索引
      exchange兑换优惠券回调code, 兑换码

      CouponList Slots

      名称说明
      list-footer v3.0.18优惠券列表底部
      disabled-list-footer v3.0.18不可用优惠券列表底部

      Coupon 数据结构

      键名说明类型
      id优惠券 idstring
      name优惠券名称string
      condition满减条件string
      startAt卡有效开始时间 (时间戳, 单位秒)number
      endAt卡失效日期 (时间戳, 单位秒)number
      description描述信息,优惠券可用时展示string
      reason不可用原因,优惠券不可用时展示string
      value折扣券优惠金额,单位分number
      valueDesc折扣券优惠金额文案string
      unitDesc单位文案string

      样式变量

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

      名称默认值描述
      --van-coupon-margin0 var(--van-padding-sm) var(--van-padding-sm)-
      --van-coupon-content-height84px-
      --van-coupon-content-padding14px 0-
      --van-coupon-background-colorvar(--van-white)-
      --van-coupon-active-background-colorvar(--van-active-color)-
      --van-coupon-border-radiusvar(--van-border-radius-lg)-
      --van-coupon-box-shadow0 0 4px rgba(0, 0, 0, 0.1)-
      --van-coupon-head-width96px-
      --van-coupon-amount-colorvar(--van-danger-color)-
      --van-coupon-amount-font-size30px-
      --van-coupon-currency-font-size40%-
      --van-coupon-name-font-sizevar(--van-font-size-md)-
      --van-coupon-disabled-text-colorvar(--van-gray-6)-
      --van-coupon-description-paddingvar(--van-padding-xs) var(--van-padding-md)-
      --van-coupon-description-border-colorvar(--van-border-color)-
      --van-coupon-corner-checkbox-icon-colorvar(--van-danger-color)-
      --van-coupon-list-background-colorvar(--van-background-color)-
      --van-coupon-list-field-padding5px 0 5px var(--van-padding-md)-
      --van-coupon-list-exchange-button-height32px-
      --van-coupon-list-close-button-height40px-
      --van-coupon-list-empty-image-size200px-
      --van-coupon-list-empty-tip-colorvar(--van-gray-6)-
      --van-coupon-list-empty-tip-font-sizevar(--van-font-size-md)-
      --van-coupon-list-empty-tip-line-heightvar(--van-line-height-md)-
      --van-coupon-cell-selected-text-colorvar(--van-text-color)-


      介绍

      用于展示订单金额与提交订单。

      实例演示

      引入

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

      import { createApp } from 'vue';import { SubmitBar } from 'vant';const app = createApp();app.use(SubmitBar);

      代码演示

      基础用法

      <van-submit-bar :price="3050" button-text="提交订单" @submit="onSubmit" />
      import { Toast } from 'vant';export default {  setup() {    const onSubmit = () => Toast('点击按钮');    return {      onSubmit,    };  },};

      禁用状态

      禁用状态下不会触发 submit 事件。

      <van-submit-bar  disabled  :price="3050"  button-text="提交订单"  tip="你的收货地址不支持同城送, 我们已为你推荐快递"  tip-icon="info-o"  @submit="onSubmit"/>

      加载状态

      加载状态下不会触发 submit 事件。

      <van-submit-bar  loading  :price="3050"  button-text="提交订单"  @submit="onSubmit"/>

      高级用法

      通过插槽插入自定义内容。

      <van-submit-bar :price="3050" button-text="提交订单" @submit="onSubmit">  <van-checkbox v-model="checked">全选</van-checkbox>  <template #tip>    你的收货地址不支持同城送, <span @click="onClickLink">修改地址</span>  </template></van-submit-bar>
      import { Toast } from 'vant';export default {  setup() {    const onSubmit = () => Toast('点击按钮');    const onClickLink = () => Toast('修改地址');    return {      onSubmit,      onClickLink,    };  },};

      API

      Props

      参数说明类型默认值
      price金额(单位分)number-
      decimal-length金额小数点位数number | string2
      label金额左侧文案string合计:
      suffix-label金额右侧文案string-
      text-align金额文案对齐方向,可选值为 leftstringright
      button-text按钮文字string-
      button-type按钮类型stringdanger
      button-color自定义按钮颜色string-
      tip在订单栏上方的提示文案string-
      tip-icon提示文案左侧的图标名称或图片链接string-
      currency货币符号string¥
      disabled是否禁用按钮booleanfalse
      loading是否显示将按钮显示为加载中状态booleanfalse
      safe-area-inset-bottom是否开启底部安全区适配booleantrue

      Events

      事件名说明回调参数
      submit按钮点击事件回调-

      Slots

      名称说明
      default自定义订单栏左侧内容
      button自定义按钮
      top自定义订单栏上方内容
      tip提示文案中的额外内容

      样式变量

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

      名称默认值描述
      --van-submit-bar-height50px-
      --van-submit-bar-z-index100-
      --van-submit-bar-background-colorvar(--van-white)-
      --van-submit-bar-button-width110px-
      --van-submit-bar-price-colorvar(--van-danger-color)-
      --van-submit-bar-text-colorvar(--van-text-color)-
      --van-submit-bar-text-font-sizevar(--van-font-size-md)-
      --van-submit-bar-tip-paddingvar(--van-padding-xs) var(--van-padding-sm)-
      --van-submit-bar-tip-font-sizevar(--van-font-size-sm)-
      --van-submit-bar-tip-line-height1.5-
      --van-submit-bar-tip-color#f56723-
      --van-submit-bar-tip-background-color#fff7cc-
      --van-submit-bar-tip-icon-size12px-
      --van-submit-bar-button-height40px-
      --van-submit-bar-padding0 var(--van-padding-md)-
      --van-submit-bar-price-font-sizevar(--van-font-size-sm)-
      --van-submit-bar-price-integer-font-size20px-
      --van-submit-bar-price-font-familyvar(--van-price-integer-font-family)-


      介绍

      Vant 内置了一系列的组合式 API,对于安装了 vant 的项目,可以直接使用这些 API 进行开发。

      示例

      下面是一个 Vant 组合式 API 的用法示例,我们从 @vant/use 这个包中引入 useWindowSize 方法,然后进行调用,即可获取到当前 Window 的宽度和高度。

      import { useWindowSize } from '@vant/use';const { width, height } = useWindowSize();console.log(width.value); // -> 窗口宽度console.log(height.value); // -> 窗口高度

      API 列表

      下面是 Vant 对外提供的所有组合式 API,点击名称可以查看详细介绍:

      名称描述
      useClickAway监听点击元素外部的事件
      useCountDown提供倒计时管理能力
      useEventListener方便地进行事件绑定
      usePageVisibility获取页面的可见状态
      useRect获取元素的大小及其相对于视口的位置
      useRelation建立父子组件之间的关联关系
      useScrollParent获取元素最近的可滚动父元素
      useToggle用于在布尔值之间进行切换
      useWindowSize获取浏览器窗口的视口宽度和高度


      介绍

      用于在 ​true ​和 ​false ​之间进行切换。

      代码演示

      基本用法

      import { useToggle } from '@vant/use';export default {  setup() {    const [state, toggle] = useToggle();    toggle(true);    console.log(state.value); // -> true    toggle(false);    console.log(state.value); // -> false    toggle();    console.log(state.value); // -> true  },};

      设置默认值

      import { useToggle } from '@vant/use';export default {  setup() {    const [state, toggle] = useToggle(true);    console.log(state.value); // -> true  },};

      API

      类型定义

      function useToggle(  defaultValue: boolean): [Ref<boolean>, (newValue: boolean) => void];

      参数

      参数说明类型默认值
      defaultValue默认值booleanfalse

      返回值

      参数说明类型
      state状态值Ref<boolean>
      toggle切换状态值的函数(newValue?: boolean) => void


      介绍

      提供倒计时管理能力。

      代码演示

      基本用法

      <span>总时间:{{ current.total }}</span><span>剩余天数:{{ current.days }}</span><span>剩余小时:{{ current.hours }}</span><span>剩余分钟:{{ current.minutes }}</span><span>剩余秒数:{{ current.seconds }}</span><span>剩余毫秒:{{ current.milliseconds }}</span>
      import { useCountDown } from '@vant/use';export default {  setup() {    const countDown = useCountDown({      // 倒计时 24 小时      time: 24 * 60 * 60 * 1000,    });    // 开始倒计时    countDown.start();    return {      current: countDown.current,    };  },};

      毫秒级渲染

      倒计时默认每秒渲染一次,设置 millisecond 选项可以开启毫秒级渲染。

      import { useCountDown } from '@vant/use';export default {  setup() {    const countDown = useCountDown({      time: 24 * 60 * 60 * 1000,      millisecond: true,    });    countDown.start();    return {      current: countDown.current,    };  },};

      API

      类型定义

      type CurrentTime = {  days: number;  hours: number;  total: number;  minutes: number;  seconds: number;  milliseconds: number;};type CountDown = {  start: () => void;  pause: () => void;  reset: (totalTime: number) => void;  current: ComputedRef<CurrentTime>;};type UseCountDownOptions = {  time: number;  millisecond?: boolean;  onChange?: (current: CurrentTime) => void;  onFinish?: () => void;};function useCountDown(options: UseCountDownOptions): CountDown;

      参数

      参数说明类型默认值
      time倒计时时长,单位毫秒number-
      millisecond是否开启毫秒级渲染booleanfalse
      onChange倒计时改变时触发的回调函数(current: CurrentTime) => void-
      onFinish倒计时结束时触发的回调函数-

      返回值

      参数说明类型
      current当前剩余的时间CurrentTime
      start开始倒计时() => void
      pause暂停倒计时() => void
      reset重置倒计时,支持传入新的倒计时时长(time?: number): void

      CurrentTime 格式

      名称说明类型
      total剩余总时间(单位毫秒)number
      days剩余天数number
      hours剩余小时number
      minutes剩余分钟number
      seconds剩余秒数number
      milliseconds剩余毫秒number


      介绍

      用于自定义 Form 组件中的表单项。

      代码演示

      基本用法

      如果需要自定义表单项,可以在 Field 组件的 input 插槽中插入你的自定义组件,并在自定义组件内部调用 useCustomFieldValue 方法。

      自定义组件

      首先,在你的自定义组件中,调用 useCustomFieldValue 方法,并传入一个回调函数,这个函数返回值为表单项的值。

      // MyComponent.vueimport { useCustomFieldValue } from '@vant/use';export default {  setup() {    // 此处传入的值会替代 Field 组件内部的 value    useCustomFieldValue(() => 'Some value');  },};

      表单

      接着,在 Form 组件中嵌入你的自定义组件,当提交表单时,即可获取到自定义表单项的值。

      <van-form>  <!-- 这是一个自定义表单项 -->  <!-- 当表单提交时,会包括 useCustomFieldValue 中传入的值 -->  <van-field name="my-field" label="自定义表单项">    <template #input>      <my-component />    </template>  </van-field></van-form>

      API

      类型定义

      function useCustomFieldValue(customValue: () => unknown): void;

      参数

      参数说明类型默认值
      customValue获取表单项值的函数() => unknown-


      介绍

      获取元素的大小及其相对于视口的位置,等价于 Element.getBoundingClientRect

      代码演示

      基本用法

      <div ref="root" />
      import { ref } from 'vue';import { useRect } from '@vant/use';export default {  setup() {    const root = ref();    const rect = useRect();    console.log(rect); // -> 元素的大小及其相对于视口的位置    return { root };  },};

      API

      类型定义

      function useRect(  element: Element | Window | Ref<Element | Window | undefined>): DOMRect;

      返回值

      参数说明类型
      width宽度number
      height高度number
      top顶部与视图窗口左上角的距离number
      left左侧与视图窗口左上角的距离number
      right右侧与视图窗口左上角的距离number
      bottom底部与视图窗口左上角的距离number


      介绍

      方便地进行事件绑定,在组件 mounted 和 activated 时绑定事件,unmounted 和 deactivated 时解绑事件。

      代码演示

      基本用法

      import { ref } from 'vue';import { useEventListener } from '@vant/use';export default {  setup() {    // 在 window 上绑定 resize 事件    // 未指定监听对象时,默认会监听 window 的事件    useEventListener('resize', () => {      console.log('window resize');    });    // 在 body 元素上绑定 click 事件    useEventListener(      'click',      () => {        console.log('click body');      },      { target: document.body }    );  },};

      类型定义

      type Options = {  target?: EventTarget | Ref<EventTarget>;  capture?: boolean;  passive?: boolean;};function useEventListener(  type: string,  listener: EventListener,  options?: Options): void;

      API

      参数

      参数说明类型默认值
      type监听的事件类型string-
      listener点击外部时触发的回调函数EventListener-
      options可选的配置项Options-

      Options

      参数说明类型默认值
      target绑定事件的元素EventTarget | Ref<EventTarget>window
      capture是否在事件捕获阶段触发booleanfalse
      passive设置为 true 时,表示 listener 永远不会调用 preventDefaultbooleanfalse


      介绍

      获取页面的可见状态。

      代码演示

      基本用法

      import { watch } from 'vue';import { usePageVisibility } from '@vant/use';export default {  setup() {    const pageVisibility = usePageVisibility();    watch(pageVisibility, (value) => {      console.log('visibility: ', value);    });  },};

      API

      类型定义

      type VisibilityState = 'visible' | 'hidden';function usePageVisibility(): Ref<VisibilityState>;

      返回值

      参数说明类型
      visibilityState页面当前的可见状态,visible 为可见,hidden 为隐藏Ref<VisibilityState>


      介绍

      获取元素最近的可滚动父元素。

      代码演示

      基本用法

      <div ref="root" />
      import { ref, watch } from 'vue';import { useScrollParent, useEventListener } from '@vant/use';export default {  setup() {    const root = ref();    const scrollParent = useScrollParent(root);    useEventListener(      'scroll',      () => {        console.log('scroll');      },      { target: scrollParent }    );    return { root };  },};

      API

      类型定义

      function useScrollParent(  element: Ref<Element | undefined>): Ref<Element | Window | undefined>;

      参数

      参数说明类型默认值
      element当前元素Ref<Element>-

      返回值

      参数说明类型
      scrollParent最近的可滚动父元素Ref<Element>


      介绍

      获取浏览器窗口的视口宽度和高度,并在窗口大小变化时自动更新。

      代码演示

      基本用法

      import { watch } from 'vue';import { useWindowSize } from '@vant/use';export default {  setup() {    const { width, height } = useWindowSize();    console.log(width.value); // -> 窗口宽度    console.log(height.value); // -> 窗口高度    watch([width, height], () => {      console.log('window resized');    });  },};

      API

      类型定义

      function useWindowSize(): {  width: Ref<number>;  height: Ref<number>;};

      返回值

      参数说明类型
      width浏览器窗口宽度Ref<number>
      height浏览器窗口高度Ref<number>


      介绍

      建立父子组件之间的关联关系,进行数据通信和方法调用,基于 provide 和 inject 实现。

      代码演示

      基本用法

      在父组件中使用 useChildren 关联子组件:

      import { ref } from 'vue';import { useChildren } from '@vant/use';const RELATION_KEY = Symbol('my-relation');export default {  setup() {    const { linkChildren } = useChildren(RELATION_KEY);    const count = ref(0);    const add = () => {      count.value++;    };    // 向子组件提供数据和方法    linkChildren({ add, count });  },};

      在子组件中使用 useParent 获取父组件提供的数据和方法:

      import { useParent } from '@vant/use';export default {  setup() {    const { parent } = useParent(RELATION_KEY);    // 调用父组件提供的数据和方法    if (parent) {      parent.add();      console.log(parent.count.value); // -> 1    }  },};

      API

      类型定义

      function useParent<T>(  key: string | symbol): {  parent?: T;  index?: Ref<number>;};function useChildren(  key: string | symbol): {  children: ComponentPublicInstance[];  linkChildren: (value: any) => void;};

      useParent 返回值

      参数说明类型
      parent父组件提供的值any
      index当前组件在父组件的所有子组件中对应的索引位置Ref<number>

      useChildren 返回值

      参数说明类型
      children子组件列表ComponentPublicInstance[]
      linkChildren向子组件提供值的方法(value: any) => void


      介绍

      监听点击元素外部的事件。

      代码演示

      基本用法

      <div ref="root" />
      import { ref } from 'vue';import { useClickAway } from '@vant/use';export default {  setup() {    const root = ref();    useClickAway(root, () => {      console.log('click outside!');    });    return { root };  },};

      自定义事件

      通过 eventName 选项可以自定义需要监听的事件类型。

      <div ref="root" />
      import { ref } from 'vue';import { useClickAway } from '@vant/use';export default {  setup() {    const root = ref();    useClickAway(      root,      () => {        console.log('touch outside!');      },      { eventName: 'touchstart' }    );    return { root };  },};

      API

      类型定义

      type Options = {  eventName?: string;};function useClickAway(  target: Element | Ref<Element | undefined>,  listener: EventListener,  options?: Options): void;

      参数

      参数说明类型默认值
      target绑定事件的元素Element | Ref<Element>-
      listener点击外部时触发的回调函数EventListener-
      options可选的配置项Options见下表

      Options

      参数说明类型默认值
      eventName监听的事件类型stringclick


      定制主题

      废弃提示

      本文档已废弃,Vant 提供了更方便的 ConfigProvider 全局配置 组件进行主题配置。基于 Less 变量进行定制的方式将在下个大版本废弃。

      介绍

      Vant 提供了一套默认主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。如果你想完全替换主题色或者其他样式,可以按照本文档进行主题定制。

      示例工程

      我们提供了一个基于 Vue Cli 3 的示例工程,仓库地址为 Vant Demo,其中包含了定制主题的基本配置,可以作为参考。

      样式变量

      Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,通过替换样式变量即可定制你自己需要的主题。

      下面是所有的基础样式变量,组件的样式变量请参考各个组件的文档,或查看组件源码目录下的 var.less 文件。

      // Color Palette@black: #000;@white: #fff;@gray-1: #f7f8fa;@gray-2: #f2f3f5;@gray-3: #ebedf0;@gray-4: #dcdee0;@gray-5: #c8c9cc;@gray-6: #969799;@gray-7: #646566;@gray-8: #323233;@red: #ee0a24;@blue: #1989fa;@orange: #ff976a;@orange-dark: #ed6a0c;@orange-light: #fffbe8;@green: #07c160;// Gradient Colors@gradient-red: linear-gradient(to right, #ff6034, #ee0a24);@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);// Component Colors@text-color: @gray-8;@active-color: @gray-2;@active-opacity: 0.7;@disabled-opacity: 0.5;@background-color: @gray-1;@background-color-light: #fafafa;@text-link-color: #576b95;// Padding@padding-base: 4px;@padding-xs: @padding-base * 2;@padding-sm: @padding-base * 3;@padding-md: @padding-base * 4;@padding-lg: @padding-base * 6;@padding-xl: @padding-base * 8;// Font@font-size-xs: 10px;@font-size-sm: 12px;@font-size-md: 14px;@font-size-lg: 16px;@font-weight-bold: 500;@line-height-xs: 14px;@line-height-sm: 18px;@line-height-md: 20px;@line-height-lg: 22px;@base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue',  Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB',  'Microsoft Yahei', sans-serif;@price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue, Arial,  sans-serif;// Animation@animation-duration-base: 0.3s;@animation-duration-fast: 0.2s;@animation-timing-function-enter: ease-out;@animation-timing-function-leave: ease-in;// Border@border-color: @gray-3;@border-width-base: 1px;@border-radius-sm: 2px;@border-radius-md: 4px;@border-radius-lg: 8px;@border-radius-max: 999px;

      定制方法

      步骤一 引入样式源文件

      定制主题时,需要引入组件对应的 Less 样式文件,支持按需引入和手动引入两种方式。

      按需引入样式(推荐)

      在 babel.config.js 中配置按需引入样式源文件,注意 babel 6 不支持按需引入样式,请手动引入样式。

      module.exports = {  plugins: [    [      'import',      {        libraryName: 'vant',        libraryDirectory: 'es',        // 指定样式路径        style: (name) => `${name}/style/less`,      },      'vant',    ],  ],};

      手动引入样式

      // 引入全部样式import 'vant/lib/index.less';// 引入单个组件样式import 'vant/lib/button/style/less';

      步骤二 修改样式变量

      使用 Less 提供的 modifyVars 即可对变量进行修改,下面是参考的 webpack 配置。

      // webpack.config.jsmodule.exports = {  rules: [    {      test: /.less$/,      use: [        // ...其他 loader 配置        {          loader: 'less-loader',          options: {            // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。            lessOptions: {              modifyVars: {                // 直接覆盖变量                'text-color': '#111',                'border-color': '#eee',                // 或者可以通过 less 文件覆盖(文件路径为绝对路径)                hack: `true; @import "your-less-file-path.less";`,              },            },          },        },      ],    },  ],};

      如果 vue-cli 搭建的项目,可以在 vue.config.js 中进行配置。

      // vue.config.jsmodule.exports = {  css: {    loaderOptions: {      less: {        // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。        lessOptions: {          modifyVars: {            // 直接覆盖变量            'text-color': '#111',            'border-color': '#eee',            // 或者可以通过 less 文件覆盖(文件路径为绝对路径)            hack: `true; @import "your-less-file-path.less";`,          },        },      },    },  },};

      Vite 项目

      如果是 vite 项目,可以跳过以上步骤,直接在 vite.config.js 中添加如下配置即可。

      // vite.config.jsimport vue from '@vitejs/plugin-vue';import styleImport from 'vite-plugin-style-import';export default {  css: {    preprocessorOptions: {      less: {        javascriptEnabled: true,        // 覆盖样式变量        modifyVars: {          'text-color': '#111',          'border-color': '#eee',        },      },    },  },  resolve: {    alias: [{ find: /^~/, replacement: '' }],  },  plugins: [    vue(),    // 按需引入样式源文件    styleImport({      libs: [        {          libraryName: 'vant',          esModule: true,          resolveStyle: (name) => `vant/es/${name}/style/less`,        },      ],    }),  ],};