特性

  • 提供 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 的辅助库

链接

开源协议

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


实例演示

脚手架

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

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

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

通过 npm 安装

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

# 通过 npm 安装npm i vant -S# 通过 yarn 安装yarn add vant

示例工程

我们提供了一个基于 Vue Cli 的示例工程,示例工程会帮助你了解如下内容:

  • 基于 Vant 搭建单页面应用,配置按需引入组件
  • 配置基于 Rem 的适配方案
  • 配置基于 Viewport 的适配方案
  • 配置基于 TypeScript 的工程
  • 配置自定义主题色方案

引入组件

方式一. 自动按需引入组件 (推荐)

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

# 安装插件npm i babel-plugin-import -D
// 在.babelrc 中添加配置// 注意:webpack 1 无需设置 libraryDirectory{  "plugins": [    ["import", {      "libraryName": "vant",      "libraryDirectory": "es",      "style": true    }]  ]}// 对于使用 babel7 的用户,可以在 babel.config.js 中配置module.exports = {  plugins: [    ['import', {      libraryName: 'vant',      libraryDirectory: 'es',      style: true    }, 'vant']  ]};
// 接着你可以在代码中直接引入 Vant 组件// 插件会自动将代码转化为方式二中的按需引入形式import { Button } from 'vant';
如果你在使用 TypeScript,可以使用 ts-import-plugin 实现按需引入

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

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

import Button from 'vant/lib/button';import 'vant/lib/button/style';

方式三. 导入所有组件

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

import Vue from 'vue';import Vant from 'vant';import 'vant/lib/index.css';Vue.use(Vant);
配置按需引入后,将不允许直接导入所有组件

方式四. 通过 CDN 引入

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

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

进阶用法

Rem 适配

Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具:

PostCSS 配置

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

module.exports = {  plugins: {    'autoprefixer': {      browsers: ['Android >= 4.0', 'iOS >= 8']    },    'postcss-pxtorem': {      rootValue: 37.5,      propList: ['*']    }  }}
在配置 postcss-loader 时,应避免 ignore node_modules 目录,否则将导致 Vant 样式无法被编译

在桌面端使用

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-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"/><!-- 开启 safe-area-inset-bottom 属性 --><van-number-keyboard safe-area-inset-bottom />

组件实例方法

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

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

常见问题

在 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 遵循 Semver 语义化版本规范。

发布节奏

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

v2.4.6

2020-02-01

Bug Fixes

  • Picker: 修复更新 columns 数据不生效的问题 #5614

v2.4.5

2020-02-01

Feature

  • Picker: 支持级联选择 #4247
  • Slider: 新增 button-size 属性 1e9b8c
  • 优化 props 类型,原有 number 类型的 props 现在支持传入 string

Style

  • DropdownItem: 新增 @dropdown-item-z-index 变量 6f4c6f
  • IndexBar: 新增 @index-anchor-z-index 变量 89ee8e
  • IndexBar: 新增 @index-bar-sidebar-z-index 变量 89ee8e
  • IndexBar: 新增 @index-bar-index-active-color 变量 0011db
  • Notify: 新增 @notify-text-color 变量 9dcf57
  • Overlay: 新增 @overlay-z-index 变量 95d19f
  • Rate: 新增 @rate-icon-disabled-color 变量 8b8471
  • Rate: 新增 @rate-icon-full-color 变量 5c804c
  • Rate: 新增 @rate-icon-void-color 变量 f90015
  • Slider: 新增 @slider-bar-height 变量 a5819c
  • Search: 新增 @search-content-background-color 变量 ea7419
  • Step: 新增 @step-active-color 变量 9e7a68
  • Tabbar: 新增 @tabbar-z-index 变量 0441f7
  • NavBar: 新增 @nav-bar-z-index 变量 a2d870
  • NumberKeyboard: 新增 @number-keyboard-z-index 变量 760938

Bug Fixes

  • ImagePreview: 修复双击缩放时 max-zoom 属性不生效的问题 1baa60
  • Popup: 修复 position 为 center 时 duration 属性不生效的问题 44072e
  • Step: 修复 active-color 未改变分隔线颜色的问题 cfadce

v2.4.4

2020-01-24

Feature

  • Card: 优化图片拉伸模式 e766d5
  • Calendar: 新增 get-contaienr 属性 #5609
  • Calendar: 新增 close-on-popstate 属性 2b82dc
  • CountDown: 新增 change 事件 #5599
  • GoodsActionButton: 新增 icon 属性 b83bed

Bug Fixes

  • Sku: 修复 get-container 属性不能为 string 类型的问题 #5608

v2.4.3

2020-01-19

Feature

  • Swipe: 页面隐藏时暂停自动轮播 113157
  • Stepper: 新增 long-press 属性 2f3ec6
  • Calendar: 新增 max-range、range-prompt 属性 #5583
  • ImagePreview: 新增 @image-preview-index-text-shadow 变量 e2f302

Improvement

  • Icon: 更新 share 图标 2f77ac
  • Field: 优化 readonly 状态下的光标类型 60173d
  • Stepper: 优化 disable-input 状态下的输入框颜色 959eca

Bug Fixes

  • GoodsAction: 修复未设置容器高度的问题 #5593

Types

  • Calendar: 新增类型定义 dac60c
  • Toast: 修复 setDefaultOptions 方法参数定义错误 #5582

v2.4.2

2020-01-14

Feature

  • Sku: 新增 properties 属性 #5525
  • Field: 新增 digit 类型 #5524
  • Field: 新增 formatter 属性 #5534
  • Image: 新增 error-icon 属性 #5470
  • Image: 新增 loading-icon 属性 #5469
  • Swipe: 新增 prev、next 方法 #5548
  • GoodsAcitonIcon: 新增 color 属性 #5576

Improvement

  • AddressList: 优化样式细节 #5507
  • AddressEdit: 优化错误提示展示方式 #5479
  • ActionSheet: 优化关闭按钮样式 #5574
  • CouponList: 优化样式细节 #5501
  • Calendar: 弹出时自动滚动到当前选中的日期 #5526
  • ImagePreview: 优化图片加载失败提示样式 #5570
  • 优化所有组件的光标类型 c1a535

Bug Fixes

  • Button: 修复加载状态下仍会有点击反馈的问题 0a70d3
  • Card: 修复图片圆角样式未生效的问题 #5480
  • Calendar: 修复选中的日期无法展示提示信息的问题 #5536
  • Checkbox: 修复设置 label-disabled 后空白区域仍然可以点击的问题 3d10d4
  • CouponList: 修复点击反馈区域错误的问题 #5521
  • Field: 修复 type 为 number 时在 iOS 上仍然能输入非数字字符的问题 #5520
  • ImagePreview: 修复在桌面端使用时无法拖拽的问题 #4487
  • Picker: 修复点击事件偶尔会丢失的问题 5cbb9e
  • PullRefresh:修复 head-height 属性未正确设置高度的问题 028747
  • Tabs: 修复容器设置 fixed 布局时无法渲染底部条的问题 #5496

v2.4.1

2020-01-02

Feature

  • ContactEdit: 优化错误提示展示方式 #5437
  • CouponCell: 优先展示 value 字段的数值 #5438

Bug Fixes

  • Calendar: 修复日期对应的星期数展示错误的问题 #5452
  • List: 修复 direction 为 up 时加载事件触发时机错误的问题 #5439

v2.4.0

2020-01-01

New Component

  • 新增 Calendar 日历组件

Feature

  • List: 新增 error 插槽 e9a938
  • List: 新增 finished 插槽 8a0705
  • Picker: 新增 confirm 方法 5eb2a4
  • PullRefresh: 新增 success 插槽 56e450
  • CouponList: 更新底部按钮样式 #5368
  • DatetimePicker: 新增 getPicker 方法 1dc1fe
  • TreeSelect: 新增 @tree-select-item-selected-size 变量 373159
  • Image: 新增 @image-loading-icon-size、@image-error-icon-size 变量 d7ae8c

Compatibility

在之前的版本中,有较多同学反馈在 iOS 10 ~ 11 上会偶现组件无法操作的情况,该问题的原因是 Vue 2.6.x 版本在绑定事件时存在事件无法冒泡的兼容性问题。相关 issue

从 2.4 版本开始,我们通过手动绑定事件的方式来规避这个问题,涉及以下组件:

  • Area
  • DatetimePicker
  • ImagePreview
  • Rate
  • Slider
  • Swipe
  • SwipeCell
  • NumberKeyboard
  • Picker
  • PullRefresh

Bug Fixes

  • Icon: 修复 medel-o 图标不展示的问题 7b905a
  • ImagePreview: 修复 close 事件重复触发的问题 #5410
  • PullRefresh: 修复下拉到顶部时可能不触发下拉刷新的问题 e00058
  • Tag: 修复动态设置 closeable 时动画错误的问题 fe6e2f
  • Tag: 修复 close 时会触发 click 事件的问题 #5351
  • Toast: 修复同时存在多个 Toast 时 forbidClick 可能失效的问题 #5398
  • Picker: 修复在桌面端使用时拖动后回弹的问题 #5430
  • Stepper: 修复在 safari 上禁用时文字颜色不正确的问题 #5428
  • IndexBar: 修复 IndexAnchor 没有父容器时定位错误的问题 #5429

Types

  • AddressEdit: 新增 setAddressDetail 方法的类型定义 #5352
  • Area: 新增 reset 方法的类型定义 #5353
  • Checkbox: 新增 toggle 方法的类型定义 #5354
  • CountDown: 新增 start、end、reset 方法的类型定义 0438bd
  • DropdownItem: 新增 toggle 方法的类型定义 5c1883
  • Field: 新增 focus、blur 方法的类型定义 0b5c8e
  • List: 新增 check 方法的类型定义 285bce
  • Picker: 新增 getValues 等方法的类型定义 46d2b0
  • Sku: 新增 methods types d2bb9f
  • Swipe: 新增 swipeTo、resize 方法的类型定义 a1831b
  • SwipeCell: 新增 open、close 方法的类型定义 9a9676
  • Tabs: 新增 resize 方法的类型定义 3c526e
  • Uploader: 新增 closeImagePreview 方法的类型定义 cf191e

v2.3.3

2019-12-21

Bug Fixes

  • 修复 babel-plugin-import 按需引入部分组件时编译报错的问题

v2.3.2

2019-12-20

Bug Fixes

  • 修复 Area 未自动引入依赖的 Picker 样式的问题
  • 修复 DatetimePicker 未自动引入依赖的 Picker 样式的问题
  • 修复 CountDown 在特定情况下内部计时器未清除的问题 #5340
  • 修复 ImagePreview 在特定情况下会重复 onClose 回调的问题 #5341

v2.3.1

2019-12-20

Bug Fixes

  • 修复全量引入组件时,入口文件中存在未编译的 ES6 代码的问题

v2.3.0

2019-12-20

Style

在 2.3.0 版本中,我们对业务组件的样式进行了全新升级,涉及以下组件:

  • AddressEdit
  • Card
  • CouponList
  • ContactList
  • ContactCard
  • ContactEdit
  • SubmitBar

Features

  • 内部构建流程升级,使用 @vant/cli 进行构建
  • AddressList: 新增 default-tag-text 属性 #5106
  • Card: 新增 price-top 插槽 #5134
  • Checkbox: 优化 toggleAll 性能 #5285
  • Circle: 新增 stroke-linecap 属性 #5087
  • CouponList: 新增 show-count 属性 #5139
  • ContactList: 新增 default-tag-text 属性 #5089
  • ContactCard: 新增 show-set-default 属性 #5083
  • ContactCard: 新增 set-default-label 属性 #5083
  • CountDown: 支持 SS 和 S 格式 #5154
  • Sku: 新增 new startSaleNum 属性 #5105
  • Sku: 新增 resetSelectedSku 方法 #5318
  • SubmitBar: 新增 text-align 属性 #5130
  • SwipeCell: 新增 open 事件 #5324
  • SwipeCell: 新增 before-close 属性 #5320
  • Tab: 新增 dot 属性 #5272
  • Tab: 新增 info 属性 #5274
  • Tab: 新增 rendered 事件 #5315
  • Tab: 新增 scrollspy 属性 #5273
  • Toast: 完善 TS 类型定义 #5086

Bug Fixes

  • 修复 ActionSheet 按钮会提交表单的问题 #5181
  • 修复 Card 在未使用 price 属性的情况下 bottom 插槽不生效的问题 #5116
  • 修复 Dialog 快速点击按钮时可能重复触发 before-close 的问题 #5267
  • 修复 DropdownMenu 在页面滚动时菜单位置错误的问题 #5313
  • 修复 Icon medal 图标名称拼写错误的问题 #5242
  • 修复 NumberKeyboard 在隐藏状态下也会触发 blur 事件的问题 #5110
  • 修复 Picker 按钮会提交表单的问题 #5182
  • 修复 Popup 在 activated 后未重新打开的问题 #5286
  • 修复 Switch size 属性未定义 Number 类型的问题 #5229
  • 修复 SubmitBar 价格为整数时显示错误的问题 #5224
  • 修复 Sku 重置时未校验数量的问题 #5231
  • 修复 Sku 步进器可能输入小数的问题 #5202
  • 修复 Sku 步进器事件可能抛出小数的问题 #5210
  • 修复 Stepper 按钮会提交表单的问题 #5183
  • 修复 Stepper 在 max、min 属性变化时未更新输入框值的问题 #5257
  • 修复 TreeSelect 事件触发顺序错误的问题 #5153
  • 修复 TouchEmulator 在 Firefox 上的兼容性问题 #5118
  • 修复 Uploader 重复上传同张图片时不会触发 oversize 事件的问题 #5177
  • 修复主题定制时使用低版本 Less 会报错的问题 #5157

v2.2.16

2019-12-03

Features

  • Stepper: 新增 disable-plus 属性 #5180
  • Stepper: 新增 disable-minus 属性 #5180

v2.2.15

2019-11-28

Bug Fixes

  • 修复 List 组件在部分情况下加载状态未重置的问题

v2.2.14

2019-11-22

Features

  • Tabs: 新增 title-style 属性 #5048
  • Tabs: 新增 resize 方法 #5071
  • Swipe: 新增 resize 方法 #5070

Bug Fixes

  • 修复 Cell value 过长时不换行的问题 #5029
  • 修复 SwipeCell 在桌面端无法使用的问题 #5077
  • 修复 Field 在 Safari 下输入换行符时字数统计错误的问题 #5049
  • 修复 Tabbar 设置 safe-area-inset-bottom 后可能出现样式错位的问题 #5079
  • 修复 DropdownMenu 使用 get-container 属性时点击后会立即关闭的问题 #5047

v2.2.13

2019-11-14

Features

  • Area: 新增 swipe-duration 属性 #5014
  • Swipe: 新增 stop-propagation 属性 #4972
  • Toast: 新增 overlay 选项 #4969
  • Toast: 新增 clickOnClickOverlay 选项 #4967
  • SwipeCell: 新增 opened 事件 #4986
  • ActionSheet: 新增 close-icon 属性 #5016
  • DropdownItem: 新增 title 插槽 #4975
  • DatetimePicker: 新增 swipe-duration 属性 #5015

Bug Fixes

  • 修复 Tab name 设置为 0 时无法正确匹配的问题 #5017
  • 修复 Indexbar 隐藏时可能出现锚点位置错误的问题 #5012
  • 修复 Indexbar 设置 sticky-offset-top 后可能出现锚点位置错误的问题 #5012
  • 修复 DatetimePicker 使用 filter 并返回空数组时无法切换时间的问题 #4973
  • 修复 DateTimePicker 动态设置 max-hour 并小于 v-model 绑定的时间时出现错误的问题 #5006
  • 修复 ImagePreview 类型中定义缺少 swipeDuration 选项的问题 #4968

v2.2.12

2019-11-07

Features

  • Stepper: 新增 name 属性 #4931
  • Uploader: 新增 deletable 属性 #4925

Bug Fixes

  • 修复 Sku 内容最小高度错误的问题 #4942
  • 修复 List 在初始化时可能同时触发两次 load 事件的问题 #4953
  • 修复 @border-color 变量无法定制某些组件边框颜色的问题 #4939

v2.2.11

2019-11-04

Features

  • Switch: 新增 click 事件 #4915
  • Switch: size 属性支持 number 类型 #4913
  • Toast: 默认持续时间由 3 秒调整为 2 秒 #4886
  • Uploader: 新增 closeImagePreview 方法 #4901

Bug Fixes

  • 修复 Button 加载图标颜色不正确的问题 #4868
  • 修复 CountDown 在销毁时未清除定时器的问题 #4918
  • 修复 CountDown 在 keep-alive 状态下未暂停定时器的问题 #4919
  • 修复 Grid 使用 icon 插槽时 info、dot 属性不生效的问题 #4902

v2.2.10

2019-10-27

Features

  • Icon: 新增 font-display: auto 样式 #4831
  • Popup: 新增 close-on-popstate 属性 #4845
  • Picker: 新增 swipe-duration 属性 #4816
  • Toast: 支持针对指定类型的 Toast 修改默认配置 #4848

Bug Fixes

  • 修复 Uploader 文件预览圆角样式错误的问题 #4846
  • 修复 DatetimePicker 同时使用 min-date 和 filter 时初始值错误的问题 #4837

v2.2.9

2019-10-20

Features

  • Tag: 新增 closeable 属性 #4763
  • Loading: 新增若干个 Less 变量 #4781
  • Progress: 新增若干个 Less 变量 #4790
  • Progress: 新增 track-color 属性 #4789
  • Toast: 新增 @toast-loading-icon-color 变量 #4782
  • Picker: 新增 @picker-loading-icon-color 变量 #4787
  • ImagePreview: 新增 cover 插槽 #4766

Bug Fixes

  • 修复 Tag 圆角不够圆的问题 #4762
  • 修复 Sku 重置时不触发 sku-selected 事件的问题 #4755
  • 修复 ImagePreview 点击索引时会关闭预览的问题 #4764
  • 修复 AddressEdit 设置 area-placeholder 后无法选择海外地址的问题 #4769

v2.2.8

2019-10-17

Features

  • Slider: 优化点击区域 #4701
  • Slider: 增加过渡动画 #4700
  • Dialog: 更新圆角样式 #4730
  • Uploader: 更新删除图标样式,添加图片圆角样式 #4712
  • Field: 新增 show-word-limit 属性 #4721
  • ActionSheet: 新增 description 属性 #4691
  • Stepper: 设置 decimal-length 属性后会在输入过程中进行校验 #4747
  • 新增渐变色相关的 Less 变量 #4752
  • 新增多行文字省略的内置样式 #4690

Bug Fixes

  • 修复 Slider 宽度异常的问题 #4699
  • 修复 Rate 由于 inline-block 导致的错误高度 #4693
  • 修复 AddressEdit 省市区未选择完全时能够保存的问题 #4724

v2.2.7

2019-10-11

Features

  • Dialog: 新增 width 属性 #4687
  • Dialog: 新增 overlay-class 属性 #4683
  • Dialog: 新增 overlay-style 属性 #4682
  • Uploader: 新增 file 类型的 result-type #4680
  • TreeSelect: 新增 className 选项 #4671

Bug Fixes

  • 修复 Dialog 可能出现文字模糊的问题 #4686
  • 修复 Stepper 的 step 值很小时无法生效的问题 #4675
  • 修复 DatetimePicker 动态修改时间范围时, confirm 事件无法获取到正确结果的问题 #4676
  • 修复 Field 同时设置 error 和 disabled 属性时文字颜色错误的问题 #4666

v2.2.6

2019-10-08

Features

  • Grid: 新增 icon-size 属性 #4656
  • Toast: 新增 transition 属性 #4638
  • Dialog: 新增 transition 属性 #4636
  • Dialog: 新增 open、close 事件 #4633
  • Dialog: 新增 opened、closed 事件 #4634
  • NumberKeyboard: 新增 extra-key 插槽 #4644
  • CheckboxGroup: 新增 toggleAll 方法 #4640

Bug Fixes

  • 修复 GoodsAction 圆角错误的问题 #4653
  • 修复 Tabs 类型为 card 时上边距错误的问题 #4658
  • 修复 AddressList input 事件重复触发的问题 #4659
  • 修复 NumberKeyboard 在 Vue 2.6 下的兼容问题 #4632

v2.2.5

2019-09-28

Features

  • Picker: 新增 columns-top 插槽 #4607
  • Picker: 新增 columns-bottom 插槽 #4607
  • Overlay: 新增 default 插槽 #4571
  • Overlay: 新增 custom-style 属性 #4572
  • Checkbox: 新增 bind-group 属性 #4600
  • DropdownItem: 新增 get-container 属性 #4611
  • Area: 新增 columns-placeholder 属性 #4580
  • AddressEdit: 新增 area-columns-placeholder 属性 #4584

Bug Fixes

  • 修复 Overlay 未添加 TypeScript 定义的问题 #4601
  • 修复 Swipe swipeTo 方法在某些边界情况下过渡动画不正确的问题 #4570
  • 修复 Uploader 预览 URL 相同的图片时索引错误的问题 #4577

v2.2.4 [已废弃]

2019-09-28 ????????

Tips

  • 本版本存在样式丢失问题,请使用 2.2.5 版本

v2.2.3

2019-09-24

Features

  • Cell: 优化无障碍访问 #4519
  • Popup: 优化无障碍访问 #4516
  • Search: 优化无障碍访问 #4522
  • Picker: 优化无障碍访问 #4521
  • GridItem: 优化无障碍访问 #4517
  • ActionSheet: 优化无障碍访问 #4525
  • Sku: 新增 previewImgUrl 字段 #4562
  • RadioGroup: 新增 icon-size 属性 #4529
  • RadioGroup: 新增 checked-color 属性 #4532
  • CheckboxGroup: 新增 icon-size 属性 #4530
  • CheckboxGroup: 新增 checked-color 属性 #4531
  • ActionSheet: 默认开启 round 属性 #4542
  • ActionSheet: 默认开启 safe-area-inset-bottom 属性 #4524
  • NumberKeyboard: 默认开启 safe-area-inset-bottom 属性 #4544

v2.2.2

2019-09-19

Features

  • Dialog: 优化文字换行 #4506
  • Search: 新增 action-text 属性 #4501
  • Popup: 新增 close-icon-position 属性 #4507
  • Uploader: 回调函数增加 index 参数 #4460
  • GoodsActionButton: 加大按钮高度 #4461
  • AddressList: 新增 @address-list-item-radio-icon-color 变量 #4481

Bug Fixes

  • 修复 Field 禁用状态在 safari 上文字颜色过浅的问题 #4508
  • 修复 DatetimePicker 选项为纯文字时陷入死循环的问题 #4485
  • 修复 ImagePreview 手势缩放时可能出现缩放比例异常的问题 #4477

v2.2.1

2019-09-12

Features

  • Icon: 新增 dot 属性 #4425
  • Icon: 新增 down、wap-home 图标 #4404
  • GridItem: 新增 dot 属性 #4426
  • GridItem: 新增 info 属性 #4424
  • TreeSelect: 新增 dot 选项 #4433
  • Tab: 新增 to、url、replace 属性 #4422
  • Progress: 新增 stroke-width 属性 #4397
  • Popup: 新增 safe-area-inset-bottom 属性 #4419
  • Stepper: 新增 decimal-length 属性 #4443
  • Sku: 新增 stock-threshold 属性 #4444
  • Sku: 新增 safe-area-inset-bottom 属性 #4428
  • SidebarItem: 新增 dot 属性 #4432
  • Sku: 优化样式细节 #4437
  • Circle: 优化文本样式 #4401

Bug Fixes

  • 修复 Sku 按钮位置可能错误的问题 #4427
  • 修复 Uploader 删除时会触发 click-preview 事件的问题 #4407
  • 修复 Progress 文字位置不准确的问题 #4396

v2.2.0

2019-09-06

Features

  • Style: 更新基础红色为 #ee0a24 #4368
  • Rate: 新增 touchable 属性 #4361
  • Rate: 布局调整为 inline-block #4334
  • Rate: 优化手势滑动的流畅度 #4336
  • Popup: 新增 closeable 属性 #4362
  • Popup: 新增 close-icon 属性 #4366
  • Sidebar: 移除了内外边框 #4382
  • SidebarItem 新增 disabled 属性 #4325
  • TreeSelect: 新增 max 属性 #4323
  • TreeSelect: 支持通过 info 展示徽标 #4384
  • Uploader: 新增 close-preview 事件 #4376
  • ImagePreview: 新增图片加载过程的提示 #4378

Bug Fixes

  • 修复 Field 在 Safari 浏览器上样式异常的问题 #4380
  • 修复 Button 在 color 属性中传入渐变色时边框颜色错误的问题 #4342
  • 修复 Dialog 关闭时未重置按钮加载状态的问题 #4352
  • 修复 Slider 初始值超出范围时展示错误的问题 #4337
  • 修复 Sidebar 徽标位置错误的问题 #4324
  • 修复 DropdownItem 选项选中态颜色丢失的问题 #4330
  • 修复 NumberKeyboard 在 iphoneX 上右侧按钮位置错误的问题 #4304
  • 修复 ImagePreview 在关闭后未重置图片缩放状态的问题 #4319
  • 修复 ImagePreview 在某些情况下页码不正确的问题 #4320

v2.1.8

2019-08-29

Features

  • Picker: 新增 allow-html 属性 #4278
  • PasswordInput: 新增 focused 属性 #4279
  • GoodsActionButton: 新增 color 属性 #4255
  • Button: color 属性支持传入 linear-gradient 渐变色 #4252

Bug Fixes

  • 修复 Circle stroke-width 超过 60 时样式错误的问题 #4256
  • 修复 Picker 滑动暂停时位置错误的问题 #4277
  • 修复 Picker 滑动结束时触发点击会跳动的问题 #4273

v2.1.7

2019-08-26

Bug Fixes

  • 修复 RadioGroup 设置 disabled 属性后仍能切换的问题 #4242
  • 修复 CheckboxGroup 设置 disabled 属性后仍能切换的问题 #4242

v2.1.6

2019-08-26

Features

  • Tag: 新增 warning 类型 #4232
  • Image: 新增 radius 属性 #4230
  • Notify: 新增 type 属性 #4237
  • CellGroup: 新增 title 插槽 #4227
  • Sku: 支持动态设置 initial-sku 属性 #4214
  • Sku: 支持预览更高层级的规格类目图片 #4236
  • Locale: 支持西班牙语 #4235

Bug Fixes

  • 修复 Tabbar 在 route 模式下选中样式错误的问题 #4229
  • 修复 NumberKeyboard 使用 title 属性时按钮位置错误的问题 #4228
  • 修复 IndexBar 在 sticky 模式下锚点位置可能超出元素边界的问题 #4218

v2.1.5

2019-08-23

Features

  • Toast: 新增 closeOnClick 选项 #4192
  • Uploader: 新增 image-fit 属性 #4189
  • Uploader: 新增 click-preview 事件 #4206
  • Uploader: 新增 preview-full-image 属性 #4205
  • DropdownMenu: 新增 @dropdown-menu-title-active-text-color less 变量 #4208

Bug Fixes

  • 修复 Area 无法选中部分海外地址的问题 #4195
  • 修复 IndexBar 在局部滚动容器内计算错误的问题 #4184
  • 修复 NumberKeyboard 按键边框颜色错误的问题 #4183

v2.1.4

2019-08-21

Features

  • Col: 新增 click 事件 #4169
  • Row: 新增 click 事件 #4170
  • Area: 新增 is-oversea-code 属性 #4163
  • Circle: 支持渐变色 #4157
  • Circle: 支持传入 number 类型的 size 属性 #4160
  • Tabbar: 支持通过 to.name 匹配路由 #4148
  • Sku: 页面返回时自动关闭图片预览 #4152
  • Uploader: 页面返回时自动关闭图片预览 #4151
  • Uploader: 图片预览支持更多图片格式 #4140
  • TreeSelect: 支持多选 #4130
  • TreeSelect: 支持在 active-id 属性上使用 sync 修饰符 #4133
  • TreeSelect: 支持在 main-active-index 属性上使用 sync 修饰符 #4132

Bug Fixes

  • 修复 Sku 部分文案不支持国际化修改的问题 #4172
  • 修复 Field 按钮在 Firefox 上宽度变小的问题 #4144
  • 修复 Tabbar 触发 vue-router 路由重复跳转提示的问题 #4147
  • 修复 Picker 样式可能被重复引入的 base 样式覆盖的问题 #4136

v2.1.3

2019-08-15

Features

  • Sku: 支持国际化 #4123
  • Button: 新增 color 属性 #4124
  • Uploader: 新增 before-delete 属性 #4118
  • Collapse: 新增 value 属性类型错误时的提示 #4122
  • TreeSelect: 新增 content 插槽 #4105
  • TreeSelect: 支持 string 类型的 height 属性 #4107
  • NumberKeyboard: 优化点击体验 #4116

Bug Fixes

  • 修复 DropdownMenu 嵌套在 NavBar 内时样式错误的问题 #4098
  • 修复 Tab 动态插入标签页时下划线位置未更新的问题 #4091
  • 修复 Icon service-o 图标不完整的问题 #4088
  • 修复 Icon gift-o、refund-o 图标不完整的问题 #4089
  • 修复 Slider 位置未改变时也会触发 change 事件的问题 #4087

v2.1.2

2019-08-10

介绍

Vant 提供了一套默认主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。如果你想完全替换主题色或者其他样式,可以使用下面提供的方法。

示例工程

我们提供了一个基于 Vue Cli 3 的示例工程,仓库地址为 Vant Demo,其中包含了定制主题的基本配置,可以作为参考。

样式变量

Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,通过替换样式变量即可定制你自己需要的主题。

下面是一些基本的样式变量,所有可用的颜色变量请参考 配置文件

// Component Colors@text-color: #323233;@border-color: #ebedf0;@active-color: #f2f3f5;@background-color: #f7f8fa;@background-color-light: #fafafa;

定制方法

步骤一 引入样式源文件

定制主题时,需要引入组件对应的 Less 样式文件,支持按需引入和手动引入两种方式。

按需引入样式(推荐)

在 babel.config.js 中配置按需引入样式源文件,注意 babel6 不支持按需引入样式,请手动引入样式

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: {            modifyVars: {              // 直接覆盖变量              'text-color': '#111',              'border-color': '#eee'              // 或者可以通过 less 文件覆盖(文件路径为绝对路径)              'hack': `true; @import "your-less-file-path.less";`            }          }        }      ]    }  ]};


实例演示

介绍

感谢你使用 Vant。

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

Issue 规范

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

参与开发

本地开发

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

# 克隆仓库git clone git@github.com:youzan/vant.git# 安装依赖cd vant && npm run bootstrap# 进入开发模式,浏览器访问 http://localhost:8080npm run dev

目录结构

  • 仓库的组件代码位于 src 下,每个组件一个文件夹
  • docs 目录下是文档网站的代码,本地开发时可以在目录下运行 npm run dev 开启文档网站

项目主要目录如下:

vant├─ build     # 构建├─ docs      # 文档├─ src       # 组件├─ packages  # 子包├─ test      # 单测└─ types     # 类型

添加新组件

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

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

提交 PR

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 现有的设计资源,更多资源还在整理中。

组件

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

下载

提示:目前 Sketch 中部分组件仍为旧版样式,我们正在梳理新版设计规范,尽请期待!

图标

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

下载


实例演示

介绍

在参与 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" />

Props 换行

多个 Props 的元素应该分多行撰写,每个 Props 一行,闭合标签单起一行。

<!-- bad --><my-component foo="a" bar="b" baz="c" /><!-- good --><my-component  foo="a"  bar="b"  baz="c"/>

指令缩写

指令缩写,用 : 表示 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: '',  mixins: [],  components: {},  props: {},  data() {},  computed: {},  watch: {},  created() {},  mounted() {},  destroyed() {},  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/lib/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
英语en-US
土耳其语tr-TR
西班牙语es-ES
在 这里 查看所有的 i18n 配置文件。

Sku 组件

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


实例演示

引入

import Vue from 'vue';import { Button } from 'vant';Vue.use(Button);

代码演示

按钮类型

支持default、primary、info、warning、danger五种类型,默认为default

<van-button type="default">默认按钮</van-button><van-button type="primary">主要按钮</van-button><van-button type="info">信息按钮</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="info">朴素按钮</van-button>

细边框

设置hairline属性可以开启 0.5px 边框,基于伪类实现

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

禁用状态

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

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

加载状态

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

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

按钮形状

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

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

图标按钮

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

<van-button icon="star-o" type="primary" /><van-button icon="star-o" type="primary">按钮</van-button><van-button icon="https://img.yzcdn.cn/vant/logo.png" type="info">按钮</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, #4bb0ff, #6149f6)">渐变色按钮</van-button>

API

Props

参数说明类型默认值
type类型,可选值为 primary info warning dangerstringdefault
size尺寸,可选值为 large small ministringnormal
text按钮文字string-
color v2.1.8按钮颜色,支持传入linear-gradient渐变色string-
icon左侧 图标名称 或图片链接string-
tagHTML 标签stringbutton
native-type原生 button 标签 type 属性string-
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: Event
touchstart开始触摸按钮时触发event: TouchEvent

以下是一个简单示例:

<!DOCTYPE html><html lang="zh"><head>  <meta charset="UTF-8" />  <meta name="viewport" content="width=device-width, initial-scale=1.0" />  <meta http-equiv="X-UA-Compatible" content="ie=edge" />  <title>W3Cschool(51coolma.cn)</title>  <!-- 引入样式 -->  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.10/lib/index.css" rel="external nofollow" target="_blank"  />  <!-- 引入组件 -->  <script src="https://cdn.jsdelivr.net/npm/vue@2.6/dist/vue.min.js" rel="external nofollow" ></script>  <script src="https://cdn.jsdelivr.net/npm/vant@2.10/lib/vant.min.js" rel="external nofollow" ></script></head><body>  <div id="app">    <div>      <p>按钮类型</p>      <van-button type="primary">主要按钮</van-button>      <van-button type="info">信息按钮</van-button>      <van-button type="default">默认按钮</van-button>      <van-button type="danger">危险按钮</van-button>      <van-button type="warning">警告按钮</van-button>    </div>    <div>      <p>朴素按钮</p>      <van-button plain type="primary">朴素按钮</van-button>      <van-button plain type="info">朴素按钮</van-button>    </div>    <div>      <p>细边框</p>      <van-button plain hairline type="primary">细边框按钮</van-button>      <van-button plain hairline type="info">细边框按钮</van-button>    </div>    <div>      <p>禁用状态</p>      <van-button disabled type="primary">禁用状态</van-button>      <van-button disabled type="info">禁用状态</van-button>    </div>    <div>      <p>加载状态</p>      <van-button loading type="primary" />      <van-button loading type="primary" loading-type="spinner" />      <van-button loading type="info" loading-text="加载中..." />    </div>    <div>      <p>按钮形状</p>      <van-button square type="primary">方形按钮</van-button>      <van-button round type="info">圆形按钮</van-button>    </div>  </div></body><script>  var app = new Vue({    el: '#app',    data: {    },    methods: {    },    created() {    },  })</script></html>


实例演示

引入

import Vue from 'vue';import { Cell, CellGroup } from 'vant';Vue.use(Cell);Vue.use(CellGroup);

代码演示

基础用法

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

<van-cell-group>  <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时,内容会靠左对齐

<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 slot="title">    <span class="custom-title">单元格</span>    <van-tag type="danger">标签</van-tag>  </template></van-cell><van-cell title="单元格" icon="shop-o">  <!-- 使用 right-icon 插槽来自定义右侧图标 -->  <van-icon    slot="right-icon"    name="search"    style="line-height: inherit;"  /></van-cell>

垂直居中

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

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

API

CellGroup Props

参数说明类型默认值
title分组标题string-
border是否显示外边框booleantrue

Cell Props

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

Cell Events

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

CellGroup Slots

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

Cell Slots

名称说明
default自定义右侧内容
title自定义左侧标题
label自定义标题下方描述
icon自定义左侧图标
right-icon自定义右侧按钮,默认为arrow


实例演示

介绍

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

引入

import Vue from 'vue';import { Icon } from 'vant';Vue.use(Icon);

代码演示

基础用法

Icon的name属性支持传入图标名称或图片链接,所有可用的图标名称见右侧示例

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

提示信息

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

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

图标颜色

Icon的color属性用来设置图标的颜色

<van-icon name="chat-o" color="#1989fa" /><van-icon name="chat-o" color="#07c160" />

图标大小

Icon的size属性用来设置图标的尺寸大小,默认单位为px

<van-icon name="chat-o" size="40" /><van-icon name="chat-o" size="3rem" />

使用本地字体文件

Icon 组件默认引用有赞 CDN 提供的字体文件,并通过网络下载。如果需要在项目中使用本地字体文件,请引入下面的 CSS 文件,并在项目中配置url-loader

import 'vant/lib/icon/local.css';

自定义图标

如果需要在现有 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" />

API

Props

参数说明类型默认值
name图标名称或图片链接string-
dot v2.2.1是否显示图标右上角小红点booleanfalse
info图标右上角徽标的内容number | string-
color图标颜色stringinherit
size图标大小,如 20px 2em,默认单位为pxnumber | stringinherit
class-prefix类名前缀stringvan-icon
tagHTML 标签stringi

Events

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


实例演示

介绍

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

引入

import Vue from 'vue';import { Image } from 'vant';Vue.use(Image);

代码演示

基础用法

基础用法与原生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 Vue from 'vue';import { Lazyload } from 'vant';Vue.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 v2.1.6圆角大小,默认单位为pxnumber | string0
round是否显示为圆形booleanfalse
lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
show-error v2.0.9是否展示图片加载失败提示booleantrue
show-loading v2.0.9是否展示图片加载中提示booleantrue
error-icon v2.4.2失败时提示的 图标名称 或图片链接stringwarning-o
loading-icon v2.4.2加载时提示的 图标名称 或图片链接stringphoto-o

图片填充模式

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

Events

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

Slots

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


实例演示

介绍

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

引入

import Vue from 'vue';import { Col, Row } from 'vant';Vue.use(Col);Vue.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>

Flex 布局

将 type 属性设置为 flex 可以启用 flex 布局,便于进行灵活的对齐

<!-- 左对齐 --><van-row type="flex">  <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 type="flex" 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 type="flex" 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 type="flex" 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 type="flex" 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

参数说明类型默认值
type布局方式,可选值为flexstring-
gutter列元素之间的间距(单位为px)number | string-
tag自定义元素标签stringdiv
justifyFlex 主轴对齐方式,可选值为 end center
space-around space-between
stringstart
alignFlex 交叉轴对齐方式,可选值为 center bottomstringtop

Col Props

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

Row Events

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

Col Events

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

实例演示

代码:

<body ontouchstart="">    <div>        <div class="demo-nav" style="">            <div class="demo-nav__title">Col</div>            <svg viewBox="0 0 1000 1000" class="demo-nav__back">                <path fill="#969799" fill-rule="evenodd" d="M296.114 508.035c-3.22-13.597.473-28.499 11.079-39.105l333.912-333.912c16.271-16.272 42.653-16.272 58.925 0s16.272 42.654 0 58.926L395.504 498.47l304.574 304.574c16.272 16.272 16.272 42.654 0 58.926s-42.654 16.272-58.926 0L307.241 528.058a41.472 41.472 0 0 1-11.127-20.023z"></path>            </svg>        </div>        <section class="van-doc-demo-section demo-col">            <div class="van-doc-demo-block">                <h2 class="van-doc-demo-block__title">基础用法</h2>                <div class="van-row"><div class="van-col van-col--8">span: 8</div>                <div class="van-col van-col--8">span: 8</div>                <div class="van-col van-col--8">span: 8</div>            </div>            <div class="van-row">                <div class="van-col van-col--4">span: 4</div>                <div class="van-col van-col--10 van-col--offset-4"> offset: 4, span: 10</div>            </div>            <div class="van-row">                <div class="van-col van-col--12 van-col--offset-12">offset: 12, span: 12</div>            </div>            <div class="van-doc-demo-block">                <h2 class="van-doc-demo-block__title">在列元素之间增加间距</h2>                <div class="van-row">                    <div class="van-col van-col--8" style="padding-right: 13.3333px;">span: 8</div>                    <div class="van-col van-col--8" style="padding-left: 6.66667px; padding-right: 6.66667px;">span: 8</div>                    <div class="van-col van-col--8" style="padding-left: 13.3333px; padding-right: 1.77636e-15px;">span: 8</div>                </div>            </div>            <div class="van-doc-demo-block">                <h2 class="van-doc-demo-block__title">Flex 布局</h2>                <div class="van-row van-row--flex">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-center">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-end">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-space-between">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-space-around">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>            </div>        </section>    </div><script src="https://b.yzcdn.cn/vant/async_chunks.a839cbb5.js" rel="external nofollow" ></script><script src="https://b.yzcdn.cn/vant/site-mobile.ea70a230.js" rel="external nofollow" ></script></body>

运行效果:

Vant Layout 布局


实例演示

介绍

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

引入

import Vue from 'vue';import { Popup } from 'vant';Vue.use(Popup);

代码演示

基础用法

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

<van-cell is-link @click="showPopup">展示弹出层</van-cell><van-popup v-model="show">内容</van-popup>
export default {  data() {    return {      show: false    }  },  methods: {    showPopup() {      this.show = true;    }  }};

弹出位置

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

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

关闭图标

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

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

圆角弹窗

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

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

指定挂载位置

弹出层默认挂载到组件所在位置,可以通过get-container属性指定挂载位置

<!-- 挂载到 body 节点下 --><van-popup v-model="show" get-container="body" /><!-- 挂载到 #app 节点下 --><van-popup v-model="show" get-container="#app" /><!-- 通过函数指定挂载位置 --><van-popup v-model="show" :get-container="getContainer" />
export default {  methods: {    // 返回一个特定的 DOM 节点,作为挂载的父节点    getContainer() {      return document.querySelector('.my-container');    }  }}
注意:使用 get-container 属性的组件不能为根节点

API

Props

参数说明类型默认值
v-model当前组件是否显示booleanfalse
overlay是否显示遮罩层booleantrue
position弹出位置,可选值为 top bottom right leftstringcenter
overlay-class自定义遮罩层类名string-
overlay-style自定义遮罩层样式object-
duration动画时长,单位秒number | string0.3
round v2.0.7是否显示圆角booleanfalse
lock-scroll是否锁定背景滚动booleantrue
lazy-render是否在显示弹层时才渲染节点booleantrue
close-on-popstate v2.2.10是否在页面回退时自动关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
closeable v2.2.0是否显示关闭图标booleanfalse
close-icon v2.2.0关闭图标名称或图片链接stringcross
close-icon-position v2.2.2关闭图标位置,可选值为top-left
bottom-left bottom-right
stringtop-right
transition动画类名,等价于 transtion 的name属性string-
get-container指定挂载的节点string | () => Element-
safe-area-inset-bottom v2.2.1是否开启 底部安全区适配booleanfalse

Events

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


实例演示

介绍

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>

动画

可以通过 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>


实例演示

介绍

日历组件用于选择日期或日期区间,2.4 版本开始支持此组件

引入

import Vue from 'vue';import { Calendar } from 'vant';Vue.use(Calendar);

代码演示

选择单个日期

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

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

选择日期区间

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

<van-cell title="选择日期区间" :value="date" @click="show = true" /><van-calendar v-model="show" type="range" @confirm="onConfirm" />
export default {  data() {    return {      date: '',      show: false    };  },  methods: {    formatDate(date) {      return `${date.getMonth() + 1}/${date.getDate()}`;    },    onConfirm(date) {      const [start, end] = date;      this.show = false;      this.date = `${this.formatDate(start)} - ${this.formatDate(end)}`;    }  }};

快捷选择

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

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

自定义颜色

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

<van-calendar v-model="show" color="#07c160" />

自定义日期范围

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

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

自定义按钮文字

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

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

自定义日期文案

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

<van-calendar  v-model="show"  type="range"  :formatter="formatter"/>
export default {  methods: {    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;    }  }}

自定义弹出位置

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

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

日期区间最大范围

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

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

平铺展示

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

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

API

Props

参数说明类型默认值
v-model是否显示日历弹窗booleanfalse
type选择类型,single表示选择单个日期,
range表示选择日期区间
stringsingle
title日历标题string日期选择
color颜色,对底部按钮和选中日期生效string#ee0a24
min-date最小日期Date当前日期
max-date最大日期Date当前日期的六个月后
default-date默认选中的日期Date | Date[]今天
row-height日期行高number | string64
formatter日期格式化函数(day: Day) => Day-
position弹出位置,可选值为 top right leftstringbottom
poppable是否以弹层的形式展示日历booleantrue
round是否显示圆角弹窗booleantrue
show-mark是否显示月份背景水印booleantrue
show-confirm是否展示确认按钮booleantrue
close-on-popstate v2.4.4是否在页面回退时自动关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
safe-area-inset-bottom是否开启 底部安全区适配booleantrue
confirm-text确认按钮的文字string确定
confirm-disabled-text确认按钮处于禁用状态时的文字string确定
max-range v2.4.3日期区间最多可选天数,默认无限制number | string-
range-prompt v2.4.3选择超过区间范围时的提示文案string选择天数不能超过 xx 天
get-container v2.4.4指定挂载的节点,用法示例string | () => Element-

Day 数据结构

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

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

Events

事件名说明回调参数
select点击任意日期时触发value: Date | Date[]
confirm日期选择完成后触发,若show-confirmtrue,则点击确认按钮后触发value: Date | Date[]

Slots

名称说明
title自定义标题
footer自定义底部区域内容

方法

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

方法名说明参数返回值
reset重置选中的日期到默认值--

常见问题

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

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

对此问题的详细解释:stackoverflow


实例演示

引入

import Vue from 'vue';import { Checkbox, CheckboxGroup } from 'vant';Vue.use(Checkbox);Vue.use(CheckboxGroup);

代码演示

基础用法

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

<van-checkbox v-model="checked">复选框</van-checkbox>
export default {  data() {    return {      checked: true    };  }};

禁用状态

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

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

禁用文本点击

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

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

自定义形状

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

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

自定义颜色

通过checked-color属性可以自定义选中状态下的图标颜色

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

自定义大小

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

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

自定义图标

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

<van-checkbox v-model="checked">  自定义图标  <img    slot="icon"    slot-scope="props"    :src="props.checked ? activeIcon : inactiveIcon"  ></van-checkbox>
export default {  data() {    checked: true,    activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',    inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png'  }}

复选框组

复选框可以与复选框组一起使用,选中值是一个数组,通过v-model绑定在CheckboxGroup上,数组中的值为选中的复选框的name

<van-checkbox-group v-model="result">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox>  <van-checkbox name="c">复选框 c</van-checkbox></van-checkbox-group>
export default {  data() {    return {      result: ['a', 'b']    };  }};

设置最大可选数

通过max属性可以限制最大可选数

<van-checkbox-group v-model="result" :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="result" 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="info" @click="toggleAll">反选</van-button>
export default {  data() {    return {      result: []    }  },  methods: {    checkAll() {      this.$refs.checkboxGroup.toggleAll(true);    },    toggleAll() {      this.$refs.checkboxGroup.toggleAll();    }  }}

搭配单元格组件使用

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

<van-checkbox-group v-model="result">  <van-cell-group>    <van-cell      v-for="(item, index) in list"      clickable      :key="item"      :title="`复选框 ${item}`"      @click="toggle(index)"    >      <van-checkbox        :name="item"        ref="checkboxes"        slot="right-icon"      />    </van-cell>  </van-cell-group></van-checkbox-group>
export default {  methods: {    toggle(index) {      this.$refs.checkboxes[index].toggle();    }  }}

API

Checkbox Props

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

CheckboxGroup Props

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

Checkbox Events

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

CheckboxGroup Events

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

Checkbox Slots

名称说明SlotProps
default自定义文本-
icon自定义图标checked: 是否为选中状态

CheckboxGroup 方法

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

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

Checkbox 方法

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

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


实例演示

介绍

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

引入

import Vue from 'vue';import { DatetimePicker } from 'vant';Vue.use(DatetimePicker);

代码演示

选择完整时间

<van-datetime-picker  v-model="currentDate"  type="datetime"  :min-date="minDate"  :max-date="maxDate"/>
export default {  data() {    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate: new Date()    };  }};

选择日期(年月日)

<van-datetime-picker  v-model="currentDate"  type="date"  :min-date="minDate"  :max-date="maxDate"/>
export default {  data() {    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate: new Date()    };  }};

选择日期(年月)

通过传入formatter函数,可以对选项文字进行格式化处理

<van-datetime-picker  v-model="currentDate"  type="year-month"  :min-date="minDate"  :max-date="maxDate"  :formatter="formatter"/>
export default {  data() {    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate: new Date()    };  },  methods: {    formatter(type, val) {      if (type === 'year') {        return `${val}年`;      } else if (type === 'month') {        return `${val}月`      }      return val;    }  }}

选择时间

<van-datetime-picker  v-model="currentTime"  type="time"  :min-hour="10"  :max-hour="20"/>
export default {  data() {    return {      currentTime: '12:00'    };  }};

选项过滤器

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

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

API

Props

参数说明类型默认值
type类型,可选值为 date
time year-month
stringdatetime
title顶部栏标题string''
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
show-toolbar是否显示顶部栏booleantrue
loading是否显示加载状态booleanfalse
filter选项过滤函数(type, vals) => vals-
formatter选项格式化函数(type, val) => val-
item-height选项高度number | string44
visible-item-count可见的选项个数number | string5
swipe-duration v2.2.13快速滑动时惯性滚动的时长,单位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当值变化时触发的事件picker: Picker 实例
confirm点击完成按钮时触发的事件value: 当前选中的时间
cancel点击取消按钮时触发的事件-

方法

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

方法名说明参数返回值
getPicker v2.4.0获取 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 Vue from 'vue';import { Field } from 'vant';Vue.use(Field);

代码演示

基础用法

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

<!-- Field 是基于 Cell 实现的,可以使用 CellGroup 作为父元素来提供外边框。 --><van-cell-group>  <van-field v-model="value" placeholder="请输入用户名" /></van-cell-group>
export default {  data() {    return {      value: ''    };  }}

自定义类型

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

<!-- 输入任意文本 --><van-field v-model="text" label="文本" /><!-- 输入手机号,调起手机号键盘 --><van-field v-model="tel" type="tel" label="手机号" /><!-- 允许输入整数,调起数字键盘 --><van-field v-model="digit" type="digit" label="整数" /><!-- 允许输入数字,调起全键盘 --><van-field v-model="number" type="number" label="数字" /><!-- 输入密码 --><van-field v-model="password" type="password" label="密码" />
export default {  data() {    return {      tel: '',      text: '',      digit: '',      number: '',      password: ''    };  }}
Tips: digit 类型从 2.4.2 版本开始支持

禁用输入框

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

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

显示图标

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

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

错误提示

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

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

插入按钮

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

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

格式化输入内容

通过formatter属性可以对输入的内容进行格式化

<van-field  v-model="value"  label="文本"  :formatter="formatter"  placeholder="格式化输入内容"/>
export default {  data() {    return {      value: ''    };  },  methods: {    formatter(value) {      // 过滤输入的数字      return value.replace(/d/g, '');    }  }}

高度自适应

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

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

显示字数统计

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

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

输入框内容对齐

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

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

API

Props

参数说明类型默认值
label输入框左侧文本string-
value当前输入的值number | string-
type输入框类型, 可选值为 tel digit
number textarea password 等
stringtext
size大小,可选值为 largestring-
maxlength输入的最大字符数number | string-
placeholder占位提示文字string-
border是否显示内边框booleantrue
disabled是否禁用输入框booleanfalse
readonly是否只读booleanfalse
required是否显示表单必填星号booleanfalse
clearable是否启用清除控件booleanfalse
clickable是否开启点击反馈booleanfalse
is-link是否展示右侧箭头并开启点击反馈booleanfalse
autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
show-word-limit v2.2.8是否显示字数统计,需要设置maxlength属性booleanfalse
error是否将输入内容标红booleanfalse
formatter v2.4.2输入内容格式化函数Function-
arrow-direction v2.0.4箭头方向,可选值为 left up downstringright
error-message底部错误提示文案,为空时不展示string''
label-class左侧文本额外类名any-
label-width左侧文本宽度,默认单位为pxnumber | string90px
label-align左侧文本对齐方式,可选值为 center rightstringleft
input-align输入框内容对齐方式,可选值为 center rightstringleft
error-message-align错误提示文案对齐方式,可选值为 center rightstringleft
autosize是否自适应内容高度,只对 textarea 有效,
可传入对象,如 { maxHeight: 100, minHeight: 50 },
单位为px
boolean | objectfalse
left-icon左侧 图标名称 或图片链接string-
right-icon右侧 图标名称 或图片链接string-

Events

除下列事件外,Field 默认支持 Input 标签所有的原生事件

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

方法

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

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

Slots

名称说明
label自定义输入框标签
input自定义输入框,使用此插槽后,与输入框相关的属性和事件将失效
left-icon自定义输入框头部图标
right-icon自定义输入框尾部图标
button自定义输入框尾部按钮


实例演示

介绍

数字键盘,提供两种样式风格,可以与密码输入框或自定义的输入框组件配合使用

引入

import Vue from 'vue';import { NumberKeyboard } from 'vant';Vue.use(NumberKeyboard);

代码演示

默认样式

<van-button @touchstart.stop="show = true">  弹出默认键盘</van-button><van-number-keyboard  :show="show"  extra-key="."  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>
import { Toast } from 'vant';export default {  data() {    return {      show: true    }  },  methods: {    onInput(value) {      Toast(value);    },    onDelete() {      Toast('删除');    }  }}

自定义样式

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

双向绑定

可以通过v-model绑定键盘当前输入值

<van-field  readonly  clickable  :value="value"  @touchstart.native.stop="show = true"/><van-number-keyboard  v-model="value"  :show="show"  :maxlength="6"  @blur="show = false"/>
export default {  data() {    return {      show: false,      value: ''    }  }}

左下角按键内容

通过extra-key属性可以设置左下角按键内容

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

键盘标题

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

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

API

Props

参数说明类型默认值
v-model v2.0.2当前输入值string-
show是否显示键盘boolean-
theme样式风格,可选值为 default customstringdefault
title键盘标题string-
maxlength v2.0.2输入值最大长度number | string-
transition是否开启过场动画booleantrue
z-index键盘 z-indexnumber | string100
extra-key左下角按键内容string''
close-button-text关闭按钮文字,空则不展示string-
delete-button-text删除按钮文字string删除
show-delete-key是否展示删除按钮booleantrue
hide-on-click-outside点击外部时是否收起键盘booleantrue
safe-area-inset-bottom是否开启 底部安全区适配booleantrue

Events

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

Slots

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

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

介绍

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

引入

import Vue from 'vue';import { PasswordInput, NumberKeyboard } from 'vant';Vue.use(PasswordInput);Vue.use(NumberKeyboard);

代码演示

基础用法

<!-- 密码输入框 --><van-password-input  :value="value"  info="密码为 6 位数字"  :focused="showKeyboard"  @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard  :show="showKeyboard"  @input="onInput"  @delete="onDelete"  @blur="showKeyboard = false"/>
export default {  data() {    return {      value: '123',      showKeyboard: true    };  },  methods: {    onInput(key) {      this.value = (this.value + key).slice(0, 6);    },    onDelete() {      this.value = this.value.slice(0, this.value.length - 1);    }  }}

自定义长度

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

明文展示

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

错误提示

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

<!-- 密码输入框 --><van-password-input  :value="value"  :error-info="errorInfo"  :focused="showKeyboard"  @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard  :show="showKeyboard"  @input="onInput"  @delete="onDelete"  @blur="showKeyboard = false"/>
export default {  data() {    return {      value: '123',      showKeyboard: true,      errorInfo: ''    };  },  methods: {    onInput(key) {      this.value = (this.value + key).slice(0, 6);      if (this.value.length === 6) {        this.errorInfo = '密码错误';      } else {        this.errorInfo = '';      }    },    onDelete() {      this.value = this.value.slice(0, this.value.length - 1);    }  }}

API

Props

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

Events

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


实例演示

介绍

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

引入

import Vue from 'vue';import { Picker } from 'vant';Vue.use(Picker);

代码演示

基础用法

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

<van-picker :columns="columns" @change="onChange" />
import { Toast } from 'vant';export default {  data() {    return {      columns: ['杭州', '宁波', '温州', '嘉兴', '湖州']    };  },  methods: {    onChange(picker, value, index) {      Toast(`当前值:${value}, 当前索引:${index}`);    }  }};

默认选中项

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

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

展示顶部栏

设置show-toolbar属性后会展示顶部操作栏,点击确认按钮触发confirm事件,点击取消按钮触发cancel事件

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

多列选择

通过columns属性可以配置多列选择

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

级联选择

使用columns的children字段可以实现选项级联的效果(从 2.4.5 版本开始支持)

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

禁用选项

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

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

动态设置选项

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

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

加载状态

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

<van-picker :columns="columns" :loading="loading" />
export default {  data() {    return {      columns: [],      loading: true    };  },  created() {    setTimeout(() => {      this.loading = false;      this.columns = ['选项'];    }, 1000);  }};

搭配弹出层使用

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

<van-field  readonly  clickable  label="城市"  :value="value"  placeholder="选择城市"  @click="showPicker = true"/><van-popup v-model="showPicker" position="bottom">  <van-picker    show-toolbar    :columns="columns"    @cancel="showPicker = false"    @confirm="onConfirm"  /></van-popup>
export default {  data() {    return {      value: '',      showPicker: false,      columns: ['杭州', '宁波', '温州', '嘉兴', '湖州']    }  },  methods: {    onConfirm(value) {      this.value = value;      this.showPicker = false;    }  }};

API

Props

参数说明类型默认值
columns对象数组,配置每一列显示的数据Column[][]
title顶部栏标题string-
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
value-key选项对象中,选项文字对应的键名stringtext
toolbar-position顶部栏位置,可选值为bottomstringtop
loading是否显示加载状态booleanfalse
show-toolbar是否显示顶部栏booleanfalse
allow-html v2.1.8是否允许选项内容中渲染 HTMLbooleantrue
default-index单列选择时,默认选中项的索引number | string0
item-height选项高度number | string44
visible-item-count可见的选项个数number | string5
swipe-duration v2.2.10快速滑动时惯性滚动的时长,单位msnumber | string1000

Events

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

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

Slots

名称说明
default自定义顶部栏内容
title自定义标题内容
columns-top自定义选项上方内容
columns-bottom自定义选项下方内容

Column 数据结构

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

键名说明类型
values列中对应的备选值string[]
defaultIndex初始选中项的索引,默认为 0number
className为对应列添加额外的类名any
children v2.4.5级联选项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 v2.4.0停止惯性滚动并触发 confirm 事件--

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { RadioGroup, Radio } from 'vant';Vue.use(Radio);Vue.use(RadioGroup);

代码演示

基础用法

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

<van-radio-group v-model="radio">  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>
export default {  data() {    return {      radio: '1'    }  }};

水平排列

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

<van-radio-group v-model="radio" 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="radio" disabled>  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>

禁用文本点击

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

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

自定义形状

通过 square 属性设置选中状态的图标颜色

<van-radio-group v-model="radio">  <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="radio">  <van-radio name="1" checked-color="#07c160">单选框 1</van-radio>  <van-radio name="2" checked-color="#07c160">单选框 2</van-radio></van-radio-group>

自定义大小

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

<van-radio-group v-model="radio">  <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="radio">  <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>
export default {  data() {    return {      radio: '1',      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

与 Cell 组件一起使用

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

<van-radio-group v-model="radio">

  <van-cell-group>

    <van-cell title="单选框 1" clickable @click="radio = '1'">

      <template #right-icon>

        <van-radio name="1" />

      </template>

    </van-cell>

    <van-cell title="单选框 2" clickable @click="radio = '2'">

      <template #right-icon>

        <van-radio name="2" />

      </template>

    </van-cell>

  </van-cell-group>

</van-radio-group>

API

Radio Props

参数说明类型默认值
name标识符any-
shape形状,可选值为 squarestring

round

disabled是否为禁用状态boolean

false

label-disabled是否禁用文本内容点击boolean

false

label-position文本位置,可选值为 leftstring

right

icon-size图标大小,默认单位为 pxnumber | string20px
checked-color选中状态颜色string#1989fa

RadioGroup Props

 参数 说明 类型 默认值
 v-model 当前选中项的标识符 any -
 disabled 是否禁用所有单选框 boolean false
 direction           v2.5.0 排列方向,可选值为horizontal string vertical
 icon-size             v2.2.3
所有单选框的图标大小,默认单位为 px
 number | string 20px
 checked-color   v2.2.3 所有单选框的选中状态颜色 string #1989fa
Radio Events
事件名说明回调参数
click点击单选框时触发event: Event

RadioGroup Events

事件名说明回调参数
change当绑定值变化时触发的事件当前选中项的 name

Radio Slots

名称说明SlotProps
default自定义文本-
icon自定义图标checked: 是否为选中状态


实例演示

引入

import Vue from 'vue';import { Rate } from 'vant';Vue.use(Rate);

代码演示

基础用法

<van-rate v-model="value" />
export default {  data() {    return {      value: 3    };  }}

自定义图标

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

自定义样式

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

半星

<van-rate  v-model="value"  allow-half  void-icon="star"  void-color="#eee"/>
export default {  data() {    return {      value: 2.5    };  }}

自定义数量

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

禁用状态

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

只读状态

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

监听 change 事件

<van-rate v-model="value" @change="onChange" />
export default {  method: {    onChange(value) {      Toast('当前值:'+ value);    }  }}

API

Props

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

Events

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


实例演示

引入

import Vue from 'vue';import { Search } from 'vant';Vue.use(Search);

代码演示

基础用法

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

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

事件监听

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

<form action="/">  <van-search    v-model="value"    show-action    placeholder="请输入搜索关键词"    @search="onSearch"    @cancel="onCancel"  /></form>
import { Toast } from 'vant';export default {  data() {    return {      value: ''    };  },  methods: {    onSearch(val) {      Toast(val);    },    onCancel() {      Toast('取消');    }  }}
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  placeholder="请输入搜索关键词"  @search="onSearch">  <div slot="action" @click="onSearch">搜索</div></van-search>

API

Props

参数说明类型默认值
label搜索框左侧文本string-
shape搜索框形状,可选值为 roundstringsquare
background搜索框外部背景色string#f2f2f2
maxlength输入的最大字符数number | string-
placeholder占位提示文字string-
clearable是否启用清除控件booleantrue
autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
show-action是否在搜索框右侧显示取消按钮booleanfalse
action-text v2.2.2取消按钮文字boolean取消
disabled是否禁用输入框booleanfalse
readonly是否将输入框设为只读booleanfalse
error是否将输入内容标红booleanfalse
input-align输入框内容对齐方式,可选值为 center rightstringleft
left-icon输入框左侧 图标名称 或图片链接stringsearch
right-icon输入框右侧 图标名称 或图片链接string-

Events

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

Slots

名称说明
label自定义搜索框左侧文本
action自定义搜索框右侧按钮,设置show-action属性后展示
left-icon自定义输入框左侧图标
right-icon自定义输入框右侧图标


实例演示

引入

import Vue from 'vue';import { Slider } from 'vant';Vue.use(Slider);

代码演示

基本用法

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

指定选择范围

<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">  <div slot="button" class="custom-button">    {{ value }}  </div></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>

垂直方向

Slider 垂直展示时,高度为 100% 父元素高度

<div :style="{ height: '100px' }">  <van-slider v-model="value" vertical /></div>

API

Props

参数说明类型默认值
value当前进度百分比number0
max最大值number | string100
min最小值number | string0
step步长number | string1
bar-height进度条高度,默认单位为pxnumber | string2px
button-size v2.4.5滑块按钮大小,默认单位为pxnumber | string24px
active-color进度条激活态颜色string#1989fa
inactive-color进度条非激活态颜色string#e5e5e5
disabled是否禁用滑块booleanfalse
vertical是否垂直展示booleanfalse

Events

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

Slots

名称说明
button自定义滑动按钮


实例演示

介绍

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

引入

import Vue from 'vue';import { Stepper } from 'vant';Vue.use(Stepper);

代码演示

基础用法

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

<van-stepper v-model="value" />
export default {  data() {    return {      value: 1    }  }}

步长设置

通过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 />

禁用输入框

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

<van-stepper v-model="value" disabled-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" />

异步变更

如果需要异步地修改输入框的值,可以设置async-change属性,并在change事件中手动修改value

<van-stepper  :value="value"  async-change  @change="onChange"/>
import { Toast } from 'vant';export default {  data() {    return {      value: 1    }  },  methods: {    onChange(value) {      Toast.loading({ forbidClick: true });      setTimeout(() => {        Toast.clear();        // 注意此时修改 value 后会再次触发 change 事件        this.value = value;      }, 500);    }  }}

API

Props

参数说明类型默认值
v-model当前输入值number | string-
min最小值number | string1
max最大值number | string-
default-value初始值,当 v-model 为空时生效number | string1
step步长,每次点击时改变的值number | string1
name v2.2.11标识符,可以在change事件回调参数中获取number | string-
input-width输入框宽度,默认单位为pxnumber | string32px
button-size v2.0.5按钮大小以及输入框高度,默认单位为pxnumber | string28px
decimal-length v2.2.1固定显示的小数位数number | string-
integer是否只允许输入整数booleanfalse
disabled是否禁用步进器booleanfalse
disable-plus v2.2.16是否禁用增加按钮booleanfalse
disable-minus v2.2.16是否禁用减少按钮booleanfalse
disable-input是否禁用输入框booleanfalse
async-change是否开启异步变更,开启后需要手动控制输入值booleanfalse
show-plus v2.1.2是否显示增加按钮booleantrue
show-minus v2.1.2是否显示减少按钮booleantrue
long-press v2.4.3是否开启长按手势booleantrue

Events

事件名说明回调参数
change当绑定值变化时触发的事件value: 当前组件的值, detail: 额外信息,包含 name 的字段
overlimit点击不可用的按钮时触发-
plus点击增加按钮时触发-
minus点击减少按钮时触发-
focus输入框聚焦时触发event: Event
blur输入框失焦时触发event: Event


实例演示

引入

import Vue from 'vue';import { Switch } from 'vant';Vue.use(Switch);

代码演示

基础用法

通过v-model绑定开关的选中状态,true表示开,false表示关

<van-switch v-model="checked" />
export default {  data() {    return {      checked: true    };  }};  

禁用状态

通过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="#07c160" inactive-color="#ee0a24" />

异步控制

需要异步控制开关时,可以使用value属性和input事件代替v-model,并在input事件回调函数中手动处理开关状态

<van-switch :value="checked" @input="onInput" />
export default {  data() {    return {      checked: true    };  },  methods: {    onInput(checked) {      Dialog.confirm({        title: '提醒',        message: '是否切换开关?'      }).then(() => {        this.checked = checked;      });    }  }}; 

搭配单元格使用

<van-cell center title="标题">  <van-switch v-model="checked" slot="right-icon" size="24" /></van-cell>

API

Props

参数说明类型默认值
v-model开关选中状态anyfalse
loading是否为加载状态booleanfalse
disabled是否为禁用状态booleanfalse
size v2.2.11开关尺寸,默认单位为pxnumber | string30px
active-color打开时的背景色string#1989fa
inactive-color关闭时的背景色stringwhite
active-value打开时的值anytrue
inactive-value关闭时的值anyfalse

Events

事件名说明回调参数
change开关状态切换回调checked: 是否选中开关
click v2.2.11点击时触发event: Event


实例演示

引入

import Vue from 'vue';import { Uploader } from 'vant';Vue.use(Uploader);

代码演示

基础用法

文件上传完毕后会触发after-read回调函数,获取到对应的file对象

<van-uploader :after-read="afterRead" />
export default {  methods: {    afterRead(file) {      // 此时可以自行将文件上传至服务器      console.log(file);    }  }};

图片预览

通过v-model可以绑定已经上传的图片列表,并展示图片列表的预览图

<van-uploader v-model="fileList" multiple />
export default {  data() {    return {      fileList: [        { url: 'https://img.yzcdn.cn/vant/leaf.jpg' },        // Uploader 根据文件后缀来判断是否为图片文件        // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明        { url: 'https://cloud-image', isImage: true }      ]    }  }};

限制上传数量

通过max-count属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域

<van-uploader  v-model="fileList"  multiple  :max-count="2"/>
export default {  data() {    return {      fileList: []    }  }};

自定义上传样式

通过插槽可以自定义上传区域的样式

<van-uploader>  <van-button icon="photo" type="primary">上传图片</van-button></van-uploader>

上传前校验

通过传入beforeRead函数可以在上传前进行校验,返回true表示校验通过,返回false表示校验失败。支持返回Promise进行异步校验

<van-uploader :before-read="beforeRead" />
import { Toast } from 'vant';export default {  methods: {    // 返回布尔值    beforeRead(file) {      if (file.type !== 'image/jpeg') {        Toast('请上传 jpg 格式图片');        return false;      }      return true;    },    // 返回 Promise    asyncBeforeRead(file) {      return new Promise((resolve, reject) => {        if (file.type !== 'image/jpeg') {          Toast('请上传 jpg 格式图片');          reject();        } else {          resolve();        }      });    }  }}

API

Props

参数说明类型默认值
accept允许上传的文件类型,详细说明stringimage/*
name v2.0.3标识符,可以在回调函数的第二项参数中获取number | string-
preview-size预览图和上传区域的尺寸,默认单位为pxnumber | string80px
preview-image是否在上传完成后展示预览图booleantrue
preview-full-image v2.1.5是否在点击预览图后展示全屏图片预览booleantrue
multiple是否开启图片多选,部分安卓机型不支持booleanfalse
disabled是否禁用文件上传booleanfalse
deletable v2.2.12是否展示删除按钮booleantrue
capture图片选取模式,可选值为camera(直接调起摄像头)string-
after-read文件读取完成后的回调函数Function-
before-read文件读取前的回调函数,返回false可终止文件读取,
支持返回Promise
Function-
before-delete文件删除前的回调函数,返回false可终止文件读取,
支持返回Promise
Function-
max-size文件大小限制,单位为bytenumber | string-
max-count文件上传数量限制number | string-
result-type v2.2.7文件读取结果类型,可选值为file textstringdataUrl
upload-text上传区域文字提示string-
image-fit v2.1.5预览图裁剪模式,可选值见 Image 组件stringcover

Events

事件名说明回调参数
oversize文件大小超过限制时触发after-read
click-preview点击预览图时触发after-read
close-preview关闭全屏图片预览时触发-
delete删除文件预览时触发after-read

Slots

名称说明
default自定义上传区域

回调参数

before-read、after-read、before-delete 执行时会传递以下回调参数:

参数名说明类型
file文件解析后的 file 对象object
detail额外信息,包含 name 和 index 字段object

ResultType 可选值

result-type字段表示文件读取结果的类型,上传大文件时,建议使用 file 类型,避免卡顿。

描述
file结果仅包含 File 对象
text结果包含 File 对象,以及文件的文本内容
dataUrl结果包含 File 对象,以及文件对应的 base64 编码

方法

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

方法名说明参数返回值
closeImagePreview关闭全屏的图片预览--


实例演示

引入

import Vue from 'vue';import { ActionSheet } from 'vant';Vue.use(ActionSheet);

代码演示

基础用法

ActionSheet通过actions数组来定义展示的选项,数组的每一项是一个对象,对象属性见文档下方表格。

<van-action-sheet v-model="show" :actions="actions" @select="onSelect" />
import { Toast } from 'vant';export default {  data() {    return {      show: false,      actions: [        { name: '选项' },        { name: '选项' },        { name: '选项', subname: '描述信息' }      ]    };  },  methods: {    onSelect(item) {      // 默认情况下点击选项时不会自动收起      // 可以通过 close-on-click-action 属性开启自动收起      this.show = false;      Toast(item.name);    }  }}

展示取消按钮

设置cancel-text属性后,会在底部展示取消按钮,点击后关闭当前菜单

<van-action-sheet  v-model="show"  :actions="actions"  cancel-text="取消"  @cancel="onCancel"/>
import { Toast } from 'vant';export default {  data() {    return {      show: false    };  },  methods: {    onCancel() {      this.show = false;      Toast('cancel');    }  }}

展示描述信息

设置description属性后,会在选项上方显示描述信息

<van-action-sheet  v-model="show"  :actions="actions"  description="这是一段描述信息"/>

选项状态

可以将选项设置为加载状态或禁用状态,或者通过color设置选项颜色

<van-action-sheet  v-model="show"  :actions="actions"  cancel-text="取消"  @cancel="onCancel"/>
export default {  data() {    return {      show: false,      actions: [        { name: '选项', color: '#07c160' },        { loading: true },        { name: '禁用选项', disabled: true }      ]    };  }}

自定义面板

通过插槽可以自定义菜单的展示内容,同时可以使用title属性展示标题栏

<van-action-sheet v-model="show" title="标题">  <div class="content">内容</div></van-action-sheet><style>.content {  padding: 16px 16px 160px;}</style>

API

Props

参数说明类型默认值
actions菜单选项Action[][]
title顶部标题string-
cancel-text取消按钮文字string-
description v2.2.8选项上方的描述信息string-
close-icon v2.2.13关闭 图标名称 或图片链接stringcross
duration v2.0.3动画时长,单位秒number | string0.3
round v2.0.9是否显示圆角booleantrue
overlay是否显示遮罩层booleantrue
lock-scroll是否锁定背景滚动booleantrue
lazy-render是否在显示弹层时才渲染节点booleantrue
close-on-click-action是否在点击选项后关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
safe-area-inset-bottom是否开启 底部安全区适配booleantrue
get-container指定挂载的节点,用法示例string | () => Element-

Action 数据结构

actions属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:

键名说明类型
name标题string
subname二级标题string
color选项文字颜色string
className为对应列添加额外的 classany
loading是否为加载状态boolean
disabled是否为禁用状态boolean

Events

事件名说明回调参数
select选中选项时触发,禁用或加载状态下不会触发item: 选项对应的对象, index: 选择对应的索引
cancel取消按钮点击时触发-
click-overlay点击遮罩层时触发-
open打开菜单时触发-
opened打开菜单且动画结束后触发-
close关闭菜单时触发-
closed关闭菜单且动画结束后触发-

常见问题

引入时提示 dependencies not found?

在 1.x 版本中,上拉菜单的组件名为Actionsheet,从 2.0 版本开始更名为ActionSheet,请注意区分。


实例演示

介绍

弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作

弹出框组件支持函数调用和组件调用两种方式

函数调用

Dialog 是一个函数而不是组件,因此可以直接调用,展示对应的提示弹窗

import { Dialog } from 'vant';Dialog({ message: '提示' });

组件调用

通过组件调用 Dialog 时,可以通过下面的方式进行注册

import Vue from 'vue';import { Dialog } from 'vant';// 全局注册Vue.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});

异步关闭

function beforeClose(action, done) {  if (action === 'confirm') {    setTimeout(done, 1000);  } else {    done();  }}Dialog.confirm({  title: '标题',  message: '弹窗内容',  beforeClose});

全局方法

引入 Dialog 组件后,会自动在 Vue 的 prototype 上挂载 $dialog 方法,在所有组件内部都可以直接调用此方法

export default {  mounted() {    this.$dialog.alert({      message: '弹窗内容'    });  }}

组件调用

如果需要在弹窗内嵌入组件或其他自定义内容,可以使用组件调用的方式

<van-dialog v-model="show" title="标题" show-cancel-button>  <img src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow" ></van-dialog>
export default {  data() {    return {      show: false    };  }}

API

方法

方法名说明参数返回值
Dialog展示弹窗optionsPromise
Dialog.alert展示消息提示弹窗optionsPromise
Dialog.confirm展示消息确认弹窗optionsPromise
Dialog.setDefaultOptions修改默认配置,对所有 Dialog 生效optionsvoid
Dialog.resetDefaultOptions重置默认配置,对所有 Dialog 生效-void
Dialog.close关闭弹窗-void

Options

通过函数调用 Dialog 时,支持传入以下选项:

参数说明类型默认值
title标题string-
width v2.2.7弹窗宽度,默认单位为pxnumber | string320px
message文本内容,支持通过 换行string-
messageAlign内容对齐方式,可选值为left rightstringcenter
className自定义类名any-
showConfirmButton是否展示确认按钮booleantrue
showCancelButton是否展示取消按钮booleanfalse
confirmButtonText确认按钮文案string确认
confirmButtonColor确认按钮颜色string#1989fa
cancelButtonText取消按钮文案string取消
cancelButtonColor取消按钮颜色stringblack
overlay是否展示遮罩层booleantrue
overlayClass v2.2.7自定义遮罩层类名string-
overlayStyle v2.2.7自定义遮罩层样式object-
closeOnPopstate v2.0.5是否在页面回退时自动关闭booleanfalse
closeOnClickOverlay是否在点击遮罩层后关闭弹窗booleanfalse
lockScroll是否锁定背景滚动booleantrue
beforeClose关闭前的回调函数,
调用 done() 后关闭弹窗,
调用 done(false) 阻止弹窗关闭
(action, done) => void-
transition v2.2.6动画类名,等价于 transition 的name属性string-
getContainer指定挂载的节点,用法示例string | () => Elementbody

Props

通过组件调用 Dialog 时,支持以下 Props:

参数说明类型默认值
v-model是否显示弹窗boolean-
title标题string-
width v2.2.7弹窗宽度,默认单位为pxnumber | string320px
message文本内容,支持通过 换行string-
message-align内容对齐方式,可选值为left rightstringcenter
show-confirm-button是否展示确认按钮booleantrue
show-cancel-button是否展示取消按钮booleanfalse
confirm-button-text确认按钮文案string确认
confirm-button-color确认按钮颜色string#1989fa
cancel-button-text取消按钮文案string取消
cancel-button-color取消按钮颜色stringblack
overlay是否展示遮罩层booleantrue
overlay-class v2.2.7自定义遮罩层类名string-
overlay-style v2.2.7自定义遮罩层样式object-
close-on-popstate v2.0.5是否在页面回退时自动关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭弹窗booleanfalse
lazy-render是否在显示弹层时才渲染节点booleantrue
lock-scroll是否锁定背景滚动booleantrue
before-close关闭前的回调函数,
调用 done() 后关闭弹窗,
调用 done(false) 阻止弹窗关闭
(action, done) => void-
transition v2.2.6动画类名,等价于 transtion 的name属性string-
get-container指定挂载的节点,用法示例string | () => Element-

Events

通过组件调用 Dialog 时,支持以下事件:

事件说明回调参数
confirm点击确认按钮时触发-
cancel点击取消按钮时触发-
open打开弹窗时触发-
opened打开弹窗且动画结束后触发-
close关闭弹窗时触发-
closed关闭弹窗且动画结束后触发-

Slots

通过组件调用 Dialog 时,支持以下插槽:

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


实例演示

引入

app.jsonindex.json中引入组件,默认为ES6版本,
"usingComponents": {  "van-dropdown-menu": "@vant/weapp/dropdown-menu/index",  "van-dropdown-item": "@vant/weapp/dropdown-item/index"}

代码演示

基础用法

<van-dropdown-menu>  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" /></van-dropdown-menu>
Page({  data: {    option1: [      { text: '全部商品', value: 0 },      { text: '新款商品', value: 1 },      { text: '活动商品', value: 2 },    ],    option2: [      { text: '默认排序', value: 'a' },      { text: '好评排序', value: 'b' },      { text: '销量排序', value: 'c' },    ],    value1: 0,    value2: 'a',  },});

自定义菜单内容

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

<van-dropdown-menu>  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item id="item" title="{{ itemTitle }}">    <van-cell title="{{ switchTitle1 }}">      <van-switch        slot="right-icon"        size="24px"        style="height: 26px"        checked="{{ switch1 }}"        bind:change="onSwitch1Change"      />    </van-cell>    <van-cell title="{{ switchTitle2 }}">      <van-switch        slot="right-icon"        size="24px"        style="height: 26px"        checked="{{ switch2 }}"        bind:change="onSwitch2Change"      />    </van-cell>    <van-button type="info" block bind:click="onConfirm">      确定    </van-button>  </van-dropdown-item></van-dropdown-menu>
Page({  data: {    switchTitle1: '包邮',    switchTitle2: '团购',    itemTitle: '筛选',    option1: [      { text: '全部商品', value: 0 },      { text: '新款商品', value: 1 },      { text: '活动商品', value: 2 },    ],    value1: 0,  },  onConfirm() {    this.selectComponent('#item').toggle();  },  onSwitch1Change({ detail }) {    this.setData({ switch1: detail });  },  onSwitch2Change({ detail }) {    this.setData({ switch2: detail });  },});

自定义选中态颜色

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

<van-dropdown-menu active-color="#ee0a24">  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" /></van-dropdown-menu>

向上展开

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

<van-dropdown-menu direction="up">  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" /></van-dropdown-menu>

禁用菜单

<van-dropdown-menu>  <van-dropdown-item value="{{ value1 }}" disabled options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" disabled options="{{ option2 }}" /></van-dropdown-menu>

API

DropdownMenu Props

参数说明类型默认值
active-color菜单标题和选项的选中态颜色string#1989fa
direction v2.0.1菜单展开方向,可选值为upstringdown
z-index菜单栏 z-index 层级number | string10
duration动画时长,单位秒number | string0.2
overlay是否显示遮罩层booleantrue
close-on-click-overlay是否在点击遮罩层后关闭菜单booleantrue
close-on-click-outside v2.0.7是否在点击外部元素后关闭菜单booleantrue

DropdownItem Props

参数说明类型默认值
value当前选中项对应的 value,可以通过v-model双向绑定number | string-
title菜单项标题string当前选中项文字
options选项数组Option[][]
disabled是否禁用菜单booleanfalse
title-class标题额外类名string-
get-container v2.2.4指定挂载的节点,用法示例string | () => Element-

DropdownItem Events

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

DropdownItem Slots

名称说明
default菜单内容
title自定义标题,不支持动态渲染

DropdownItem 方法

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

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

Option 数据结构

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


实例演示

引入

import Vue from 'vue';import { Loading } from 'vant';Vue.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>

API

Props

参数说明类型默认值
color颜色string#c9c9c9
type类型,可选值为 spinnerstringcircular
size加载图标大小,默认单位为pxnumber | string30px
text-size文字大小,默认单位为pxnumber | string14px
vertical是否垂直排列图标和文字内容booleanfalse

Slots

名称说明
default加载文案


实例演示

引入

import Vue from 'vue';import { Notify } from 'vant';Vue.use(Notify);

代码演示

基础用法

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});

组件内调用

引入 Notify 组件后,会自动在 Vue 的 prototype 上挂载 $notify 方法,便于在组件内调用。

export default {  mounted() {    this.$notify('提示文案');  }}

API

方法

方法名说明参数返回值
Notify展示提示options | messagenotify 实例
Notify.clear关闭提示-void
Notify.setDefaultOptions修改默认配置,对所有 Notify 生效optionsvoid
Notify.resetDefaultOptions重置默认配置,对所有 Notify 生效-void

Options

参数说明类型默认值
type v2.1.6类型,可选值为 primary success warningstringdanger
message展示文案,支持通过 换行string-
duration展示时长(ms),值为 0 时,notify 不会消失number | string3000
color字体颜色stringwhite
background背景颜色string-
className自定义类名any-
onClick点击时的回调函数Function-
onOpened完全展示后的回调函数Function-
onClose关闭时的回调函数Function-


实例演示

介绍

创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作

引入

import Vue from 'vue';import { Overlay } from 'vant';Vue.use(Overlay);

代码演示

基础用法

<van-button type="primary" text="显示遮罩层" @click="show = true" /><van-overlay :show="show" @click="show = false" />
export default {  data() {    return {      show: false    }  }},

嵌入内容

通过默认插槽可以在遮罩层上嵌入任意内容

<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动画时长,单位秒number | string0.3
class-name自定义类名string-
custom-style v2.2.5自定义样式object-

Events

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

Slots

名称说明
default v2.0.5默认插槽,用于在遮罩层上方嵌入内容


实例演示

引入

import Vue from 'vue';import { PullRefresh } from 'vant';Vue.use(PullRefresh);

代码演示

基础用法

下拉刷新时会触发 refresh 事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将 v-model 设置为 false,表示加载完成。

<van-pull-refresh v-model="isLoading" @refresh="onRefresh">  <p>刷新次数: {{ count }}</p></van-pull-refresh>
import { Toast } from 'vant';export default {  data() {    return {      count: 0,      isLoading: false    }  },  methods: {    onRefresh() {      setTimeout(() => {        Toast('刷新成功');        this.isLoading = false;        this.count++;      }, 1000);    }  }}

成功提示

通过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 实现一个缩放效果 -->  <img    class="doge"    slot="pulling"    slot-scope="props"    src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"     :style="{ transform: `scale(${props.distance / 80})` }"  >  <!-- 释放提示 -->  <img    class="doge"    slot="loosing"    src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"   >  <!-- 加载提示 -->  <img    class="doge"    slot="loading"    src="https://img.yzcdn.cn/vant/doge-fire.jpg" rel="external nofollow"   >  <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 v2.4.2顶部内容高度number | string50
disabled是否禁用下拉刷新booleanfalse

Events

事件名说明回调参数
refresh下拉刷新时触发-

Slots

名称说明SlotProps
default自定义内容-
normal非下拉状态时顶部内容-
pulling下拉过程中顶部内容{ distance: 当前下拉距离 }
loosing释放过程中顶部内容{ distance: 当前下拉距离 }
loading加载过程中顶部内容{ distance: 当前下拉距离 }
success刷新成功提示内容-

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { SwipeCell } from 'vant';Vue.use(SwipeCell);

代码演示

基础用法

SwipeCell组件提供了left和right两个插槽,用于定义两侧滑动区域的内容

<van-swipe-cell>  <template slot="left">    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template slot="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"  />  <van-button    slot="right"    square    text="删除"    type="danger"    class="delete-button"  /></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 slot="left">    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template slot="right">    <van-button square type="danger" text="删除" />  </template></van-swipe-cell>
export default {  methods: {    // position 为关闭时点击的位置    // instance 为对应的 SwipeCell 实例    beforeClose({ position, instance }) {      switch (position) {        case 'left':        case 'cell':        case 'outside':          instance.close();          break;        case 'right':          Dialog.confirm({            message: '确定删除吗?'          }).then(() => {            instance.close();          });          break;      }    }  }}

API

Props

参数说明类型默认值
name v2.0.4标识符,可以在事件参数中获取到number | string-
left-width指定左侧滑动区域宽度,单位为pxnumber | stringauto
right-width指定右侧滑动区域宽度,单位为pxnumber | stringauto
before-close v2.3.0关闭前的回调函数Function-
disabled是否禁用滑动booleanfalse
stop-propagation v2.1.0是否阻止滑动事件冒泡booleanfalse

Slots

名称说明
default自定义显示内容
left左侧滑动内容
right右侧滑动内容

Events

事件名说明回调参数
click点击时触发关闭时的点击位置 (left right cell outside)
open打开时触发{ position: 'left' | 'right' , name: string }
close关闭时触发{ position: string , name: string }

beforeClose 参数

beforeClose 的第一个参数为对象,对象中包含以下属性:

参数名说明类型
name标识符string
position关闭时的点击位置 (left right cell outside)string
instanceSwipeCell 实例,用于调用实例方法SwipeCell

方法

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

方法名说明参数返回值
open打开单元格侧边栏position: left | right-
close收起单元格侧边栏--

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { Toast } from 'vant';Vue.use(Toast);

代码演示

文字提示

Toast('提示内容');

加载提示

使用Toast.loading方法展示加载提示,通过forbidClick属性可以禁用背景点击,通过loadingType属性可以自定义加载图标类型。

Toast.loading({  message: '加载中...',  forbidClick: true});// 自定义加载图标Toast.loading({  message: '加载中...',  forbidClick: true,  loadingType: 'spinner'});

成功/失败提示

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

自定义图标

Toast({  message: '自定义图标',  icon: 'like-o'});Toast({  message: '展示图片',  icon: 'https://img.yzcdn.cn/vant/logo.png'});

动态更新提示

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

组件内调用

引入 Toast 组件后,会自动在 Vue 的 prototype 上挂载 $toast 方法,便于在组件内调用。

export default {  mounted() {    this.$toast('提示文案');  }}

单例模式

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

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

修改默认配置

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

// 将所有 Toast 的展示时长设置为 2000 毫秒Toast.setDefaultOptions({ duration: 2000 });// 将所有 loading Toast 设置为背景不可点击 (2.2.10 版本开始支持)Toast.setDefaultOptions('loading', { forbidClick: true });// 重置所有 Toast 的默认配置Toast.resetDefaultOptions();// 重置 loading Toast 的默认配置 (2.2.10 版本开始支持)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 v2.0.1自定义图标,支持传入 图标名称 或图片链接string-
iconPrefix v2.0.9图标类名前缀stringvan-icon
overlay v2.2.13是否显示背景遮罩层booleanfalse
forbidClick是否禁止背景点击booleanfalse
closeOnClick v2.1.5是否在点击后关闭booleanfalse
closeOnClickOverlay v2.2.13是否在点击遮罩层后关闭booleanfalse
loadingType加载图标类型, 可选值为 spinnerstringcircular
duration展示时长(ms),值为 0 时,toast 不会消失number2000
className自定义类名any-
onOpened完全展示后的回调函数Function-
onClose关闭时的回调函数Function-
transition v2.2.6动画类名,等价于 transtion 的name属性stringvan-fade
getContainer指定挂载的节点,用法示例string | () => Elementbody


实例演示

引入

import Vue from 'vue';import { Circle } from 'vant';Vue.use(Circle);

代码演示

基础用法

rate属性表示进度条的目标进度,v-model表示动画过程中的实时进度。当rate发生变化时,v-model会以speed的速度变化,直至达到rate设定的值。

<van-circle  v-model="currentRate"  :rate="30"  :speed="100"  :text="text"/>
export default {  data() {    return {      currentRate: 0    };  },  computed: {    text() {      return this.currentRate.toFixed(0) + '%'    }  }};

宽度定制

通过stroke-width属性来控制进度条宽度

<van-circle  v-model="currentRate"  :rate="rate"  :stroke-width="60"  text="宽度定制"/>

颜色定制

通过color属性来控制进度条颜色,layer-color属性来控制轨道颜色

<van-circle  v-model="currentRate"  :rate="rate"  layer-color="#ebedf0"  text="颜色定制"/>

渐变色

color属性支持传入对象格式来定义渐变色

<van-circle  v-model="currentRate"  :rate="rate"  :color="gradientColor"  text="渐变色"/>
export default {  data() {    return {      currentRate: 0,      gradientColor: {        '0%': '#3fecff',        '100%': '#6149f6'      }    };  }};

逆时针方向

将clockwise设置为false,进度会从逆时针方向开始

<van-circle  v-model="currentRate"  :rate="rate"  :clockwise="false"  text="逆时针方向"/>

大小定制

通过size属性设置圆环直径

<van-circle  v-model="currentRate"  :rate="rate"  size="120px"  text="大小定制"/>

API

Props

参数说明类型默认值
v-model当前进度number-
rate目标进度number | string100
size圆环直径,默认单位为 pxnumber | string100px
color v2.1.4进度条颜色,传入对象格式可以定义渐变色string | object#1989fa
layer-color轨道颜色stringwhite
fill填充颜色stringnone
speed动画速度(单位为 rate/s)number | string0
text文字string-
stroke-width进度条宽度number | string40
stroke-linecap v2.2.15进度条端点的形状,可选值为sqaure buttstringround
clockwise是否顺时针增加booleantrue

Slots

名称说明
default自定义文字内容


实例演示

引入

import Vue from 'vue';import { Collapse, CollapseItem } from 'vant';Vue.use(Collapse);Vue.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" disabled>内容</van-collapse-item></van-collapse>
export default {  data() {    return {      activeNames: ['1']    };  }};

手风琴

通过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>
export default {  data() {    return {      activeName: '1'    };  }};

自定义标题内容

<van-collapse v-model="activeNames">  <van-collapse-item name="1">    <div slot="title">标题1 <van-icon name="question-o" /></div>    内容  </van-collapse-item>  <van-collapse-item title="标题2" name="2" icon="shop-o">    内容  </van-collapse-item></van-collapse>
export default {  data() {    return {      activeNames: ['1']    };  }};

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
title-class左侧标题额外类名string-
value-class右侧内容额外类名string-
label-class描述信息额外类名string-

CollapseItem Slots

名称说明
default面板内容
value自定义显示内容
icon自定义icon
title自定义title
right-icon自定义右侧按钮,默认是arrow


实例演示

引入

import Vue from 'vue';import { CountDown } from 'vant';Vue.use(CountDown);

代码演示

基本用法

time属性表示倒计时总时长,单位为毫秒

<van-count-down :time="time" />
export default {  data() {    return {      time: 30 * 60 * 60 * 1000    };  }}

自定义格式

通过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 v-slot="timeData">    <span class="item">{{ timeData.hours }}</span>    <span class="item">{{ timeData.minutes }}</span>    <span class="item">{{ timeData.seconds }}</span>  </template></van-count-down><style>.item {  display: inline-block;  width: 22px;  margin-right: 5px;  color: #fff;  font-size: 12px;  text-align: center;  background-color: #1989fa;}</style>

手动控制

通过 ref 获取到组件实例后,可以调用start、pause、reset方法

<van-count-down  ref="countDown"  millisecond  :time="3000"  :auto-start="false"  format="ss:SSS"  @finish="finish"/><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 {  methods: {    start() {      this.$refs.countDown.start();    },    pause() {      this.$refs.countDown.pause();    },    reset() {      this.$refs.countDown.reset();    },    finish() {      Toast('倒计时结束');    }  }}

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 v2.4.4倒计时变化时触发timeData

Slots

名称说明SlotProps
default自定义内容timeData

timeData 格式

名称说明类型
days剩余天数number
hours剩余小时number
minutes剩余分钟number
seconds剩余秒数number
milliseconds剩余毫秒number

方法

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

方法名说明参数返回值
start开始倒计时--
pause暂停倒计时--
reset重设倒计时,若auto-starttrue,重设后会自动开始倒计时--

常见问题

在 iOS 系统上倒计时不生效?

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

对此问题的详细解释:stackoverflow


实例演示

引入

import Vue from 'vue';import { Divider } from 'vant';Vue.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内容


实例演示

引入

ImagePreview和其他组件不同,不是通过HTML结构的方式来使用,而是通过函数调用的方式。使用前需要先引入它。

import Vue from 'vue';import { ImagePreview } from 'vant';Vue.use(ImagePreview);

代码演示

基础用法

直接传入图片数组,即可展示图片预览

ImagePreview([  'https://img.yzcdn.cn/1.jpg',  'https://img.yzcdn.cn/2.jpg']);

传入配置项

通过传入配置对象,可以指定初始图片的位置、监听关闭事件

ImagePreview({  images: [    'https://img.yzcdn.cn/1.jpg',    'https://img.yzcdn.cn/2.jpg'  ],  startPosition: 1,  onClose() {    // do something  }});

异步关闭

通过asyncClose属性可以开启异步关闭,开启后异步关闭后,只能通过实例上的 close 方法关闭图片预览

const instance = ImagePreview({  images: [    'https://img.yzcdn.cn/1.jpg',    'https://img.yzcdn.cn/2.jpg'  ],  asyncClose: true});setTimeout(() => {  instance.close();}, 1000);

组件调用

如果需要在图片预览内嵌入组件或其他自定义内容,可以使用组件调用的方式,调用前需要通过 Vue.use 注册组件

<van-image-preview v-model="show" :images="images" @change="onChange">  <template v-slot:index>第{{ index }}页</template></van-image-preview>
export default {  data() {    return {      show: false,      index: 0,      images: [        'https://img.yzcdn.cn/1.jpg',        'https://img.yzcdn.cn/2.jpg'      ]    };  },  methods: {    onChange(index) {      this.index = index;    }  }}

API

Options

通过函数调用 ImagePreview 时,支持传入以下选项:

参数名说明类型默认值
images需要预览的图片 URL 数组string[][]
startPosition图片预览起始位置索引number | string0
swipeDuration动画时长,单位为msnumber | string500
showIndex是否显示页码booleantrue
showIndicators是否显示轮播指示器booleanfalse
loop是否开启循环播放booleantrue
onClose关闭时的回调函数Function-
onChange v2.0.3切换图片时的回调函数,回调参数为当前索引Function-
asyncClose是否开启异步关闭booleanfalse
closeOnPopstate是否在页面回退时自动关闭booleanfalse
className自定义类名any-
lazyLoad是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
maxZoom手势缩放时,最大缩放比例number | string3
minZoom手势缩放时,最小缩放比例number | string1/3

Props

通过组件调用 ImagePreview 时,支持以下 Props:

参数说明类型默认值
images需要预览的图片 URL 数组string[][]
start-position图片预览起始位置索引number | string0
swipe-duration动画时长,单位为 msnumber | string500
show-index是否显示页码booleantrue
show-indicators是否显示轮播指示器booleanfalse
loop是否开启循环播放booleantrue
async-close是否开启异步关闭booleanfalse
close-on-popstate是否在页面回退时自动关闭booleanfalse
class-name自定义类名any-
lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
max-zoom手势缩放时,最大缩放比例number | string3
min-zoom手势缩放时,最小缩放比例number | string1/3

Events

通过组件调用 ImagePreview 时,支持以下事件:

事件说明回调参数
close关闭时触发{ index: 索引, url: 图片链接 }
change切换当前图片时触发index, 当前图片的索引

Slots

通过组件调用 ImagePreview 时,支持以下插槽:

名称说明
index自定义页码内容
cover自定义覆盖在图片预览上方的内容

onClose 回调参数

参数名说明类型
url当前图片 URLstring
index当前图片的索引值number

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

Lazyload​ 是 Vue 指令,使用前需要对指令进行注册

import Vue from 'vue';import { Lazyload } from 'vant';Vue.use(Lazyload);// 注册时可以配置额外的选项Vue.use(Lazyload, {  lazyComponent: true});

代码演示

基础用法

将​v-lazy​指令的值设置为你需要懒加载的图片

<img v-for = "img in imageList" v-lazy = "img" >
export default {  data() {    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`选项Vue.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 官方文档


实例演示

介绍

瀑布流滚动加载,用于展示长列表,当列表即将滚动到底部时,会触发事件并加载更多列表项。

引入

import Vue from 'vue';import { List } from 'vant';Vue.use(List);

代码演示

基础用法

List 组件通过loading和finished两个变量控制加载状态,当组件滚动到底部时,会触发load事件并将loading设置成true。此时可以发起异步操作并更新数据,数据更新完毕后,将loading设置成false即可。若数据已全部加载完毕,则直接将finished设置成true即可。

<van-list  v-model="loading"  :finished="finished"  finished-text="没有更多了"  @load="onLoad">  <van-cell v-for="item in list" :key="item" :title="item" /></van-list>
export default {  data() {    return {      list: [],      loading: false,      finished: false    };  },  methods: {    onLoad() {      // 异步更新数据      // setTimeout 仅做示例,真实场景中一般为 ajax 请求      setTimeout(() => {        for (let i = 0; i < 10; i++) {          this.list.push(this.list.length + 1);        }        // 加载状态结束        this.loading = false;        // 数据全部加载完成        if (this.list.length >= 40) {          this.finished = true;        }      }, 1000);    }  }}

错误提示

若列表数据加载失败,将error设置成true即可显示错误提示,用户点击错误提示后会重新触发 load 事件。

<van-list  v-model="loading"  :error.sync="error"  error-text="请求失败,点击重新加载"  @load="onLoad">  <van-cell v-for="item in list" :key="item" :title="item" /></van-list>
export default {  data() {    return {      list: [],      error: false,      loading: false    };  },  methods: {    onLoad() {      fetchSomeThing().catch(() => {        this.error = true;      })    }  }}

下拉刷新

List 组件可以与 PullRefresh 组件结合使用,实现下拉刷新的效果

<van-pull-refresh v-model="refreshing" @refresh="onRefresh">  <van-list    v-model="loading"    :finished="finished"    finished-text="没有更多了"    @load="onLoad"  >    <van-cell v-for="item in list" :key="item" :title="item" />  </van-list></van-pull-refresh>
export default {  data() {    return {      list: [],      loading: false,      finished: false,      refreshing: false    };  },  methods: {    onLoad() {      setTimeout(() => {        if (this.refreshing) {          this.list = [];          this.refreshing = false;        }        for (let i = 0; i < 10; i++) {          this.list.push(this.list.length + 1);        }        this.loading = false;        if (this.list.length >= 40) {          this.finished = true;        }      }, 1000);    },    onRefresh() {      // 清空列表数据      this.finished = false;      // 重新加载数据      // 将 loading 设置为 true,表示处于加载状态      this.loading = true;      this.onLoad();    }  }}

API

Props

参数说明类型默认值
v-model是否处于加载状态,加载过程中不触发load事件booleanfalse
finished是否已加载完成,加载完成后不再触发load事件booleanfalse
error是否加载失败,加载失败后点击错误提示可以重新
触发load事件,必须使用sync修饰符
booleanfalse
offset滚动条与底部距离小于 offset 时触发load事件number | string300
loading-text加载过程中的提示文案string加载中...
finished-text加载完成后的提示文案string-
error-text加载失败后的提示文案string-
immediate-check是否在初始化时立即执行滚动位置检查booleantrue
direction滚动触发加载的方向,可选值为upstringdown

Events

事件名说明回调参数
load滚动条与底部距离小于 offset 时触发-

方法

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

方法名说明参数返回值
check检查当前的滚动位置,若已滚动至底部,则会触发 load 事件--

Slots

名称说明
default列表内容
loading自定义底部加载中提示
finished自定义加载完成后的提示文案
error自定义加载失败后的提示文案

常见问题

List 的运行机制是什么?

List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List 会触发一次 load 事件。

为什么 List 初始化后会立即触发 load 事件?

List 初始化后会触发一次 load 事件,用于加载第一屏的数据,这个特性可以通过immediate-check属性关闭。

为什么会连续触发 load 事件?

如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load 事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。

loading 和 finished 分别是什么含义?

List有以下三种状态,理解这些状态有助于你正确地使用List组件:

  • 非加载中,loading为false,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
  • 加载中,loading为true,表示正在发送异步请求,此时不会触发load事件
  • 加载完成,finished为true,此时不会触发load事件

在每次请求完毕后,需要手动将loading设置为false,表示加载结束

使用 float 布局后一直触发加载?

若 List 的内容使用了 float 布局,可以在容器上添加van-clearfix类名来清除浮动,使得 List 能正确判断元素位置

<van-list>  <div class="van-clearfix">    <div class="float-item" />    <div class="float-item" />    <div class="float-item" />  </div></van-list>

在 html、body 上设置 overflow 后一直触发加载?

如果在 html 和 body 标签上设置了overflow-x: hidden样式,会导致 List 一直触发加载。

html,body {  overflow-x: hidden;}

这个问题的原因是当元素设置了overflow-x: hidden样式时,该元素的overflow-y会被浏览器设置为auto,而不是默认值visible,导致 List 无法正确地判断滚动容器。解决方法是去除该样式,或者在 html 和 body 标签上添加height: 100%样式。


实例演示

引入

import Vue from 'vue';import { NoticeBar } from 'vant';Vue.use(NoticeBar);

代码演示

基础用法

<van-notice-bar text="通知内容" left-icon="volume-o" />

禁用滚动

文字内容多于一行时,可通过scrollable参数控制是否开启滚动

<van-notice-bar :scrollable="false">  通知内容</van-notice-bar>

多行展示

禁用滚动时,可以设置wrapable来开启多行展示

<van-notice-bar wrapable :scrollable="false">  通知内容</van-notice-bar>

通知栏模式

默认模式为空,支持closeable和link两种模式

<!-- closeable 模式,在右侧显示关闭按钮 --><van-notice-bar mode="closeable">  通知内容</van-notice-bar><!-- link 模式,在右侧显示链接箭头 --><van-notice-bar mode="link">  通知内容</van-notice-bar>

自定义样式

<van-notice-bar  color="#1989fa"  background="#ecf9ff"  left-icon="info-o">  通知内容</van-notice-bar>

API

Props

参数说明类型默认值
mode通知栏模式,可选值为 closeable linkstring''
text通知文本内容string''
color文本颜色string#f60
background滚动条背景string#fff7cc
left-icon左侧 图标名称 或图片链接string-
delay动画延迟时间 (s)number | string1
speed滚动速率 (px/s)number | string50
scrollable是否在长度溢出时滚动播放booleantrue
wrapable是否开启文本换行,只在禁用滚动时生效booleanfalse

Events

事件名说明回调参数
click点击通知栏时触发event: Event
close关闭通知栏时触发event: Event

Slots

名称内容
default通知文本内容
left-icon自定义左侧图标
right-icon自定义右侧图标


实例演示

引入

import Vue from 'vue';import { Panel } from 'vant';Vue.use(Panel);

代码演示

基础用法

面板只是一个容器,里面可以放入自定义的内容

<van-panel title="标题" desc="描述信息" status="状态">  <div>内容</div></van-panel>

高级用法

使用slot自定义内容

<van-panel title="标题" desc="描述信息" status="状态">  <div>内容</div>  <div slot="footer">    <van-button size="small">按钮</van-button>    <van-button size="small" type="danger">按钮</van-button>  </div></van-panel>

API

Props

参数说明类型默认值
title标题string-
desc描述string-
status状态string-
icon标题左侧 图标名称 或图片链接string-

Slots

名称说明
default自定义内容
header自定义 header
footer自定义 footer


实例演示

引入

import Vue from 'vue';import { Progress } from 'vant';Vue.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 v2.2.1进度条粗细,默认单位为pxnumber | string4px
color进度条颜色string#1989fa
track-color v2.2.9轨道颜色string#e5e5e5
pivot-text进度文字内容string百分比
pivot-color进度文字背景色string同进度条颜色
text-color进度文字颜色stringwhite
inactive是否置灰booleanfalse
show-pivot是否显示进度文字booleantrue


实例演示

引入

import Vue from 'vue';import { Skeleton } from 'vant';Vue.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>
export default {  data() {    return {      loading: true    }  },  mounted() {    this.loading = false;  }};

API

Props

参数说明类型默认值
row段落占位图行数number | string0
row-width段落占位图宽度,可传数组来设置每一行的宽度number | string |
(number | string)[]
100%
title是否显示标题占位图booleanfalse
avatar是否显示头像占位图booleanfalse
loading是否显示骨架屏,传false时会展示子组件内容booleantrue
animate是否开启动画booleantrue
title-width标题占位图宽度number | string40%
avatar-size头像占位图大小number | string32px
avatar-shape头像占位图形状,可选值为squarestringround


实例演示

引入

import Vue from 'vue';import { Step, Steps } from 'vant';Vue.use(Step);Vue.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>
export default {  data() {    return {      active: 1    };  }}

自定义样式

可以通过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-color激活状态颜色string#07c160
active-icon激活状态底部图标,可选值见 Icon 组件stringchecked
inactive-icon未激活状态底部图标,可选值见 Icon 组件string-

Step Slots

名称说明
active-icon自定义激活状态图标
inactive-icon自定义未激活状态图标


实例演示

介绍

Sticky 组件与 CSS 中position: sticky属性实现的效果一致,当组件在屏幕范围内时,会按照正常的布局排列,当组件滚出屏幕范围时,始终会固定在屏幕顶部。

引入

import Vue from 'vue';import { Sticky } from 'vant';Vue.use(Sticky);

代码演示

基础用法

将内容包裹在Sticky组件内即可

<van-sticky>  <van-button type="primary">基础用法</van-button></van-sticky>

吸顶距离

通过offset-top属性可以设置组件在吸顶时与顶部的距离

<van-sticky :offset-top="50">  <van-button type="info">吸顶距离</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 {  data() {    return {      container: null    };  },  mounted() {    this.container = this.$refs.container;  }};

API

Props

参数说明类型默认值
offset-top吸顶时与顶部的距离,单位pxnumber | string0
z-index吸顶时的 z-indexnumber | string99
container容器对应的 HTML 节点Element-

Events

事件名说明回调参数
scroll滚动时触发{ scrollTop: 距离顶部位置, isFixed: 是否吸顶 }


实例演示

引入

import Vue from 'vue';import { Swipe, SwipeItem } from 'vant';Vue.use(Swipe);Vue.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 中含有图片时,可以配合 Lazyload 组件实现图片懒加载

<van-swipe :autoplay="3000">  <van-swipe-item v-for="(image, index) in images" :key="index">    <img v-lazy="image" />  </van-swipe-item></van-swipe>
import Vue from 'vue';import { Lazyload } from 'vant';Vue.use(Lazyload);export default {  data() {    return {      images: [        'https://img.yzcdn.cn/vant/apple-1.jpg',        'https://img.yzcdn.cn/vant/apple-2.jpg'      ]    }  }}

监听 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 {  methods: {    onChange(index) {      Toast('当前 Swipe 索引:' + index);    }  }}

纵向滚动

设置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 @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>  <div class="custom-indicator" slot="indicator">    {{ current + 1 }}/4  </div></van-swipe>
export default {  data() {    return {      current: 0    }  },  methods: {    onChange(index) {      this.current = index;    }  }}

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 v2.2.13是否阻止滑动事件冒泡booleantrue
indicator-color指示器颜色string#1989fa

Swipe Events

事件名说明回调参数
change每一页轮播结束后触发index, 当前页的索引

SwipeItem Events

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

Swipe 方法

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

方法名说明参数返回值
prev v2.4.2切换到上一轮播--
next v2.4.2切换到下一轮播--
swipeTo切换到指定位置index: number, options: Optionsvoid
resize v2.2.14外层元素大小变化后,可以调用此方法来触发重绘-void

swipeTo Options 格式

名称说明类型
immediate是否跳过动画boolean

Swipe Slots

名称说明
default轮播内容
indicator自定义指示器

常见问题

滑动轮播时为什么触发了 click 事件?

这种情况通常是由于项目中引入了fastclick库导致的。fastclick的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。

将 Swipe 组件的 stop-propagation 属性设置为 false 即可避免该问题。

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { Tag } from 'vant';Vue.use(Tag);

代码演示

基础用法

通过type属性控制标签颜色,默认为灰色

<van-tag>标签</van-tag><van-tag type="primary">标签</van-tag><van-tag type="success">标签</van-tag><van-tag type="danger">标签</van-tag><van-tag type="warning">标签</van-tag>

圆角样式

通过round设置为圆角样式

<van-tag round>标签</van-tag><van-tag round type="primary">标签</van-tag><van-tag round type="success">标签</van-tag><van-tag round type="danger">标签</van-tag><van-tag round type="warning">标签</van-tag>

标记样式

通过mark设置为标记样式(半圆角)

<van-tag mark>标签</van-tag><van-tag mark type="primary">标签</van-tag><van-tag mark type="success">标签</van-tag><van-tag mark type="danger">标签</van-tag><van-tag mark type="warning">标签</van-tag>

空心样式

设置plain属性设置为空心样式

<van-tag plain>标签</van-tag><van-tag plain type="primary">标签</van-tag><van-tag plain type="success">标签</van-tag><van-tag plain type="danger">标签</van-tag><van-tag plain type="warning">标签</van-tag>

自定义颜色

<van-tag color="#f2826a">标签</van-tag><van-tag color="#f2826a" plain>标签</van-tag><van-tag color="#7232dd">标签</van-tag><van-tag color="#7232dd" plain>标签</van-tag><van-tag color="#ffe1e1" text-color="#ad0000">标签</van-tag>

标签大小

<van-tag type="danger">标签</van-tag><van-tag type="danger" size="medium">标签</van-tag><van-tag type="danger" size="large">标签</van-tag>

可关闭标签

添加closeable属性表示标签是可关闭的,关闭标签时会触发close事件,在close事件中可以执行隐藏标签的逻辑

<van-tag  v-if="show.primary"  closeable  size="medium"  type="primary"  @close="close('primary')">  标签</van-tag><van-tag  v-if="show.success"  closeable  size="medium"  type="success"  @close="close('success')">  标签</van-tag>
export default {  data() {    return {      show: {        primary: true,        success: true      }    }  },  methods: {    close(type) {      this.show[type] = false;    }  }}

API

Props

参数说明类型默认值
type类型,可选值为primary success danger warningstringdefault
size大小, 可选值为large mediumstring-
color标签颜色string-
plain是否为空心样式booleanfalse
round是否为圆角样式booleanfalse
mark是否为标记样式booleanfalse
text-color文本颜色,优先级高于color属性stringwhite
closeable v2.2.9是否为可关闭标签booleanfalse

Slots

名称说明
default标签显示内容

Events

事件名说明回调参数
click点击时触发event: Event
close关闭标签时触发-


实例演示

介绍

宫格可以在水平方向上把页面分隔成等宽度的区块,用于展示内容或进行页面导航

引入

import Vue from 'vue';import { Grid, GridItem } from 'vant';Vue.use(Grid);Vue.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>

页面导航

通过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属性后,会在图标右上角展示一个小红点。设置info属性后,会在图标右上角展示相应的徽标

<van-grid :column-num="2">  <van-grid-item icon="home-o" text="文字" dot />  <van-grid-item icon="search" text="文字" info="99+" /></van-grid>

API

Grid Props

参数说明类型默认值
column-num v2.0.4列数number | string4
icon-size v2.2.6图标大小,默认单位为pxnumber | string28px
gutter格子之间的间距,默认单位为pxnumber | string0
border是否显示边框booleantrue
center是否将格子内容居中显示booleantrue
square是否将格子固定为正方形booleanfalse
clickable是否开启格子点击反馈booleanfalse

GridItem Props

参数说明类型默认值
text文字string-
icon图标名称 或图片链接string-
dot v2.2.1是否显示图标右上角小红点booleanfalse
info v2.2.1图标右上角徽标的内容number | string-
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

GridItem Events

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

GridItem Slots

名称说明
default自定义宫格的所有内容
icon自定义图标
text自定义文字


实例演示

引入

import Vue from 'vue';import { IndexBar, IndexAnchor } from 'vant';Vue.use(IndexBar);Vue.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 {  data() {    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 v2.0.7锚点自动吸顶时与顶部的距离number0
highlight-color索引字符高亮颜色string#07c160

IndexAnchor Props

参数说明类型默认值
index索引字符number | string-

IndexBar Events

事件名说明回调参数
select选中字符时触发index: 索引字符

IndexAnchor Slots

名称说明
default锚点位置显示内容,默认为索引字符


实例演示

引入

import Vue from 'vue';import { NavBar } from 'vant';Vue.use(NavBar);

代码演示

基础用法

<van-nav-bar  title="标题"  left-text="返回"  right-text="按钮"  left-arrow  @click-left="onClickLeft"  @click-right="onClickRight"/>
import { Toast } from 'vant';export default {  methods: {    onClickLeft() {      Toast('返回');    },    onClickRight() {      Toast('按钮');    }  }}

高级用法

通过插槽定制内容

<van-nav-bar title="标题" left-text="返回" left-arrow>  <van-icon name="search" slot="right" /></van-nav-bar>

API

Props

参数说明类型默认值
title标题string''
left-text左侧文案string''
right-text右侧文案string''
left-arrow是否显示左侧箭头booleanfalse
fixed是否固定在顶部booleanfalse
border是否显示下边框booleantrue
z-index元素 z-indexnumber | string1

Slots

名称说明
title自定义标题
left自定义左侧区域内容
right自定义右侧区域内容

Events

事件名说明回调参数
click-left点击左侧按钮时触发-
click-right点击右侧按钮时触发-


实例演示

引入

import Vue from 'vue';import { Pagination } from 'vant';Vue.use(Pagination);

代码演示

基础用法

<van-pagination   v-model="currentPage"   :total-items="24"   :items-per-page="5"/>
export default {  data() {    return  {      currentPage: 1    }  }}

简单模式

<van-pagination   v-model="currentPage"   :page-count="12"  mode="simple" />

显示省略号

<van-pagination   v-model="currentPage"   :total-items="125"   :show-page-size="3"   force-ellipses/>

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页码改变时触发-


实例演示

引入

import Vue from 'vue';import { Sidebar, SidebarItem } from 'vant';Vue.use(Sidebar);Vue.use(SidebarItem);

代码演示

基础用法

通过v-model绑定当前选中项的索引

<van-sidebar v-model="activeKey">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" /></van-sidebar>
export default {  data() {    return {      activeKey: 0    };  }};

提示信息

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

<van-sidebar v-model="activeKey">  <van-sidebar-item title="标签名称" dot />  <van-sidebar-item title="标签名称" info="5" />  <van-sidebar-item title="标签名称" info="99+" /></van-sidebar>

禁用选项

通过disabled属性禁用选项

<van-sidebar v-model="activeKey">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" disabled />  <van-sidebar-item title="标签名称" /></van-sidebar>

监听切换事件

设置change方法来监听切换导航项时的事件

<van-sidebar v-model="activeKey" @change="onChange">  <van-sidebar-item title="标签名1" />  <van-sidebar-item title="标签名2" />  <van-sidebar-item title="标签名3" /></van-sidebar>
import { Notify } from 'vant';export default {  data() {    return {      activeKey: 0    };  },  methods: {    onChange(index) {      Notify({ type: 'primary', message: index });    }  }}

API

Sidebar Props

参数说明类型默认值
v-model v2.0.4当前导航项的索引number | string0

Sidebar Events

事件名说明回调参数
change切换导航项时触发index: 当前导航项的索引

SidebarItem Props

参数说明类型默认值
title内容string''
dot v2.2.1是否显示右上角小红点booleanfalse
info右上角徽标的内容number | string-
disabled v2.2.0是否禁用该项booleanfalse
url点击后跳转的链接地址string-
to v2.0.4点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace v2.0.4是否在跳转时替换当前页面历史booleanfalse

SidebarItem Events

事件名说明回调参数
click点击时触发index: 当前导航项的索引


实例演示

引入

import Vue from 'vue';import { Tab, Tabs } from 'vant';Vue.use(Tab);Vue.use(Tabs);

代码演示

基础用法

通过v-model绑定当前激活标签对应的索引值,默认情况下启用第一个标签

<van-tabs v-model="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>
export default {  data() {    return {      active: 2    };  }}

通过名称匹配

在标签指定name属性的情况下,v-model的值为当前标签的name

<van-tabs v-model="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>
export default {  data() {    return {      activeName: 'a'    };  }}

标签栏滚动

标签数量超过 4 个时,标签栏可以在水平方向上滚动,切换时会自动将当前标签居中

<van-tabs>  <van-tab v-for="index in 8" :title="'标签 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

禁用标签

设置disabled属性即可禁用标签。如果需要监听禁用标签的点击事件,可以在van-tabs上监听disabled事件

<van-tabs @disabled="onClickDisabled">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2" disabled>内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab></van-tabs>
import { Toast } from 'vant';export default {  methods: {    onClickDisabled(name, title) {      Toast(name + '已被禁用');    }  }};

样式风格

Tab支持两种样式风格:linecard,默认为line样式,可以通过type属性修改样式风格

<van-tabs 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>

点击事件

可以在van-tabs上绑定click事件,事件传参为标签对应的索引和标题

<van-tabs @click="onClick">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab></van-tabs>
import { Toast } from 'vant';export default {  methods: {    onClick(name, title) {      Toast(title);    }  }};

粘性布局

通过sticky属性可以开启粘性布局,粘性布局下,当 Tab 滚动到顶部时会自动吸顶

<van-tabs v-model="active" sticky>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

自定义标签

通过 title 插槽可以自定义标签内容

<van-tabs v-model="active">  <van-tab v-for="index in 2">    <div slot="title">      <van-icon name="more-o" />选项    </div>    内容 {{ index }}  </van-tab></van-tabs>

切换动画

通过animated属性可以开启切换标签内容时的转场动画

<van-tabs v-model="active" animated>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

滑动切换

通过swipeable属性可以开启滑动切换标签页

<van-tabs v-model="active" swipeable>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

滚动导航

通过scrollspy属性可以开启滚动导航模式,该模式下,内容将会平铺展示

<van-tabs v-model="active" scrollspy sticky>  <van-tab v-for="index in 8" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

API

Tabs Props

参数说明类型默认值
v-model绑定当前选中标签的标识符number | string0
type样式风格类型,可选值为cardstringline
color标签主题色string#ee0a24
background标签栏背景色stringwhite
duration动画时间,单位秒number | string0.3
line-width底部条宽度,默认单位pxnumber | stringauto
line-height底部条高度,默认单位pxnumber | string3px
animated是否开启切换标签内容时的转场动画booleanfalse
border是否显示标签栏外边框,仅在type="line"时有效booleantrue
ellipsis是否省略过长的标题文字booleantrue
sticky是否使用粘性定位布局booleanfalse
swipeable是否开启手势滑动切换booleanfalse
lazy-render是否开启延迟渲染(首次切换到标签时才触发内容渲染)booleantrue
scrollspy v2.3.0是否开启滚动导航booleanfalse
offset-top粘性定位布局下与顶部的最小距离,单位pxnumber | string0
swipe-threshold滚动阈值,标签数量超过阈值时开始横向滚动number | string4
title-active-color标题选中态颜色string-
title-inactive-color标题默认态颜色string-

Tab Props

参数说明类型默认值
title标题string-
disabled是否禁用标签booleanfalse
dot v2.3.0是否在标题右上角显示小红点booleanfalse
info v2.3.0标题右上角徽标的内容number | string-
name v2.0.6标签名称,作为匹配的标识符number | string标签的索引值
url v2.2.1点击后跳转的链接地址string-
to v2.2.1点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace v2.2.1是否在跳转时替换当前页面历史booleanfalse
title-style v2.2.14自定义标题样式any-

Tabs Events

事件名说明回调参数
click点击标签时触发name:标识符,title:标题
change当前激活的标签改变时触发name:标识符,title:标题
disabled点击被禁用的标签时触发name:标识符,title:标题
rendered v2.3.0标签内容首次渲染时触发(仅在开启延迟渲染后触发)name:标识符,title:标题
scroll滚动时触发,仅在 sticky 模式下生效{ scrollTop: 距离顶部位置, isFixed: 是否吸顶 }

Tabs 方法

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

方法名说明参数返回值
resize外层元素大小变化后,可以调用此方法来触发重绘-void

Tabs Slots

名称说明
nav-left标题左侧内容
nav-right标题右侧内容

Tab Slots

名称说明
default标签页内容
title自定义标题,不支持动态渲染


实例演示

引入

import Vue from 'vue';import { Tabbar, TabbarItem } from 'vant';Vue.use(Tabbar);Vue.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>
export default {  data() {    return {      active: 0    }  }}

通过名称匹配

在标签指定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>
export default {  data() {    return {      active: 'home'    }  }}

提示信息

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

<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" info="5">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o" info="20">标签</van-tabbar-item></van-tabbar>

自定义图标

通过 icon 插槽自定义图标,可以通过 slot-scope 判断标签是否选中

<van-tabbar v-model="active">  <van-tabbar-item info="3">    <span>自定义</span>    <img      slot="icon"      slot-scope="props"      :src="props.active ? icon.active : icon.inactive"    >  </van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
export default {  data() {    return {      active: 0,      icon: {        active: 'https://img.yzcdn.cn/vant/user-active.png',        inactive: 'https://img.yzcdn.cn/vant/user-inactive.png'      }    }  }}

自定义颜色

<van-tabbar  v-model="active"  active-color="#07c160"  inactive-color="#000">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="freinds-o">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>

监听切换事件

<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="freinds-o">标签3</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签4</van-tabbar-item></van-tabbar>
import { Notify } from 'vant';export default {  methods: {    onChange(index) {      Notify({ type: 'primary', message: index });    }  }}

路由模式

标签栏支持路由模式,用于搭配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
safe-area-inset-bottom是否开启 底部安全区适配booleanfalse

Tabbar Events

事件名说明回调参数
change切换标签时触发active: 当前选中标签的名称或索引值

TabbarItem Props

参数说明类型默认值
name标签名称,作为匹配的标识符number | string当前标签的索引值
icon图标名称 或图片链接string-
dot是否显示图标右上角小红点booleanfalse
info图标右上角徽标的内容number | string-
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

TabbarItem Slots

名称说明SlotProps
icon自定义图标active: 是否为选中标签


实例演示

引入

import Vue from 'vue';import { TreeSelect } from 'vant';Vue.use(TreeSelect);

代码演示

单选模式

item为分类显示所需的数据,数据格式见下方示例。main-active-index表示左侧高亮选项的索引,active-id表示右侧高亮选项的 id

<van-tree-select  :items="items"  :active-id.sync="activeId"  :main-active-index.sync="activeIndex"/>
export default {  data() {    return {      items,      activeId: 1,      activeIndex: 0    };  }}

多选模式

active-id为数组格式时,可以选中多个右侧选项

<van-tree-select  :items="items"  :active-id.sync="activeIds"  :main-active-index.sync="activeIndex"/>
export default {  data() {    return {      items,      activeIds: [1, 2],      activeIndex: 0    };  }}

自定义内容

通过content插槽可以自定义右侧区域的内容

<van-tree-select  height="55vw"  :items="items"  :main-active-index.sync="active">  <template slot="content">    <van-image v-if="active === 0" src="https://img.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow"  />    <van-image v-if="active === 1" src="https://img.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow"  />  </template></van-tree-select>
export default {  data() {    return {      active: 0,      items: [{ text: '分组 1' }, { text: '分组 2' }]    }  }}

提示信息

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

<van-tree-select  height="55vw"  :items="items"  :main-active-index.sync="activeIndex"/>
export default {  data() {    return {      activeIndex: 0,      items: [        { text: '浙江', children: [], dot: true },        { text: '江苏', children: [], info: 5 }      ]    }  }}

API

Props

参数说明类型默认值
items分类显示所需的数据Item[][]
height高度,默认单位为pxnumber | string300
main-active-index左侧选中项的索引number | string0
active-id右侧选中项的 id,支持传入数组number | string |
(number | string)[]
0
max v2.2.0右侧项最大选中个数number | stringInfinity

Events

事件名说明回调参数
click-nav点击左侧导航时触发index:被点击的导航的索引
click-item点击右侧选择项时触发data: 该点击项的数据

Slots

名称说明
content自定义右侧区域内容

Item 数据结构

items 整体为一个数组,数组内包含一系列描述分类的对象,每个分类里,text表示当前分类的名称,children表示分类里的可选项。

[  {    // 导航名称    text: '所有城市',    // 导航名称右上角徽标    info: 3,    // 是否在导航名称右上角显示小红点    dot: true,    // 导航节点额外类名    className: 'my-class',    // 该导航下所有的可选项    children: [      {        // 名称        text: '温州',        // id,作为匹配选中状态的标识符        id: 1,        // 禁用选项        disabled: true      },      {        text: '杭州',        id: 2      }    ]  }]


实例演示

引入

import Vue from 'vue';import { AddressEdit } from 'vant';Vue.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 { Toast } from 'vant';export default {  data() {    return {      areaList,      searchResult: []    }  },  methods: {    onSave() {      Toast('save');    },    onDelete() {      Toast('delete');    },    onChangeDetail(val) {      if (val) {        this.searchResult = [{          name: '黄龙万科中心',          address: '杭州市西湖区'        }];      } else {        this.searchResult = [];      }    }  }}

API

Props

参数说明类型默认值
area-list地区列表object-
area-columns-placeholder v2.2.5地区选择列占位提示文字string[][]
address-info收货人信息初始值AddressInfo{}
search-result详细地址搜索结果SearchResult[][]
show-postal是否显示邮政编码booleanfalse
show-delete是否显示删除按钮booleanfalse
show-set-default是否显示默认地址栏booleanfalse
show-search-result是否显示搜索结果booleanfalse
save-button-text保存按钮文字string保存
delete-button-text删除按钮文字string删除
detail-rows详细地址输入框行数number | string1
detail-maxlength v2.0.4详细地址最大长度number | string200
is-saving是否显示保存按钮加载动画booleanfalse
is-deleting是否显示删除按钮加载动画booleanfalse
tel-validator手机号格式校验函数string => boolean-
postal-validator v2.1.2邮政编码格式校验函数string => boolean-
validator自定义校验函数(key, val) => string-

Events

事件名说明回调参数
save点击保存按钮时触发content:表单内容
focus输入框聚焦时触发key: 聚焦的输入框对应的 key
delete确认删除地址时触发content:表单内容
cancel-delete取消删除地址时触发content:表单内容
select-search选中搜索结果时触发value: 搜索结果
change-area修改收件地区时触发values: 地区信息
change-detail修改详细地址时触发value: 详细地址内容
change-default切换是否使用默认地址时触发value: 是否选中

Slots

名称说明
default在邮政编码下方插入内容

方法

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

方法名说明参数返回值
setAddressDetail设置详细地址addressDetail: string-

AddressInfo 数据格式

注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取

key说明类型
id每条地址的唯一标识number | string
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 组件。


实例演示

引入

import Vue from 'vue';import { AddressList } from 'vant';Vue.use(AddressList);

代码演示

基础用法

<van-address-list  v-model="chosenAddressId"  :list="list"  :disabled-list="disabledList"  disabled-text="以下地址超出配送范围"  default-tag-text="默认"  @add="onAdd"  @edit="onEdit"/>
import { Toast } from 'vant';export default {  data() {    return {      chosenAddressId: '1',      list: [        {          id: '1',          name: '张三',          tel: '13000000000',          address: '浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室'        },        {          id: '2',          name: '李四',          tel: '1310000000',          address: '浙江省杭州市拱墅区莫干山路 50 号'        }      ],      disabledList: [        {          id: '3',          name: '王五',          tel: '1320000000',          address: '浙江省杭州市滨江区江南大道 15 号'        }      ]    }  },  methods: {    onAdd() {      Toast('新增地址');    },    onEdit(item, index) {      Toast('编辑地址:' + index);    }  }}

API

Props

参数说明类型默认值
v-model当前选中地址的 idstring-
list地址列表Address[][]
disabled-list不可配送地址列表Address[][]
disabled-text不可配送提示文案string-
switchable是否允许切换地址booleantrue
add-button-text底部按钮文字string新增地址
default-tag-text v2.3.0默认地址标签文字string-

Events

事件名说明回调参数
add点击新增按钮时触发-
edit点击编辑按钮时触发item: 地址对象,index: 索引
select切换选中的地址时触发item: 地址对象,index: 索引
edit-disabled编辑不可配送的地址时触发item: 地址对象,index: 索引
select-disabled选中不可配送的地址时触发item: 地址对象,index: 索引
click-item点击任意地址时触发item: 地址对象,index: 索引

Address 数据结构

键名说明类型
id每条地址的唯一标识number | string
name收货人姓名string
tel收货人手机号number | string
address收货地址string
isDefault是否为默认地址boolean

Slots

名称说明
default在列表下方插入内容
top在顶部插入内容


实例演示

介绍

省市区三级联动选择,通常与 弹出层 组件配合使用

引入

import Vue from 'vue';import { Area } from 'vant';Vue.use(Area);

代码演示

基础用法

要初始化一个Area组件,你需要传入一个area-list属性,数据格式具体可看下面数据格式章节

<van-area :area-list="areaList" />

选中省市区

如果想选中某个省市区,需要传入一个value属性,绑定对应的省市区code

<van-area :area-list="areaList" value="110101" />

配置显示列

可以通过columns-num属性配置省市区显示的列数,默认情况下会显示省市区,当你设置为2,则只会显示省市选择

<van-area :area-list="areaList" :columns-num="2" title="标题" />

配置列占位提示文字

可以通过columns-placeholder属性配置每一列的占位提示文字

<van-area  :area-list="areaList"  :columns-placeholder="['请选择', '请选择', '请选择']"  title="标题"/>

API

Props

参数说明类型默认值
value当前选中的省市区codestring-
title顶部栏标题string-
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
area-list省市区数据,格式见下方object-
columns-placeholder v2.2.5列占位提示文字string[][]
loading是否显示加载状态booleanfalse
item-height选项高度number | string44
columns-num显示列数,3-省市区,2-省市,1-省number | string3
visible-item-count可见的选项个数number | string5
swipe-duration v2.2.13快速滑动时惯性滚动的时长,单位msnumber | string1000
is-oversea-code v2.1.4根据code校验海外地址,海外地址会划分至单独的分类() => boolean-

Events

事件说明回调参数
confirm点击右上方完成按钮一个数组参数,具体格式看下方数据格式章节
cancel点击取消按钮时-
change选项改变时触发Picker 实例,所有列选中值,当前列对应的索引

方法

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

方法名说明参数返回值
reset根据 code 重置所有选项,若不传 code,则重置到第一项code?: string-

省市区列表数据格式

整体是一个 object,包含 province_list, city_list, county_list 三个 key。

每项以省市区编码作为 key,省市区名字作为 value。编码为 6 位数字,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。如北京编码为 11,以零补足 6 位,为 110000。

AreaList具体格式如下:

{  province_list: {    110000: '北京市',    120000: '天津市'  },  city_list: {    110100: '北京市',    110200: '县',    120100: '天津市',    120200: '县'  },  county_list: {    110101: '东城区',    110102: '西城区',    110105: '朝阳区',    110106: '丰台区'    120101: '和平区',    120102: '河东区',    120103: '河西区',    120104: '南开区',    120105: '河北区',    // ....  }}

完整数据见 Area.json

点击完成时返回的数据格式

返回的数据整体为一个数组,数组内包含 columnsNum 个数据, 每个数据对应一列选项中被选中的数据。

code 代表被选中的地区编码, name 代表被选中的地区名称

[  {    code: '110000',    name: '北京市'  },  {    code: '110100',    name: '北京市'  },  {    code: '110101',    name: '东城区'  }];

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { Card } from 'vant';Vue.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">  <div slot="tags">    <van-tag plain type="danger">标签</van-tag>    <van-tag plain type="danger">标签</van-tag>  </div>  <div slot="footer">    <van-button size="mini">按钮</van-button>    <van-button size="mini">按钮</van-button>  </div></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: Event
click-thumb点击自定义图片时触发event: Event

Slots

名称说明
title自定义标题
desc自定义描述
num自定义数量
price自定义价格
origin-price自定义商品原价
price-top自定义价格上方区域
bottom自定义价格下方区域
thumb自定义图片
tag自定义图片角标
tags自定义描述下方标签区域
footer自定义右下角内容


实例演示

介绍

通过 Contact 组件可以实现联系人的展示、选择、编辑等功能。

引入

import Vue from 'vue';import { ContactCard, ContactList, ContactEdit } from 'vant';Vue.use(ContactCard);Vue.use(ContactList);Vue.use(ContactEdit);

代码演示

基础用法

<!-- 联系人卡片 --><van-contact-card  :type="cardType"  :name="currentContact.name"  :tel="currentContact.tel"  @click="showList = true"/><!-- 联系人列表 --><van-popup v-model="showList" position="bottom">  <van-contact-list    v-model="chosenContactId"    :list="list"    @add="onAdd"    @edit="onEdit"    @select="onSelect"  /></van-popup><!-- 联系人编辑 --><van-popup v-model="showEdit" position="bottom">  <van-contact-edit    :contact-info="editingContact"    :is-edit="isEdit"    @save="onSave"    @delete="onDelete"  /></van-popup>
export default {  data() {    return {      chosenContactId: null,      editingContact: {},      showList: false,      showEdit: false,      isEdit: false,      list: [{        name: '张三',        tel: '13000000000',        id: 0      }]    };  },  computed: {    cardType() {      return this.chosenContactId !== null ? 'edit' : 'add';    },    currentContact() {      const id = this.chosenContactId;      return id !== null ? this.list.filter(item => item.id === id)[0] : {};    }  },  methods: {    // 添加联系人    onAdd() {      this.editingContact = { id: this.list.length };      this.isEdit = false;      this.showEdit = true;    },    // 编辑联系人    onEdit(item) {      this.isEdit = true;            this.showEdit = true;      this.editingContact = item;    },    // 选中联系人    onSelect() {      this.showList = false;    },    // 保存联系人    onSave(info) {      this.showEdit = false;      this.showList = false;            if (this.isEdit) {        this.list = this.list.map(item => item.id === info.id ? info : item);      } else {        this.list.push(info);      }      this.chosenContactId = info.id;    },    // 删除联系人    onDelete(info) {      this.showEdit = false;      this.list = this.list.filter(item => item.id !== info.id);      if (this.chosenContactId === info.id) {        this.chosenContactId = null;      }    }  }};

不可编辑

<van-contact-card  type="edit"  name="张三"  tel="13000000000"  :editable="false"/>

API

ContactCard Props

参数说明类型默认值
type类型,可选值为 add editstringadd
name联系人姓名string-
tel联系人手机号string-
add-text添加时的文案提示string添加订单联系人信息

ContactCard Events

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

ContactList Props

参数说明类型默认值
v-model当前选中联系人的 idnumber | string-
list联系人列表Contact[][]
add-text新建按钮文案string新建联系人
default-tag-text v2.3.0默认联系人标签文案string-

ContactList Events

事件名说明回调参数
add点击新增按钮时触发-
edit点击编辑按钮时触发item: 当前联系人对象,index: 索引
select切换选中的联系人时触发item: 当前联系人对象,index: 索引

ContactEdit Props

参数说明类型默认值
contact-info联系人信息object[]
is-edit是否为编辑联系人booleanfalse
is-saving是否显示保存按钮加载动画booleanfalse
is-deleting是否显示删除按钮加载动画booleanfalse
tel-validator手机号格式校验函数(tel: string) => boolean-
show-set-default v2.3.0是否显示默认联系人栏booleanfalse
set-default-label v2.3.0默认联系人栏文案string-

ContactEdit Events

事件名说明回调参数
save点击保存按钮时触发content:表单内容
delete点击删除按钮时触发content:表单内容

Contact 数据结构

键名说明类型
id每位联系人的唯一标识number | string
name联系人姓名string
tel联系人手机号number | string
isDefault是否为默认联系人boolean


实例演示

引入

import Vue from 'vue';import { CouponCell, CouponList } from 'vant';Vue.use(CouponCell);Vue.use(CouponList);

代码演示

基础用法

<!-- 优惠券单元格 --><van-coupon-cell  :coupons="coupons"  :chosen-coupon="chosenCoupon"  @click="showList = true"/><!-- 优惠券列表 --><van-popup  v-model="showList"  round  position="bottom"  style="height: 90%; padding-top: 4px;">  <van-coupon-list    :coupons="coupons"    :chosen-coupon="chosenCoupon"    :disabled-coupons="disabledCoupons"    @change="onChange"    @exchange="onExchange"  /></van-popup>
const coupon = {  available: 1,  condition: '无使用门槛
最多优惠12元',  reason: '',  value: 150,  name: '优惠券名称',  startAt: 1489104000,  endAt: 1514592000,  valueDesc: '1.5',  unitDesc: '元'};export default {  data() {    return {      chosenCoupon: -1,      coupons: [coupon],      disabledCoupons: [coupon]    }  },  methods: {    onChange(index) {      this.showList = false;      this.chosenCoupon = index;    },    onExchange(code) {      this.coupons.push(coupon);    }  }}

API

CouponCell Props

参数说明类型默认值
title单元格标题string优惠券
chosen-coupon当前选中优惠券的索引number-1
coupons可用优惠券列表Coupon[][]
editable能否切换优惠券booleantrue
border是否显示内边框booleantrue
currency货币符号string¥

CouponList Props

参数说明类型默认值
v-model当前输入的兑换码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 v2.1.0列表为空时的占位图stringhttps://img.yzcdn.cn/vant/coupon-empty.png
show-count v2.3.0是否展示可用 / 不可用数量booleantrue

CouponList Events

事件名说明回调参数
change优惠券切换回调index, 选中优惠券的索引
exchange兑换优惠券回调code, 兑换码

Coupon 数据结构

键名说明类型
id优惠券 idstring
name优惠券名称string
condition满减条件string
startAt卡有效开始时间 (时间戳, 单位秒)number
endAt卡失效日期 (时间戳, 单位秒)number
description描述信息,优惠券可用时展示string
reason不可用原因,优惠券不可用时展示string
value折扣券优惠金额,单位分number
valueDesc折扣券优惠金额文案string
unitDesc单位文案string


实例演示

引入

import Vue from 'vue';import { GoodsAction, GoodsActionIcon, GoodsActionButton } from 'vant';Vue.use(GoodsAction);Vue.use(GoodsActionButton);Vue.use(GoodsActionIcon);

代码演示

基础用法

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" @click="onClickIcon" />  <van-goods-action-icon icon="cart-o" text="购物车" @click="onClickIcon" />  <van-goods-action-button type="warning" text="加入购物车" @click="onClickButton" />  <van-goods-action-button type="danger" text="立即购买" @click="onClickButton" /></van-goods-action>
import { Toast } from 'vant';export default {  methods: {    onClickIcon() {      Toast('点击图标');    },    onClickButton() {      Toast('点击按钮');    }  }}

徽标提示

通过info属性在图标右上角显示徽标

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" />  <van-goods-action-icon icon="cart-o" text="购物车" info="5" />  <van-goods-action-icon icon="shop-o" text="店铺" info="12" />  <van-goods-action-button type="warning" text="加入购物车" />  <van-goods-action-button type="danger" text="立即购买" /></van-goods-action>

自定义图标颜色

通过 GoodsActionIcon 的color属性可以自定义图标的颜色

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" color="#07c160" />  <van-goods-action-icon icon="cart-o" text="购物车" />  <van-goods-action-icon icon="star" text="已收藏" color="#ff5000" />  <van-goods-action-button type="warning" text="加入购物车" />  <van-goods-action-button type="danger" text="立即购买" /></van-goods-action>

自定义按钮颜色

通过 GoodsActionButton 的color属性可以自定义按钮的颜色,支持传入linear-gradient渐变色

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" />  <van-goods-action-icon icon="shop-o" text="店铺" />  <van-goods-action-button color="#be99ff" type="warning" text="加入购物车" />  <van-goods-action-button color="#7232dd" type="danger" text="立即购买" /></van-goods-action>

API

GoodsAction Props

参数说明类型默认值
safe-area-inset-bottom是否开启 底部安全区适配booleanfalse

GoodsActionIcon Props

参数说明类型默认值
text按钮文字string-
icon图标string-
color v2.4.2图标颜色string#323233
icon-class图标额外类名any-
info图标右上角徽标的内容number | string-
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

GoodsActionButton Props

参数说明类型默认值
text按钮文字string-
type按钮类型,可选值为 primary info warning dangerstringdefault
color v2.1.8按钮颜色,支持传入linear-gradient渐变色string-
icon v2.4.4左侧 图标名称 或图片链接string-
disabled是否禁用按钮booleanfalse
loading是否显示为加载状态booleanfalse
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

GoodsActionIcon Slots

名称说明
default文本内容
icon自定义图标

GoodsActionButton Slots

名称说明
default按钮显示内容


实例演示

引入

import Vue from 'vue';import { SubmitBar } from 'vant';Vue.use(SubmitBar);

代码演示

基础用法

<van-submit-bar  :price="3050"  button-text="提交订单"  @submit="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>  <span slot="tip">    你的收货地址不支持同城送, <span>修改地址</span>  </span></van-submit-bar>

API

Props

参数说明类型默认值
price价格(单位分)number-
label价格左侧文案string合计:
suffix-label价格右侧文案string-
text-align v2.3.0价格文案对齐方向,可选值为 leftstringright
button-text按钮文字string-
button-type按钮类型stringdanger
tip提示文案string-
tip-icon左侧 图标名称 或图片链接string-
currency货币符号string¥
decimal-length价格小数点后位数number | string2
disabled是否禁用按钮booleanfalse
loading是否显示加载中的按钮booleanfalse
safe-area-inset-bottom是否开启 底部安全区适配booleanfalse

Events

事件名说明回调参数
submit按钮点击事件回调-

Slots

名称说明
default自定义订单栏左侧内容
top自定义订单栏上方内容
tip提示文案中的额外操作和说明


实例演示

引入

import Vue from 'vue';import { Sku } from 'vant';Vue.use(Sku);

代码演示

基础用法

<van-sku  v-model="show"  :sku="sku"  :goods="goods"  :goods-id="goodsId"  :quota="quota"  :quota-used="quotaUsed"  :hide-stock="sku.hide_stock"  :message-config="messageConfig"  @buy-clicked="onBuyClicked"  @add-cart="onAddCartClicked"/>
export default {  data() {    return {      show: false,      sku: {        // 数据结构见下方文档      },      goods: {        // 数据结构见下方文档      },      messageConfig: {        // 数据结构见下方文档      }    };  }}

自定义步进器

<van-sku  v-model="show"  :sku="sku"  :goods="goods"  :goods-id="goodsId"  :quota="quota"  :quota-used="quotaUsed"  :hide-stock="sku.hide_stock"  :custom-stepper-config="customStepperConfig"  @buy-clicked="onBuyClicked"  @add-cart="onAddCartClicked"/>

高级用法

<van-sku  v-model="show"  stepper-title="我要买"  :sku="sku"  :goods="goods"  :goods-id="goodsId"  :quota="quota"  :quota-used="quotaUsed"  :hide-stock="sku.hide_stock"  show-add-cart-btn  reset-stepper-on-hide  :initial-sku="initialSku"  @buy-clicked="onBuyClicked"  @add-cart="onAddCartClicked">  <!-- 自定义 sku-header-price -->  <template slot="sku-header-price" slot-scope="props">    <div class="van-sku__goods-price">      <span class="van-sku__price-symbol">¥</span><span class="van-sku__price-num">{{ props.price }}</span>    </div>  </template>  <!-- 自定义 sku actions -->  <template slot="sku-actions" slot-scope="props">    <div class="van-sku-actions">      <van-button        square        size="large"        type="warning"        @click="onPointClicked"      >        积分兑换      </van-button>      <!-- 直接触发 sku 内部事件,通过内部事件执行 onBuyClicked 回调 -->      <van-button        square        size="large"        type="danger"        @click="props.skuEventBus.$emit('sku:buy')"      >        买买买      </van-button>    </div>  </template></van-sku>

API

Props

参数说明类型默认值
v-model是否显示skubooleanfalse
sku商品sku数据object-
goods商品信息object-
goods-id商品 idnumber | string-
price-tag显示在价格后面的标签string-
hide-stock是否显示商品剩余库存booleanfalse
hide-quota-text是否显示限购提示booleanfalse
hide-selected-text是否隐藏已选提示booleanfalse
stock-threshold库存阈值。低于这个值会把库存数高亮显示boolean50
show-add-cart-btn是否显示加入购物车按钮booleantrue
buy-text购买按钮文字string立即购买
add-cart-text加入购物车按钮文字string加入购物车
quota限购数,0 表示不限购number0
quota-used已经购买过的数量number0
reset-stepper-on-hide隐藏时重置选择的商品数量booleanfalse
reset-selected-sku-on-hide隐藏时重置已选择的 skubooleanfalse
disable-stepper-input是否禁用步进器输入booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleanfalse
stepper-title数量选择组件左侧文案string购买数量
custom-stepper-config步进器相关自定义配置object{}
message-config留言相关配置object{}
get-container指定挂载的节点,用法示例string | () => Element-
initial-sku默认选中的 sku,具体参考高级用法object{}
show-soldout-sku是否展示售罄的 sku,默认展示并置灰booleantrue
safe-area-inset-bottom v2.2.1是否开启 底部安全区适配booleanfalse
start-sale-num v2.3.0起售数量number1
properties v2.4.2商品属性array-

Events

事件名说明回调参数
add-cart点击添加购物车回调skuData: object
buy-clicked点击购买回调skuData: object
stepper-change购买数量变化时触发value: number
sku-selected切换规格类目时触发{ skuValue, selectedSku, selectedSkuComb }
sku-prop-selected切换商品属性时触发{ propValue, selectedProp, selectedSkuComb }
open-preview打开商品图片预览时触发data: object
close-preview关闭商品图片预览时触发data: object

方法

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

方法名说明参数返回值
getSkuData获取当前 skuData-skuData
resetSelectedSku v2.3.0重置选中规格到初始状态--

Slots

Sku 组件默认划分好了若干区块,这些区块都定义成了插槽,可以按需进行替换。区块顺序见下表:

名称说明
sku-header商品信息展示区,包含商品图片、名称、价格等信息
sku-header-price自定义 sku 头部价格展示
sku-header-origin-price自定义 sku 头部原价展示
sku-header-extra额外 sku 头部区域
sku-body-topsku 展示区上方的内容,无默认展示内容,按需使用
sku-group商品 sku 展示区
extra-sku-group额外商品 sku 展示区,一般用不到
sku-stepper商品数量选择区
sku-messages商品留言区
sku-actions操作按钮区

sku 对象结构

sku: {  // 所有sku规格类目与其值的从属关系,比如商品有颜色和尺码两大类规格,颜色下面又有红色和蓝色两个规格值。  // 可以理解为一个商品可以有多个规格类目,一个规格类目下可以有多个规格值。  tree: [    {      k: '颜色', // skuKeyName:规格类目名称      v: [        {          id: '30349', // skuValueId:规格值 id          name: '红色', // skuValueName:规格值名称          imgUrl: 'https://img.yzcdn.cn/1.jpg', // 规格类目图片,只有第一个规格类目可以定义图片          previewImgUrl: 'https://img.yzcdn.cn/1p.jpg', // 用于预览显示的规格类目图片        },        {          id: '1215',          name: '蓝色',          imgUrl: 'https://img.yzcdn.cn/2.jpg',          previewImgUrl: 'https://img.yzcdn.cn/2p.jpg',        }      ],      k_s: 's1' // skuKeyStr:sku 组合列表(下方 list)中当前类目对应的 key 值,value 值会是从属于当前类目的一个规格值 id    }  ],  // 所有 sku 的组合列表,比如红色、M 码为一个 sku 组合,红色、S 码为另一个组合  list: [    {      id: 2259, // skuId,下单时后端需要      price: 100, // 价格(单位分)      s1: '1215', // 规格类目 k_s 为 s1 的对应规格值 id      s2: '1193', // 规格类目 k_s 为 s2 的对应规格值 id      s3: '0', // 最多包含3个规格值,为0表示不存在该规格      stock_num: 110 // 当前 sku 组合对应的库存    }  ],  price: '1.00', // 默认价格(单位元)  stock_num: 227, // 商品总库存  collection_id: 2261, // 无规格商品 skuId 取 collection_id,否则取所选 sku 组合对应的 id  none_sku: false, // 是否无规格商品  messages: [    {      // 商品留言      datetime: '0', // 留言类型为 time 时,是否含日期。'1' 表示包含      multiple: '0', // 留言类型为 text 时,是否多行文本。'1' 表示多行      name: '留言', // 留言名称      type: 'text', // 留言类型,可选: id_no(身份证), text, tel, date, time, email      required: '1', // 是否必填 '1' 表示必填      placeholder: '' // 可选值,占位文本    }  ],  hide_stock: false // 是否隐藏剩余库存}

properties 对象结构

  [ // 商品属性    {      k_id: 123, // 属性id      k: '加料', // 属性名      is_multiple: true, // 是否可多选      v: [        {          id: 1222, // 属性值id          name: '珍珠', // 属性值名          price: 1, // 属性值加价        },        {          id: 1223,          name: '椰果',          price: 1,        }      ],    }  ]

initialSku 对象结构

{  // 键:skuKeyStr(sku 组合列表中当前类目对应的 key 值)  // 值:skuValueId(规格值 id)  s1: '30349',  s2: '1193',  // 初始选中数量  selectedNum: 3,  // 初始选中的商品属性  // 键:属性id  // 值:属性值id列表  selectedProp: {    123: [1222]  }}

goods 对象结构

goods: {  // 商品标题  title: '测试商品',  // 默认商品 sku 缩略图  picture: 'https://img.yzcdn.cn/1.jpg'}

customStepperConfig 对象结构

customStepperConfig: {  // 自定义限购文案  quotaText: '每次限购xxx件',  // 自定义步进器超过限制时的回调  handleOverLimit: (data) => {    const { action, limitType, quota, quotaUsed, startSaleNum } = data;    if (action === 'minus') {      Toast(startSaleNum > 1  ? `${startSaleNum}件起售` : '至少选择一件商品');    } else if (action === 'plus') {      // const { LIMIT_TYPE } = Sku.skuConstants;      if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {        let msg = `单次限购${quota}件`;        if (quotaUsed > 0) msg += `,你已购买${quotaUsed}`;        Toast(msg);      } else {        Toast('库存不够了');      }    }  },  // 步进器变化的回调  handleStepperChange: currentValue => {},  // 库存  stockNum: 1999,  // 格式化库存  stockFormatter: stockNum => {},}

messageConfig Data Structure

messageConfig: {  // 图片上传回调,需要返回一个promise,promise正确执行的结果需要是一个图片url  uploadImg: () => {    return new Promise((resolve) => {      setTimeout(() => resolve('https://img.yzcdn.cn/upload_files/2017/02/21/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg!100x100.jpg'), 1000);    });  },  // 最大上传体积 (MB)  uploadMaxSize: 3,  // placeholder 配置  placeholderMap: {    text: 'xxx',    tel: 'xxx',    ...  }}

添加购物车和点击购买回调函数接收的 skuData 对象结构

skuData: {  // 商品 id  goodsId: '946755',  // 留言信息  messages: {    message_0: '12',    message_1: ''  },  // 另一种格式的留言,key 不同  cartMessages: {    '留言1': 'xxxx'  },  // 选择的商品数量  selectedNum: 1,  // 选择的 sku 组合  selectedSkuComb: {    id: 2257,    price: 100,    s1: '30349',    s2: '1193',    s3: '0',    stock_num: 111,    properties: [      {        k_id: 123,        k: '加料',        is_multiple: true,        v: [          {            id: 1223,            name: '椰果',            price: 1          }        ]      }    ],    property_price: 1  },}


实例演示

废弃提示

SwitchCell 组件将在 3.0 版本中废弃,请直接使用 Cell 和 Switch 组件代替

引入

import Vue from 'vue';import { SwitchCell } from 'vant';Vue.use(SwitchCell);

代码演示

基础用法

<van-cell-group>  <van-switch-cell v-model="checked" title="标题" /></van-cell-group>
export default {  data() {    return {      checked: true    }  }}

禁用状态

通过disabled属性可以将组件设置为禁用状态

<van-cell-group>  <van-switch-cell v-model="checked" disabled title="标题" /></van-cell-group>

加载状态

通过loading属性可以将组件设置为加载状态

<van-cell-group>  <van-switch-cell v-model="checked" loading title="标题" /></van-cell-group>

API

Props

参数说明类型默认值
v-model开关状态anyfalse
title左侧标题string''
border是否展示单元格内边框booleantrue
cell-size单元格大小,可选值为 largestring-
loading是否为加载状态booleanfalse
disabled是否为禁用状态booleanfalse
size开关尺寸number | string24px
active-color开关时的背景色string#1989fa
inactive-color开关时的背景色stringwhite
active-value打开时的值anytrue
inactive-value关闭时的值anyfalse

Events

事件名说明回调参数
change开关状态切换回调checked: 是否选中开关


实例演示

特性

  • 提供 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 的辅助库

链接

开源协议

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


实例演示

脚手架

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

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

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

通过 npm 安装

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

# 通过 npm 安装npm i vant -S# 通过 yarn 安装yarn add vant

示例工程

我们提供了一个基于 Vue Cli 的示例工程,示例工程会帮助你了解如下内容:

  • 基于 Vant 搭建单页面应用,配置按需引入组件
  • 配置基于 Rem 的适配方案
  • 配置基于 Viewport 的适配方案
  • 配置基于 TypeScript 的工程
  • 配置自定义主题色方案

引入组件

方式一. 自动按需引入组件 (推荐)

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

# 安装插件npm i babel-plugin-import -D
// 在.babelrc 中添加配置// 注意:webpack 1 无需设置 libraryDirectory{  "plugins": [    ["import", {      "libraryName": "vant",      "libraryDirectory": "es",      "style": true    }]  ]}// 对于使用 babel7 的用户,可以在 babel.config.js 中配置module.exports = {  plugins: [    ['import', {      libraryName: 'vant',      libraryDirectory: 'es',      style: true    }, 'vant']  ]};
// 接着你可以在代码中直接引入 Vant 组件// 插件会自动将代码转化为方式二中的按需引入形式import { Button } from 'vant';
如果你在使用 TypeScript,可以使用 ts-import-plugin 实现按需引入

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

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

import Button from 'vant/lib/button';import 'vant/lib/button/style';

方式三. 导入所有组件

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

import Vue from 'vue';import Vant from 'vant';import 'vant/lib/index.css';Vue.use(Vant);
配置按需引入后,将不允许直接导入所有组件

方式四. 通过 CDN 引入

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

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

进阶用法

Rem 适配

Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具:

PostCSS 配置

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

module.exports = {  plugins: {    'autoprefixer': {      browsers: ['Android >= 4.0', 'iOS >= 8']    },    'postcss-pxtorem': {      rootValue: 37.5,      propList: ['*']    }  }}
在配置 postcss-loader 时,应避免 ignore node_modules 目录,否则将导致 Vant 样式无法被编译

在桌面端使用

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-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"/><!-- 开启 safe-area-inset-bottom 属性 --><van-number-keyboard safe-area-inset-bottom />

组件实例方法

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

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

常见问题

在 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 遵循 Semver 语义化版本规范。

发布节奏

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

v2.4.6

2020-02-01

Bug Fixes

  • Picker: 修复更新 columns 数据不生效的问题 #5614

v2.4.5

2020-02-01

Feature

  • Picker: 支持级联选择 #4247
  • Slider: 新增 button-size 属性 1e9b8c
  • 优化 props 类型,原有 number 类型的 props 现在支持传入 string

Style

  • DropdownItem: 新增 @dropdown-item-z-index 变量 6f4c6f
  • IndexBar: 新增 @index-anchor-z-index 变量 89ee8e
  • IndexBar: 新增 @index-bar-sidebar-z-index 变量 89ee8e
  • IndexBar: 新增 @index-bar-index-active-color 变量 0011db
  • Notify: 新增 @notify-text-color 变量 9dcf57
  • Overlay: 新增 @overlay-z-index 变量 95d19f
  • Rate: 新增 @rate-icon-disabled-color 变量 8b8471
  • Rate: 新增 @rate-icon-full-color 变量 5c804c
  • Rate: 新增 @rate-icon-void-color 变量 f90015
  • Slider: 新增 @slider-bar-height 变量 a5819c
  • Search: 新增 @search-content-background-color 变量 ea7419
  • Step: 新增 @step-active-color 变量 9e7a68
  • Tabbar: 新增 @tabbar-z-index 变量 0441f7
  • NavBar: 新增 @nav-bar-z-index 变量 a2d870
  • NumberKeyboard: 新增 @number-keyboard-z-index 变量 760938

Bug Fixes

  • ImagePreview: 修复双击缩放时 max-zoom 属性不生效的问题 1baa60
  • Popup: 修复 position 为 center 时 duration 属性不生效的问题 44072e
  • Step: 修复 active-color 未改变分隔线颜色的问题 cfadce

v2.4.4

2020-01-24

Feature

  • Card: 优化图片拉伸模式 e766d5
  • Calendar: 新增 get-contaienr 属性 #5609
  • Calendar: 新增 close-on-popstate 属性 2b82dc
  • CountDown: 新增 change 事件 #5599
  • GoodsActionButton: 新增 icon 属性 b83bed

Bug Fixes

  • Sku: 修复 get-container 属性不能为 string 类型的问题 #5608

v2.4.3

2020-01-19

Feature

  • Swipe: 页面隐藏时暂停自动轮播 113157
  • Stepper: 新增 long-press 属性 2f3ec6
  • Calendar: 新增 max-range、range-prompt 属性 #5583
  • ImagePreview: 新增 @image-preview-index-text-shadow 变量 e2f302

Improvement

  • Icon: 更新 share 图标 2f77ac
  • Field: 优化 readonly 状态下的光标类型 60173d
  • Stepper: 优化 disable-input 状态下的输入框颜色 959eca

Bug Fixes

  • GoodsAction: 修复未设置容器高度的问题 #5593

Types

  • Calendar: 新增类型定义 dac60c
  • Toast: 修复 setDefaultOptions 方法参数定义错误 #5582

v2.4.2

2020-01-14

Feature

  • Sku: 新增 properties 属性 #5525
  • Field: 新增 digit 类型 #5524
  • Field: 新增 formatter 属性 #5534
  • Image: 新增 error-icon 属性 #5470
  • Image: 新增 loading-icon 属性 #5469
  • Swipe: 新增 prev、next 方法 #5548
  • GoodsAcitonIcon: 新增 color 属性 #5576

Improvement

  • AddressList: 优化样式细节 #5507
  • AddressEdit: 优化错误提示展示方式 #5479
  • ActionSheet: 优化关闭按钮样式 #5574
  • CouponList: 优化样式细节 #5501
  • Calendar: 弹出时自动滚动到当前选中的日期 #5526
  • ImagePreview: 优化图片加载失败提示样式 #5570
  • 优化所有组件的光标类型 c1a535

Bug Fixes

  • Button: 修复加载状态下仍会有点击反馈的问题 0a70d3
  • Card: 修复图片圆角样式未生效的问题 #5480
  • Calendar: 修复选中的日期无法展示提示信息的问题 #5536
  • Checkbox: 修复设置 label-disabled 后空白区域仍然可以点击的问题 3d10d4
  • CouponList: 修复点击反馈区域错误的问题 #5521
  • Field: 修复 type 为 number 时在 iOS 上仍然能输入非数字字符的问题 #5520
  • ImagePreview: 修复在桌面端使用时无法拖拽的问题 #4487
  • Picker: 修复点击事件偶尔会丢失的问题 5cbb9e
  • PullRefresh:修复 head-height 属性未正确设置高度的问题 028747
  • Tabs: 修复容器设置 fixed 布局时无法渲染底部条的问题 #5496

v2.4.1

2020-01-02

Feature

  • ContactEdit: 优化错误提示展示方式 #5437
  • CouponCell: 优先展示 value 字段的数值 #5438

Bug Fixes

  • Calendar: 修复日期对应的星期数展示错误的问题 #5452
  • List: 修复 direction 为 up 时加载事件触发时机错误的问题 #5439

v2.4.0

2020-01-01

New Component

  • 新增 Calendar 日历组件

Feature

  • List: 新增 error 插槽 e9a938
  • List: 新增 finished 插槽 8a0705
  • Picker: 新增 confirm 方法 5eb2a4
  • PullRefresh: 新增 success 插槽 56e450
  • CouponList: 更新底部按钮样式 #5368
  • DatetimePicker: 新增 getPicker 方法 1dc1fe
  • TreeSelect: 新增 @tree-select-item-selected-size 变量 373159
  • Image: 新增 @image-loading-icon-size、@image-error-icon-size 变量 d7ae8c

Compatibility

在之前的版本中,有较多同学反馈在 iOS 10 ~ 11 上会偶现组件无法操作的情况,该问题的原因是 Vue 2.6.x 版本在绑定事件时存在事件无法冒泡的兼容性问题。相关 issue

从 2.4 版本开始,我们通过手动绑定事件的方式来规避这个问题,涉及以下组件:

  • Area
  • DatetimePicker
  • ImagePreview
  • Rate
  • Slider
  • Swipe
  • SwipeCell
  • NumberKeyboard
  • Picker
  • PullRefresh

Bug Fixes

  • Icon: 修复 medel-o 图标不展示的问题 7b905a
  • ImagePreview: 修复 close 事件重复触发的问题 #5410
  • PullRefresh: 修复下拉到顶部时可能不触发下拉刷新的问题 e00058
  • Tag: 修复动态设置 closeable 时动画错误的问题 fe6e2f
  • Tag: 修复 close 时会触发 click 事件的问题 #5351
  • Toast: 修复同时存在多个 Toast 时 forbidClick 可能失效的问题 #5398
  • Picker: 修复在桌面端使用时拖动后回弹的问题 #5430
  • Stepper: 修复在 safari 上禁用时文字颜色不正确的问题 #5428
  • IndexBar: 修复 IndexAnchor 没有父容器时定位错误的问题 #5429

Types

  • AddressEdit: 新增 setAddressDetail 方法的类型定义 #5352
  • Area: 新增 reset 方法的类型定义 #5353
  • Checkbox: 新增 toggle 方法的类型定义 #5354
  • CountDown: 新增 start、end、reset 方法的类型定义 0438bd
  • DropdownItem: 新增 toggle 方法的类型定义 5c1883
  • Field: 新增 focus、blur 方法的类型定义 0b5c8e
  • List: 新增 check 方法的类型定义 285bce
  • Picker: 新增 getValues 等方法的类型定义 46d2b0
  • Sku: 新增 methods types d2bb9f
  • Swipe: 新增 swipeTo、resize 方法的类型定义 a1831b
  • SwipeCell: 新增 open、close 方法的类型定义 9a9676
  • Tabs: 新增 resize 方法的类型定义 3c526e
  • Uploader: 新增 closeImagePreview 方法的类型定义 cf191e

v2.3.3

2019-12-21

Bug Fixes

  • 修复 babel-plugin-import 按需引入部分组件时编译报错的问题

v2.3.2

2019-12-20

Bug Fixes

  • 修复 Area 未自动引入依赖的 Picker 样式的问题
  • 修复 DatetimePicker 未自动引入依赖的 Picker 样式的问题
  • 修复 CountDown 在特定情况下内部计时器未清除的问题 #5340
  • 修复 ImagePreview 在特定情况下会重复 onClose 回调的问题 #5341

v2.3.1

2019-12-20

Bug Fixes

  • 修复全量引入组件时,入口文件中存在未编译的 ES6 代码的问题

v2.3.0

2019-12-20

Style

在 2.3.0 版本中,我们对业务组件的样式进行了全新升级,涉及以下组件:

  • AddressEdit
  • Card
  • CouponList
  • ContactList
  • ContactCard
  • ContactEdit
  • SubmitBar

Features

  • 内部构建流程升级,使用 @vant/cli 进行构建
  • AddressList: 新增 default-tag-text 属性 #5106
  • Card: 新增 price-top 插槽 #5134
  • Checkbox: 优化 toggleAll 性能 #5285
  • Circle: 新增 stroke-linecap 属性 #5087
  • CouponList: 新增 show-count 属性 #5139
  • ContactList: 新增 default-tag-text 属性 #5089
  • ContactCard: 新增 show-set-default 属性 #5083
  • ContactCard: 新增 set-default-label 属性 #5083
  • CountDown: 支持 SS 和 S 格式 #5154
  • Sku: 新增 new startSaleNum 属性 #5105
  • Sku: 新增 resetSelectedSku 方法 #5318
  • SubmitBar: 新增 text-align 属性 #5130
  • SwipeCell: 新增 open 事件 #5324
  • SwipeCell: 新增 before-close 属性 #5320
  • Tab: 新增 dot 属性 #5272
  • Tab: 新增 info 属性 #5274
  • Tab: 新增 rendered 事件 #5315
  • Tab: 新增 scrollspy 属性 #5273
  • Toast: 完善 TS 类型定义 #5086

Bug Fixes

  • 修复 ActionSheet 按钮会提交表单的问题 #5181
  • 修复 Card 在未使用 price 属性的情况下 bottom 插槽不生效的问题 #5116
  • 修复 Dialog 快速点击按钮时可能重复触发 before-close 的问题 #5267
  • 修复 DropdownMenu 在页面滚动时菜单位置错误的问题 #5313
  • 修复 Icon medal 图标名称拼写错误的问题 #5242
  • 修复 NumberKeyboard 在隐藏状态下也会触发 blur 事件的问题 #5110
  • 修复 Picker 按钮会提交表单的问题 #5182
  • 修复 Popup 在 activated 后未重新打开的问题 #5286
  • 修复 Switch size 属性未定义 Number 类型的问题 #5229
  • 修复 SubmitBar 价格为整数时显示错误的问题 #5224
  • 修复 Sku 重置时未校验数量的问题 #5231
  • 修复 Sku 步进器可能输入小数的问题 #5202
  • 修复 Sku 步进器事件可能抛出小数的问题 #5210
  • 修复 Stepper 按钮会提交表单的问题 #5183
  • 修复 Stepper 在 max、min 属性变化时未更新输入框值的问题 #5257
  • 修复 TreeSelect 事件触发顺序错误的问题 #5153
  • 修复 TouchEmulator 在 Firefox 上的兼容性问题 #5118
  • 修复 Uploader 重复上传同张图片时不会触发 oversize 事件的问题 #5177
  • 修复主题定制时使用低版本 Less 会报错的问题 #5157

v2.2.16

2019-12-03

Features

  • Stepper: 新增 disable-plus 属性 #5180
  • Stepper: 新增 disable-minus 属性 #5180

v2.2.15

2019-11-28

Bug Fixes

  • 修复 List 组件在部分情况下加载状态未重置的问题

v2.2.14

2019-11-22

Features

  • Tabs: 新增 title-style 属性 #5048
  • Tabs: 新增 resize 方法 #5071
  • Swipe: 新增 resize 方法 #5070

Bug Fixes

  • 修复 Cell value 过长时不换行的问题 #5029
  • 修复 SwipeCell 在桌面端无法使用的问题 #5077
  • 修复 Field 在 Safari 下输入换行符时字数统计错误的问题 #5049
  • 修复 Tabbar 设置 safe-area-inset-bottom 后可能出现样式错位的问题 #5079
  • 修复 DropdownMenu 使用 get-container 属性时点击后会立即关闭的问题 #5047

v2.2.13

2019-11-14

Features

  • Area: 新增 swipe-duration 属性 #5014
  • Swipe: 新增 stop-propagation 属性 #4972
  • Toast: 新增 overlay 选项 #4969
  • Toast: 新增 clickOnClickOverlay 选项 #4967
  • SwipeCell: 新增 opened 事件 #4986
  • ActionSheet: 新增 close-icon 属性 #5016
  • DropdownItem: 新增 title 插槽 #4975
  • DatetimePicker: 新增 swipe-duration 属性 #5015

Bug Fixes

  • 修复 Tab name 设置为 0 时无法正确匹配的问题 #5017
  • 修复 Indexbar 隐藏时可能出现锚点位置错误的问题 #5012
  • 修复 Indexbar 设置 sticky-offset-top 后可能出现锚点位置错误的问题 #5012
  • 修复 DatetimePicker 使用 filter 并返回空数组时无法切换时间的问题 #4973
  • 修复 DateTimePicker 动态设置 max-hour 并小于 v-model 绑定的时间时出现错误的问题 #5006
  • 修复 ImagePreview 类型中定义缺少 swipeDuration 选项的问题 #4968

v2.2.12

2019-11-07

Features

  • Stepper: 新增 name 属性 #4931
  • Uploader: 新增 deletable 属性 #4925

Bug Fixes

  • 修复 Sku 内容最小高度错误的问题 #4942
  • 修复 List 在初始化时可能同时触发两次 load 事件的问题 #4953
  • 修复 @border-color 变量无法定制某些组件边框颜色的问题 #4939

v2.2.11

2019-11-04

Features

  • Switch: 新增 click 事件 #4915
  • Switch: size 属性支持 number 类型 #4913
  • Toast: 默认持续时间由 3 秒调整为 2 秒 #4886
  • Uploader: 新增 closeImagePreview 方法 #4901

Bug Fixes

  • 修复 Button 加载图标颜色不正确的问题 #4868
  • 修复 CountDown 在销毁时未清除定时器的问题 #4918
  • 修复 CountDown 在 keep-alive 状态下未暂停定时器的问题 #4919
  • 修复 Grid 使用 icon 插槽时 info、dot 属性不生效的问题 #4902

v2.2.10

2019-10-27

Features

  • Icon: 新增 font-display: auto 样式 #4831
  • Popup: 新增 close-on-popstate 属性 #4845
  • Picker: 新增 swipe-duration 属性 #4816
  • Toast: 支持针对指定类型的 Toast 修改默认配置 #4848

Bug Fixes

  • 修复 Uploader 文件预览圆角样式错误的问题 #4846
  • 修复 DatetimePicker 同时使用 min-date 和 filter 时初始值错误的问题 #4837

v2.2.9

2019-10-20

Features

  • Tag: 新增 closeable 属性 #4763
  • Loading: 新增若干个 Less 变量 #4781
  • Progress: 新增若干个 Less 变量 #4790
  • Progress: 新增 track-color 属性 #4789
  • Toast: 新增 @toast-loading-icon-color 变量 #4782
  • Picker: 新增 @picker-loading-icon-color 变量 #4787
  • ImagePreview: 新增 cover 插槽 #4766

Bug Fixes

  • 修复 Tag 圆角不够圆的问题 #4762
  • 修复 Sku 重置时不触发 sku-selected 事件的问题 #4755
  • 修复 ImagePreview 点击索引时会关闭预览的问题 #4764
  • 修复 AddressEdit 设置 area-placeholder 后无法选择海外地址的问题 #4769

v2.2.8

2019-10-17

Features

  • Slider: 优化点击区域 #4701
  • Slider: 增加过渡动画 #4700
  • Dialog: 更新圆角样式 #4730
  • Uploader: 更新删除图标样式,添加图片圆角样式 #4712
  • Field: 新增 show-word-limit 属性 #4721
  • ActionSheet: 新增 description 属性 #4691
  • Stepper: 设置 decimal-length 属性后会在输入过程中进行校验 #4747
  • 新增渐变色相关的 Less 变量 #4752
  • 新增多行文字省略的内置样式 #4690

Bug Fixes

  • 修复 Slider 宽度异常的问题 #4699
  • 修复 Rate 由于 inline-block 导致的错误高度 #4693
  • 修复 AddressEdit 省市区未选择完全时能够保存的问题 #4724

v2.2.7

2019-10-11

Features

  • Dialog: 新增 width 属性 #4687
  • Dialog: 新增 overlay-class 属性 #4683
  • Dialog: 新增 overlay-style 属性 #4682
  • Uploader: 新增 file 类型的 result-type #4680
  • TreeSelect: 新增 className 选项 #4671

Bug Fixes

  • 修复 Dialog 可能出现文字模糊的问题 #4686
  • 修复 Stepper 的 step 值很小时无法生效的问题 #4675
  • 修复 DatetimePicker 动态修改时间范围时, confirm 事件无法获取到正确结果的问题 #4676
  • 修复 Field 同时设置 error 和 disabled 属性时文字颜色错误的问题 #4666

v2.2.6

2019-10-08

Features

  • Grid: 新增 icon-size 属性 #4656
  • Toast: 新增 transition 属性 #4638
  • Dialog: 新增 transition 属性 #4636
  • Dialog: 新增 open、close 事件 #4633
  • Dialog: 新增 opened、closed 事件 #4634
  • NumberKeyboard: 新增 extra-key 插槽 #4644
  • CheckboxGroup: 新增 toggleAll 方法 #4640

Bug Fixes

  • 修复 GoodsAction 圆角错误的问题 #4653
  • 修复 Tabs 类型为 card 时上边距错误的问题 #4658
  • 修复 AddressList input 事件重复触发的问题 #4659
  • 修复 NumberKeyboard 在 Vue 2.6 下的兼容问题 #4632

v2.2.5

2019-09-28

Features

  • Picker: 新增 columns-top 插槽 #4607
  • Picker: 新增 columns-bottom 插槽 #4607
  • Overlay: 新增 default 插槽 #4571
  • Overlay: 新增 custom-style 属性 #4572
  • Checkbox: 新增 bind-group 属性 #4600
  • DropdownItem: 新增 get-container 属性 #4611
  • Area: 新增 columns-placeholder 属性 #4580
  • AddressEdit: 新增 area-columns-placeholder 属性 #4584

Bug Fixes

  • 修复 Overlay 未添加 TypeScript 定义的问题 #4601
  • 修复 Swipe swipeTo 方法在某些边界情况下过渡动画不正确的问题 #4570
  • 修复 Uploader 预览 URL 相同的图片时索引错误的问题 #4577

v2.2.4 [已废弃]

2019-09-28 ????????

Tips

  • 本版本存在样式丢失问题,请使用 2.2.5 版本

v2.2.3

2019-09-24

Features

  • Cell: 优化无障碍访问 #4519
  • Popup: 优化无障碍访问 #4516
  • Search: 优化无障碍访问 #4522
  • Picker: 优化无障碍访问 #4521
  • GridItem: 优化无障碍访问 #4517
  • ActionSheet: 优化无障碍访问 #4525
  • Sku: 新增 previewImgUrl 字段 #4562
  • RadioGroup: 新增 icon-size 属性 #4529
  • RadioGroup: 新增 checked-color 属性 #4532
  • CheckboxGroup: 新增 icon-size 属性 #4530
  • CheckboxGroup: 新增 checked-color 属性 #4531
  • ActionSheet: 默认开启 round 属性 #4542
  • ActionSheet: 默认开启 safe-area-inset-bottom 属性 #4524
  • NumberKeyboard: 默认开启 safe-area-inset-bottom 属性 #4544

v2.2.2

2019-09-19

Features

  • Dialog: 优化文字换行 #4506
  • Search: 新增 action-text 属性 #4501
  • Popup: 新增 close-icon-position 属性 #4507
  • Uploader: 回调函数增加 index 参数 #4460
  • GoodsActionButton: 加大按钮高度 #4461
  • AddressList: 新增 @address-list-item-radio-icon-color 变量 #4481

Bug Fixes

  • 修复 Field 禁用状态在 safari 上文字颜色过浅的问题 #4508
  • 修复 DatetimePicker 选项为纯文字时陷入死循环的问题 #4485
  • 修复 ImagePreview 手势缩放时可能出现缩放比例异常的问题 #4477

v2.2.1

2019-09-12

Features

  • Icon: 新增 dot 属性 #4425
  • Icon: 新增 down、wap-home 图标 #4404
  • GridItem: 新增 dot 属性 #4426
  • GridItem: 新增 info 属性 #4424
  • TreeSelect: 新增 dot 选项 #4433
  • Tab: 新增 to、url、replace 属性 #4422
  • Progress: 新增 stroke-width 属性 #4397
  • Popup: 新增 safe-area-inset-bottom 属性 #4419
  • Stepper: 新增 decimal-length 属性 #4443
  • Sku: 新增 stock-threshold 属性 #4444
  • Sku: 新增 safe-area-inset-bottom 属性 #4428
  • SidebarItem: 新增 dot 属性 #4432
  • Sku: 优化样式细节 #4437
  • Circle: 优化文本样式 #4401

Bug Fixes

  • 修复 Sku 按钮位置可能错误的问题 #4427
  • 修复 Uploader 删除时会触发 click-preview 事件的问题 #4407
  • 修复 Progress 文字位置不准确的问题 #4396

v2.2.0

2019-09-06

Features

  • Style: 更新基础红色为 #ee0a24 #4368
  • Rate: 新增 touchable 属性 #4361
  • Rate: 布局调整为 inline-block #4334
  • Rate: 优化手势滑动的流畅度 #4336
  • Popup: 新增 closeable 属性 #4362
  • Popup: 新增 close-icon 属性 #4366
  • Sidebar: 移除了内外边框 #4382
  • SidebarItem 新增 disabled 属性 #4325
  • TreeSelect: 新增 max 属性 #4323
  • TreeSelect: 支持通过 info 展示徽标 #4384
  • Uploader: 新增 close-preview 事件 #4376
  • ImagePreview: 新增图片加载过程的提示 #4378

Bug Fixes

  • 修复 Field 在 Safari 浏览器上样式异常的问题 #4380
  • 修复 Button 在 color 属性中传入渐变色时边框颜色错误的问题 #4342
  • 修复 Dialog 关闭时未重置按钮加载状态的问题 #4352
  • 修复 Slider 初始值超出范围时展示错误的问题 #4337
  • 修复 Sidebar 徽标位置错误的问题 #4324
  • 修复 DropdownItem 选项选中态颜色丢失的问题 #4330
  • 修复 NumberKeyboard 在 iphoneX 上右侧按钮位置错误的问题 #4304
  • 修复 ImagePreview 在关闭后未重置图片缩放状态的问题 #4319
  • 修复 ImagePreview 在某些情况下页码不正确的问题 #4320

v2.1.8

2019-08-29

Features

  • Picker: 新增 allow-html 属性 #4278
  • PasswordInput: 新增 focused 属性 #4279
  • GoodsActionButton: 新增 color 属性 #4255
  • Button: color 属性支持传入 linear-gradient 渐变色 #4252

Bug Fixes

  • 修复 Circle stroke-width 超过 60 时样式错误的问题 #4256
  • 修复 Picker 滑动暂停时位置错误的问题 #4277
  • 修复 Picker 滑动结束时触发点击会跳动的问题 #4273

v2.1.7

2019-08-26

Bug Fixes

  • 修复 RadioGroup 设置 disabled 属性后仍能切换的问题 #4242
  • 修复 CheckboxGroup 设置 disabled 属性后仍能切换的问题 #4242

v2.1.6

2019-08-26

Features

  • Tag: 新增 warning 类型 #4232
  • Image: 新增 radius 属性 #4230
  • Notify: 新增 type 属性 #4237
  • CellGroup: 新增 title 插槽 #4227
  • Sku: 支持动态设置 initial-sku 属性 #4214
  • Sku: 支持预览更高层级的规格类目图片 #4236
  • Locale: 支持西班牙语 #4235

Bug Fixes

  • 修复 Tabbar 在 route 模式下选中样式错误的问题 #4229
  • 修复 NumberKeyboard 使用 title 属性时按钮位置错误的问题 #4228
  • 修复 IndexBar 在 sticky 模式下锚点位置可能超出元素边界的问题 #4218

v2.1.5

2019-08-23

Features

  • Toast: 新增 closeOnClick 选项 #4192
  • Uploader: 新增 image-fit 属性 #4189
  • Uploader: 新增 click-preview 事件 #4206
  • Uploader: 新增 preview-full-image 属性 #4205
  • DropdownMenu: 新增 @dropdown-menu-title-active-text-color less 变量 #4208

Bug Fixes

  • 修复 Area 无法选中部分海外地址的问题 #4195
  • 修复 IndexBar 在局部滚动容器内计算错误的问题 #4184
  • 修复 NumberKeyboard 按键边框颜色错误的问题 #4183

v2.1.4

2019-08-21

Features

  • Col: 新增 click 事件 #4169
  • Row: 新增 click 事件 #4170
  • Area: 新增 is-oversea-code 属性 #4163
  • Circle: 支持渐变色 #4157
  • Circle: 支持传入 number 类型的 size 属性 #4160
  • Tabbar: 支持通过 to.name 匹配路由 #4148
  • Sku: 页面返回时自动关闭图片预览 #4152
  • Uploader: 页面返回时自动关闭图片预览 #4151
  • Uploader: 图片预览支持更多图片格式 #4140
  • TreeSelect: 支持多选 #4130
  • TreeSelect: 支持在 active-id 属性上使用 sync 修饰符 #4133
  • TreeSelect: 支持在 main-active-index 属性上使用 sync 修饰符 #4132

Bug Fixes

  • 修复 Sku 部分文案不支持国际化修改的问题 #4172
  • 修复 Field 按钮在 Firefox 上宽度变小的问题 #4144
  • 修复 Tabbar 触发 vue-router 路由重复跳转提示的问题 #4147
  • 修复 Picker 样式可能被重复引入的 base 样式覆盖的问题 #4136

v2.1.3

2019-08-15

Features

  • Sku: 支持国际化 #4123
  • Button: 新增 color 属性 #4124
  • Uploader: 新增 before-delete 属性 #4118
  • Collapse: 新增 value 属性类型错误时的提示 #4122
  • TreeSelect: 新增 content 插槽 #4105
  • TreeSelect: 支持 string 类型的 height 属性 #4107
  • NumberKeyboard: 优化点击体验 #4116

Bug Fixes

  • 修复 DropdownMenu 嵌套在 NavBar 内时样式错误的问题 #4098
  • 修复 Tab 动态插入标签页时下划线位置未更新的问题 #4091
  • 修复 Icon service-o 图标不完整的问题 #4088
  • 修复 Icon gift-o、refund-o 图标不完整的问题 #4089
  • 修复 Slider 位置未改变时也会触发 change 事件的问题 #4087

v2.1.2

2019-08-10

介绍

Vant 提供了一套默认主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。如果你想完全替换主题色或者其他样式,可以使用下面提供的方法。

示例工程

我们提供了一个基于 Vue Cli 3 的示例工程,仓库地址为 Vant Demo,其中包含了定制主题的基本配置,可以作为参考。

样式变量

Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,通过替换样式变量即可定制你自己需要的主题。

下面是一些基本的样式变量,所有可用的颜色变量请参考 配置文件

// Component Colors@text-color: #323233;@border-color: #ebedf0;@active-color: #f2f3f5;@background-color: #f7f8fa;@background-color-light: #fafafa;

定制方法

步骤一 引入样式源文件

定制主题时,需要引入组件对应的 Less 样式文件,支持按需引入和手动引入两种方式。

按需引入样式(推荐)

在 babel.config.js 中配置按需引入样式源文件,注意 babel6 不支持按需引入样式,请手动引入样式

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: {            modifyVars: {              // 直接覆盖变量              'text-color': '#111',              'border-color': '#eee'              // 或者可以通过 less 文件覆盖(文件路径为绝对路径)              'hack': `true; @import "your-less-file-path.less";`            }          }        }      ]    }  ]};


实例演示

介绍

感谢你使用 Vant。

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

Issue 规范

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

参与开发

本地开发

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

# 克隆仓库git clone git@github.com:youzan/vant.git# 安装依赖cd vant && npm run bootstrap# 进入开发模式,浏览器访问 http://localhost:8080npm run dev

目录结构

  • 仓库的组件代码位于 src 下,每个组件一个文件夹
  • docs 目录下是文档网站的代码,本地开发时可以在目录下运行 npm run dev 开启文档网站

项目主要目录如下:

vant├─ build     # 构建├─ docs      # 文档├─ src       # 组件├─ packages  # 子包├─ test      # 单测└─ types     # 类型

添加新组件

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

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

提交 PR

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 现有的设计资源,更多资源还在整理中。

组件

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

下载

提示:目前 Sketch 中部分组件仍为旧版样式,我们正在梳理新版设计规范,尽请期待!

图标

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

下载


实例演示

介绍

在参与 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" />

Props 换行

多个 Props 的元素应该分多行撰写,每个 Props 一行,闭合标签单起一行。

<!-- bad --><my-component foo="a" bar="b" baz="c" /><!-- good --><my-component  foo="a"  bar="b"  baz="c"/>

指令缩写

指令缩写,用 : 表示 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: '',  mixins: [],  components: {},  props: {},  data() {},  computed: {},  watch: {},  created() {},  mounted() {},  destroyed() {},  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/lib/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
英语en-US
土耳其语tr-TR
西班牙语es-ES
在 这里 查看所有的 i18n 配置文件。

Sku 组件

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


实例演示

引入

import Vue from 'vue';import { Button } from 'vant';Vue.use(Button);

代码演示

按钮类型

支持default、primary、info、warning、danger五种类型,默认为default

<van-button type="default">默认按钮</van-button><van-button type="primary">主要按钮</van-button><van-button type="info">信息按钮</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="info">朴素按钮</van-button>

细边框

设置hairline属性可以开启 0.5px 边框,基于伪类实现

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

禁用状态

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

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

加载状态

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

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

按钮形状

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

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

图标按钮

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

<van-button icon="star-o" type="primary" /><van-button icon="star-o" type="primary">按钮</van-button><van-button icon="https://img.yzcdn.cn/vant/logo.png" type="info">按钮</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, #4bb0ff, #6149f6)">渐变色按钮</van-button>

API

Props

参数说明类型默认值
type类型,可选值为 primary info warning dangerstringdefault
size尺寸,可选值为 large small ministringnormal
text按钮文字string-
color v2.1.8按钮颜色,支持传入linear-gradient渐变色string-
icon左侧 图标名称 或图片链接string-
tagHTML 标签stringbutton
native-type原生 button 标签 type 属性string-
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: Event
touchstart开始触摸按钮时触发event: TouchEvent

以下是一个简单示例:

<!DOCTYPE html><html lang="zh"><head>  <meta charset="UTF-8" />  <meta name="viewport" content="width=device-width, initial-scale=1.0" />  <meta http-equiv="X-UA-Compatible" content="ie=edge" />  <title>W3Cschool(51coolma.cn)</title>  <!-- 引入样式 -->  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.10/lib/index.css" rel="external nofollow" target="_blank"  />  <!-- 引入组件 -->  <script src="https://cdn.jsdelivr.net/npm/vue@2.6/dist/vue.min.js" rel="external nofollow" ></script>  <script src="https://cdn.jsdelivr.net/npm/vant@2.10/lib/vant.min.js" rel="external nofollow" ></script></head><body>  <div id="app">    <div>      <p>按钮类型</p>      <van-button type="primary">主要按钮</van-button>      <van-button type="info">信息按钮</van-button>      <van-button type="default">默认按钮</van-button>      <van-button type="danger">危险按钮</van-button>      <van-button type="warning">警告按钮</van-button>    </div>    <div>      <p>朴素按钮</p>      <van-button plain type="primary">朴素按钮</van-button>      <van-button plain type="info">朴素按钮</van-button>    </div>    <div>      <p>细边框</p>      <van-button plain hairline type="primary">细边框按钮</van-button>      <van-button plain hairline type="info">细边框按钮</van-button>    </div>    <div>      <p>禁用状态</p>      <van-button disabled type="primary">禁用状态</van-button>      <van-button disabled type="info">禁用状态</van-button>    </div>    <div>      <p>加载状态</p>      <van-button loading type="primary" />      <van-button loading type="primary" loading-type="spinner" />      <van-button loading type="info" loading-text="加载中..." />    </div>    <div>      <p>按钮形状</p>      <van-button square type="primary">方形按钮</van-button>      <van-button round type="info">圆形按钮</van-button>    </div>  </div></body><script>  var app = new Vue({    el: '#app',    data: {    },    methods: {    },    created() {    },  })</script></html>


实例演示

引入

import Vue from 'vue';import { Cell, CellGroup } from 'vant';Vue.use(Cell);Vue.use(CellGroup);

代码演示

基础用法

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

<van-cell-group>  <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时,内容会靠左对齐

<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 slot="title">    <span class="custom-title">单元格</span>    <van-tag type="danger">标签</van-tag>  </template></van-cell><van-cell title="单元格" icon="shop-o">  <!-- 使用 right-icon 插槽来自定义右侧图标 -->  <van-icon    slot="right-icon"    name="search"    style="line-height: inherit;"  /></van-cell>

垂直居中

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

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

API

CellGroup Props

参数说明类型默认值
title分组标题string-
border是否显示外边框booleantrue

Cell Props

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

Cell Events

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

CellGroup Slots

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

Cell Slots

名称说明
default自定义右侧内容
title自定义左侧标题
label自定义标题下方描述
icon自定义左侧图标
right-icon自定义右侧按钮,默认为arrow


实例演示

介绍

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

引入

import Vue from 'vue';import { Icon } from 'vant';Vue.use(Icon);

代码演示

基础用法

Icon的name属性支持传入图标名称或图片链接,所有可用的图标名称见右侧示例

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

提示信息

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

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

图标颜色

Icon的color属性用来设置图标的颜色

<van-icon name="chat-o" color="#1989fa" /><van-icon name="chat-o" color="#07c160" />

图标大小

Icon的size属性用来设置图标的尺寸大小,默认单位为px

<van-icon name="chat-o" size="40" /><van-icon name="chat-o" size="3rem" />

使用本地字体文件

Icon 组件默认引用有赞 CDN 提供的字体文件,并通过网络下载。如果需要在项目中使用本地字体文件,请引入下面的 CSS 文件,并在项目中配置url-loader

import 'vant/lib/icon/local.css';

自定义图标

如果需要在现有 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" />

API

Props

参数说明类型默认值
name图标名称或图片链接string-
dot v2.2.1是否显示图标右上角小红点booleanfalse
info图标右上角徽标的内容number | string-
color图标颜色stringinherit
size图标大小,如 20px 2em,默认单位为pxnumber | stringinherit
class-prefix类名前缀stringvan-icon
tagHTML 标签stringi

Events

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


实例演示

介绍

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

引入

import Vue from 'vue';import { Image } from 'vant';Vue.use(Image);

代码演示

基础用法

基础用法与原生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 Vue from 'vue';import { Lazyload } from 'vant';Vue.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 v2.1.6圆角大小,默认单位为pxnumber | string0
round是否显示为圆形booleanfalse
lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
show-error v2.0.9是否展示图片加载失败提示booleantrue
show-loading v2.0.9是否展示图片加载中提示booleantrue
error-icon v2.4.2失败时提示的 图标名称 或图片链接stringwarning-o
loading-icon v2.4.2加载时提示的 图标名称 或图片链接stringphoto-o

图片填充模式

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

Events

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

Slots

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


实例演示

介绍

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

引入

import Vue from 'vue';import { Col, Row } from 'vant';Vue.use(Col);Vue.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>

Flex 布局

将 type 属性设置为 flex 可以启用 flex 布局,便于进行灵活的对齐

<!-- 左对齐 --><van-row type="flex">  <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 type="flex" 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 type="flex" 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 type="flex" 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 type="flex" 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

参数说明类型默认值
type布局方式,可选值为flexstring-
gutter列元素之间的间距(单位为px)number | string-
tag自定义元素标签stringdiv
justifyFlex 主轴对齐方式,可选值为 end center
space-around space-between
stringstart
alignFlex 交叉轴对齐方式,可选值为 center bottomstringtop

Col Props

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

Row Events

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

Col Events

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

实例演示

代码:

<body ontouchstart="">    <div>        <div class="demo-nav" style="">            <div class="demo-nav__title">Col</div>            <svg viewBox="0 0 1000 1000" class="demo-nav__back">                <path fill="#969799" fill-rule="evenodd" d="M296.114 508.035c-3.22-13.597.473-28.499 11.079-39.105l333.912-333.912c16.271-16.272 42.653-16.272 58.925 0s16.272 42.654 0 58.926L395.504 498.47l304.574 304.574c16.272 16.272 16.272 42.654 0 58.926s-42.654 16.272-58.926 0L307.241 528.058a41.472 41.472 0 0 1-11.127-20.023z"></path>            </svg>        </div>        <section class="van-doc-demo-section demo-col">            <div class="van-doc-demo-block">                <h2 class="van-doc-demo-block__title">基础用法</h2>                <div class="van-row"><div class="van-col van-col--8">span: 8</div>                <div class="van-col van-col--8">span: 8</div>                <div class="van-col van-col--8">span: 8</div>            </div>            <div class="van-row">                <div class="van-col van-col--4">span: 4</div>                <div class="van-col van-col--10 van-col--offset-4"> offset: 4, span: 10</div>            </div>            <div class="van-row">                <div class="van-col van-col--12 van-col--offset-12">offset: 12, span: 12</div>            </div>            <div class="van-doc-demo-block">                <h2 class="van-doc-demo-block__title">在列元素之间增加间距</h2>                <div class="van-row">                    <div class="van-col van-col--8" style="padding-right: 13.3333px;">span: 8</div>                    <div class="van-col van-col--8" style="padding-left: 6.66667px; padding-right: 6.66667px;">span: 8</div>                    <div class="van-col van-col--8" style="padding-left: 13.3333px; padding-right: 1.77636e-15px;">span: 8</div>                </div>            </div>            <div class="van-doc-demo-block">                <h2 class="van-doc-demo-block__title">Flex 布局</h2>                <div class="van-row van-row--flex">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-center">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-end">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-space-between">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>                <div class="van-row van-row--flex van-row--justify-space-around">                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                    <div class="van-col van-col--6">span: 6</div>                </div>            </div>        </section>    </div><script src="https://b.yzcdn.cn/vant/async_chunks.a839cbb5.js" rel="external nofollow" ></script><script src="https://b.yzcdn.cn/vant/site-mobile.ea70a230.js" rel="external nofollow" ></script></body>

运行效果:

Vant Layout 布局


实例演示

介绍

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

引入

import Vue from 'vue';import { Popup } from 'vant';Vue.use(Popup);

代码演示

基础用法

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

<van-cell is-link @click="showPopup">展示弹出层</van-cell><van-popup v-model="show">内容</van-popup>
export default {  data() {    return {      show: false    }  },  methods: {    showPopup() {      this.show = true;    }  }};

弹出位置

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

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

关闭图标

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

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

圆角弹窗

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

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

指定挂载位置

弹出层默认挂载到组件所在位置,可以通过get-container属性指定挂载位置

<!-- 挂载到 body 节点下 --><van-popup v-model="show" get-container="body" /><!-- 挂载到 #app 节点下 --><van-popup v-model="show" get-container="#app" /><!-- 通过函数指定挂载位置 --><van-popup v-model="show" :get-container="getContainer" />
export default {  methods: {    // 返回一个特定的 DOM 节点,作为挂载的父节点    getContainer() {      return document.querySelector('.my-container');    }  }}
注意:使用 get-container 属性的组件不能为根节点

API

Props

参数说明类型默认值
v-model当前组件是否显示booleanfalse
overlay是否显示遮罩层booleantrue
position弹出位置,可选值为 top bottom right leftstringcenter
overlay-class自定义遮罩层类名string-
overlay-style自定义遮罩层样式object-
duration动画时长,单位秒number | string0.3
round v2.0.7是否显示圆角booleanfalse
lock-scroll是否锁定背景滚动booleantrue
lazy-render是否在显示弹层时才渲染节点booleantrue
close-on-popstate v2.2.10是否在页面回退时自动关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
closeable v2.2.0是否显示关闭图标booleanfalse
close-icon v2.2.0关闭图标名称或图片链接stringcross
close-icon-position v2.2.2关闭图标位置,可选值为top-left
bottom-left bottom-right
stringtop-right
transition动画类名,等价于 transtion 的name属性string-
get-container指定挂载的节点string | () => Element-
safe-area-inset-bottom v2.2.1是否开启 底部安全区适配booleanfalse

Events

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


实例演示

介绍

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>

动画

可以通过 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>


实例演示

介绍

日历组件用于选择日期或日期区间,2.4 版本开始支持此组件

引入

import Vue from 'vue';import { Calendar } from 'vant';Vue.use(Calendar);

代码演示

选择单个日期

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

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

选择日期区间

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

<van-cell title="选择日期区间" :value="date" @click="show = true" /><van-calendar v-model="show" type="range" @confirm="onConfirm" />
export default {  data() {    return {      date: '',      show: false    };  },  methods: {    formatDate(date) {      return `${date.getMonth() + 1}/${date.getDate()}`;    },    onConfirm(date) {      const [start, end] = date;      this.show = false;      this.date = `${this.formatDate(start)} - ${this.formatDate(end)}`;    }  }};

快捷选择

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

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

自定义颜色

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

<van-calendar v-model="show" color="#07c160" />

自定义日期范围

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

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

自定义按钮文字

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

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

自定义日期文案

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

<van-calendar  v-model="show"  type="range"  :formatter="formatter"/>
export default {  methods: {    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;    }  }}

自定义弹出位置

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

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

日期区间最大范围

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

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

平铺展示

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

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

API

Props

参数说明类型默认值
v-model是否显示日历弹窗booleanfalse
type选择类型,single表示选择单个日期,
range表示选择日期区间
stringsingle
title日历标题string日期选择
color颜色,对底部按钮和选中日期生效string#ee0a24
min-date最小日期Date当前日期
max-date最大日期Date当前日期的六个月后
default-date默认选中的日期Date | Date[]今天
row-height日期行高number | string64
formatter日期格式化函数(day: Day) => Day-
position弹出位置,可选值为 top right leftstringbottom
poppable是否以弹层的形式展示日历booleantrue
round是否显示圆角弹窗booleantrue
show-mark是否显示月份背景水印booleantrue
show-confirm是否展示确认按钮booleantrue
close-on-popstate v2.4.4是否在页面回退时自动关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
safe-area-inset-bottom是否开启 底部安全区适配booleantrue
confirm-text确认按钮的文字string确定
confirm-disabled-text确认按钮处于禁用状态时的文字string确定
max-range v2.4.3日期区间最多可选天数,默认无限制number | string-
range-prompt v2.4.3选择超过区间范围时的提示文案string选择天数不能超过 xx 天
get-container v2.4.4指定挂载的节点,用法示例string | () => Element-

Day 数据结构

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

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

Events

事件名说明回调参数
select点击任意日期时触发value: Date | Date[]
confirm日期选择完成后触发,若show-confirmtrue,则点击确认按钮后触发value: Date | Date[]

Slots

名称说明
title自定义标题
footer自定义底部区域内容

方法

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

方法名说明参数返回值
reset重置选中的日期到默认值--

常见问题

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

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

对此问题的详细解释:stackoverflow


实例演示

引入

import Vue from 'vue';import { Checkbox, CheckboxGroup } from 'vant';Vue.use(Checkbox);Vue.use(CheckboxGroup);

代码演示

基础用法

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

<van-checkbox v-model="checked">复选框</van-checkbox>
export default {  data() {    return {      checked: true    };  }};

禁用状态

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

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

禁用文本点击

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

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

自定义形状

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

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

自定义颜色

通过checked-color属性可以自定义选中状态下的图标颜色

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

自定义大小

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

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

自定义图标

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

<van-checkbox v-model="checked">  自定义图标  <img    slot="icon"    slot-scope="props"    :src="props.checked ? activeIcon : inactiveIcon"  ></van-checkbox>
export default {  data() {    checked: true,    activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',    inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png'  }}

复选框组

复选框可以与复选框组一起使用,选中值是一个数组,通过v-model绑定在CheckboxGroup上,数组中的值为选中的复选框的name

<van-checkbox-group v-model="result">  <van-checkbox name="a">复选框 a</van-checkbox>  <van-checkbox name="b">复选框 b</van-checkbox>  <van-checkbox name="c">复选框 c</van-checkbox></van-checkbox-group>
export default {  data() {    return {      result: ['a', 'b']    };  }};

设置最大可选数

通过max属性可以限制最大可选数

<van-checkbox-group v-model="result" :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="result" 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="info" @click="toggleAll">反选</van-button>
export default {  data() {    return {      result: []    }  },  methods: {    checkAll() {      this.$refs.checkboxGroup.toggleAll(true);    },    toggleAll() {      this.$refs.checkboxGroup.toggleAll();    }  }}

搭配单元格组件使用

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

<van-checkbox-group v-model="result">  <van-cell-group>    <van-cell      v-for="(item, index) in list"      clickable      :key="item"      :title="`复选框 ${item}`"      @click="toggle(index)"    >      <van-checkbox        :name="item"        ref="checkboxes"        slot="right-icon"      />    </van-cell>  </van-cell-group></van-checkbox-group>
export default {  methods: {    toggle(index) {      this.$refs.checkboxes[index].toggle();    }  }}

API

Checkbox Props

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

CheckboxGroup Props

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

Checkbox Events

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

CheckboxGroup Events

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

Checkbox Slots

名称说明SlotProps
default自定义文本-
icon自定义图标checked: 是否为选中状态

CheckboxGroup 方法

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

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

Checkbox 方法

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

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


实例演示

介绍

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

引入

import Vue from 'vue';import { DatetimePicker } from 'vant';Vue.use(DatetimePicker);

代码演示

选择完整时间

<van-datetime-picker  v-model="currentDate"  type="datetime"  :min-date="minDate"  :max-date="maxDate"/>
export default {  data() {    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate: new Date()    };  }};

选择日期(年月日)

<van-datetime-picker  v-model="currentDate"  type="date"  :min-date="minDate"  :max-date="maxDate"/>
export default {  data() {    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate: new Date()    };  }};

选择日期(年月)

通过传入formatter函数,可以对选项文字进行格式化处理

<van-datetime-picker  v-model="currentDate"  type="year-month"  :min-date="minDate"  :max-date="maxDate"  :formatter="formatter"/>
export default {  data() {    return {      minDate: new Date(2020, 0, 1),      maxDate: new Date(2025, 10, 1),      currentDate: new Date()    };  },  methods: {    formatter(type, val) {      if (type === 'year') {        return `${val}年`;      } else if (type === 'month') {        return `${val}月`      }      return val;    }  }}

选择时间

<van-datetime-picker  v-model="currentTime"  type="time"  :min-hour="10"  :max-hour="20"/>
export default {  data() {    return {      currentTime: '12:00'    };  }};

选项过滤器

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

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

API

Props

参数说明类型默认值
type类型,可选值为 date
time year-month
stringdatetime
title顶部栏标题string''
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
show-toolbar是否显示顶部栏booleantrue
loading是否显示加载状态booleanfalse
filter选项过滤函数(type, vals) => vals-
formatter选项格式化函数(type, val) => val-
item-height选项高度number | string44
visible-item-count可见的选项个数number | string5
swipe-duration v2.2.13快速滑动时惯性滚动的时长,单位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当值变化时触发的事件picker: Picker 实例
confirm点击完成按钮时触发的事件value: 当前选中的时间
cancel点击取消按钮时触发的事件-

方法

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

方法名说明参数返回值
getPicker v2.4.0获取 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 Vue from 'vue';import { Field } from 'vant';Vue.use(Field);

代码演示

基础用法

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

<!-- Field 是基于 Cell 实现的,可以使用 CellGroup 作为父元素来提供外边框。 --><van-cell-group>  <van-field v-model="value" placeholder="请输入用户名" /></van-cell-group>
export default {  data() {    return {      value: ''    };  }}

自定义类型

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

<!-- 输入任意文本 --><van-field v-model="text" label="文本" /><!-- 输入手机号,调起手机号键盘 --><van-field v-model="tel" type="tel" label="手机号" /><!-- 允许输入整数,调起数字键盘 --><van-field v-model="digit" type="digit" label="整数" /><!-- 允许输入数字,调起全键盘 --><van-field v-model="number" type="number" label="数字" /><!-- 输入密码 --><van-field v-model="password" type="password" label="密码" />
export default {  data() {    return {      tel: '',      text: '',      digit: '',      number: '',      password: ''    };  }}
Tips: digit 类型从 2.4.2 版本开始支持

禁用输入框

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

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

显示图标

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

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

错误提示

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

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

插入按钮

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

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

格式化输入内容

通过formatter属性可以对输入的内容进行格式化

<van-field  v-model="value"  label="文本"  :formatter="formatter"  placeholder="格式化输入内容"/>
export default {  data() {    return {      value: ''    };  },  methods: {    formatter(value) {      // 过滤输入的数字      return value.replace(/d/g, '');    }  }}

高度自适应

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

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

显示字数统计

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

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

输入框内容对齐

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

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

API

Props

参数说明类型默认值
label输入框左侧文本string-
value当前输入的值number | string-
type输入框类型, 可选值为 tel digit
number textarea password 等
stringtext
size大小,可选值为 largestring-
maxlength输入的最大字符数number | string-
placeholder占位提示文字string-
border是否显示内边框booleantrue
disabled是否禁用输入框booleanfalse
readonly是否只读booleanfalse
required是否显示表单必填星号booleanfalse
clearable是否启用清除控件booleanfalse
clickable是否开启点击反馈booleanfalse
is-link是否展示右侧箭头并开启点击反馈booleanfalse
autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
show-word-limit v2.2.8是否显示字数统计,需要设置maxlength属性booleanfalse
error是否将输入内容标红booleanfalse
formatter v2.4.2输入内容格式化函数Function-
arrow-direction v2.0.4箭头方向,可选值为 left up downstringright
error-message底部错误提示文案,为空时不展示string''
label-class左侧文本额外类名any-
label-width左侧文本宽度,默认单位为pxnumber | string90px
label-align左侧文本对齐方式,可选值为 center rightstringleft
input-align输入框内容对齐方式,可选值为 center rightstringleft
error-message-align错误提示文案对齐方式,可选值为 center rightstringleft
autosize是否自适应内容高度,只对 textarea 有效,
可传入对象,如 { maxHeight: 100, minHeight: 50 },
单位为px
boolean | objectfalse
left-icon左侧 图标名称 或图片链接string-
right-icon右侧 图标名称 或图片链接string-

Events

除下列事件外,Field 默认支持 Input 标签所有的原生事件

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

方法

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

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

Slots

名称说明
label自定义输入框标签
input自定义输入框,使用此插槽后,与输入框相关的属性和事件将失效
left-icon自定义输入框头部图标
right-icon自定义输入框尾部图标
button自定义输入框尾部按钮


实例演示

介绍

数字键盘,提供两种样式风格,可以与密码输入框或自定义的输入框组件配合使用

引入

import Vue from 'vue';import { NumberKeyboard } from 'vant';Vue.use(NumberKeyboard);

代码演示

默认样式

<van-button @touchstart.stop="show = true">  弹出默认键盘</van-button><van-number-keyboard  :show="show"  extra-key="."  close-button-text="完成"  @blur="show = false"  @input="onInput"  @delete="onDelete"/>
import { Toast } from 'vant';export default {  data() {    return {      show: true    }  },  methods: {    onInput(value) {      Toast(value);    },    onDelete() {      Toast('删除');    }  }}

自定义样式

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

双向绑定

可以通过v-model绑定键盘当前输入值

<van-field  readonly  clickable  :value="value"  @touchstart.native.stop="show = true"/><van-number-keyboard  v-model="value"  :show="show"  :maxlength="6"  @blur="show = false"/>
export default {  data() {    return {      show: false,      value: ''    }  }}

左下角按键内容

通过extra-key属性可以设置左下角按键内容

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

键盘标题

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

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

API

Props

参数说明类型默认值
v-model v2.0.2当前输入值string-
show是否显示键盘boolean-
theme样式风格,可选值为 default customstringdefault
title键盘标题string-
maxlength v2.0.2输入值最大长度number | string-
transition是否开启过场动画booleantrue
z-index键盘 z-indexnumber | string100
extra-key左下角按键内容string''
close-button-text关闭按钮文字,空则不展示string-
delete-button-text删除按钮文字string删除
show-delete-key是否展示删除按钮booleantrue
hide-on-click-outside点击外部时是否收起键盘booleantrue
safe-area-inset-bottom是否开启 底部安全区适配booleantrue

Events

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

Slots

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

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

介绍

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

引入

import Vue from 'vue';import { PasswordInput, NumberKeyboard } from 'vant';Vue.use(PasswordInput);Vue.use(NumberKeyboard);

代码演示

基础用法

<!-- 密码输入框 --><van-password-input  :value="value"  info="密码为 6 位数字"  :focused="showKeyboard"  @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard  :show="showKeyboard"  @input="onInput"  @delete="onDelete"  @blur="showKeyboard = false"/>
export default {  data() {    return {      value: '123',      showKeyboard: true    };  },  methods: {    onInput(key) {      this.value = (this.value + key).slice(0, 6);    },    onDelete() {      this.value = this.value.slice(0, this.value.length - 1);    }  }}

自定义长度

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

明文展示

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

错误提示

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

<!-- 密码输入框 --><van-password-input  :value="value"  :error-info="errorInfo"  :focused="showKeyboard"  @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard  :show="showKeyboard"  @input="onInput"  @delete="onDelete"  @blur="showKeyboard = false"/>
export default {  data() {    return {      value: '123',      showKeyboard: true,      errorInfo: ''    };  },  methods: {    onInput(key) {      this.value = (this.value + key).slice(0, 6);      if (this.value.length === 6) {        this.errorInfo = '密码错误';      } else {        this.errorInfo = '';      }    },    onDelete() {      this.value = this.value.slice(0, this.value.length - 1);    }  }}

API

Props

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

Events

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


实例演示

介绍

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

引入

import Vue from 'vue';import { Picker } from 'vant';Vue.use(Picker);

代码演示

基础用法

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

<van-picker :columns="columns" @change="onChange" />
import { Toast } from 'vant';export default {  data() {    return {      columns: ['杭州', '宁波', '温州', '嘉兴', '湖州']    };  },  methods: {    onChange(picker, value, index) {      Toast(`当前值:${value}, 当前索引:${index}`);    }  }};

默认选中项

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

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

展示顶部栏

设置show-toolbar属性后会展示顶部操作栏,点击确认按钮触发confirm事件,点击取消按钮触发cancel事件

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

多列选择

通过columns属性可以配置多列选择

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

级联选择

使用columns的children字段可以实现选项级联的效果(从 2.4.5 版本开始支持)

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

禁用选项

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

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

动态设置选项

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

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

加载状态

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

<van-picker :columns="columns" :loading="loading" />
export default {  data() {    return {      columns: [],      loading: true    };  },  created() {    setTimeout(() => {      this.loading = false;      this.columns = ['选项'];    }, 1000);  }};

搭配弹出层使用

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

<van-field  readonly  clickable  label="城市"  :value="value"  placeholder="选择城市"  @click="showPicker = true"/><van-popup v-model="showPicker" position="bottom">  <van-picker    show-toolbar    :columns="columns"    @cancel="showPicker = false"    @confirm="onConfirm"  /></van-popup>
export default {  data() {    return {      value: '',      showPicker: false,      columns: ['杭州', '宁波', '温州', '嘉兴', '湖州']    }  },  methods: {    onConfirm(value) {      this.value = value;      this.showPicker = false;    }  }};

API

Props

参数说明类型默认值
columns对象数组,配置每一列显示的数据Column[][]
title顶部栏标题string-
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
value-key选项对象中,选项文字对应的键名stringtext
toolbar-position顶部栏位置,可选值为bottomstringtop
loading是否显示加载状态booleanfalse
show-toolbar是否显示顶部栏booleanfalse
allow-html v2.1.8是否允许选项内容中渲染 HTMLbooleantrue
default-index单列选择时,默认选中项的索引number | string0
item-height选项高度number | string44
visible-item-count可见的选项个数number | string5
swipe-duration v2.2.10快速滑动时惯性滚动的时长,单位msnumber | string1000

Events

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

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

Slots

名称说明
default自定义顶部栏内容
title自定义标题内容
columns-top自定义选项上方内容
columns-bottom自定义选项下方内容

Column 数据结构

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

键名说明类型
values列中对应的备选值string[]
defaultIndex初始选中项的索引,默认为 0number
className为对应列添加额外的类名any
children v2.4.5级联选项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 v2.4.0停止惯性滚动并触发 confirm 事件--

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { RadioGroup, Radio } from 'vant';Vue.use(Radio);Vue.use(RadioGroup);

代码演示

基础用法

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

<van-radio-group v-model="radio">  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>
export default {  data() {    return {      radio: '1'    }  }};

水平排列

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

<van-radio-group v-model="radio" 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="radio" disabled>  <van-radio name="1">单选框 1</van-radio>  <van-radio name="2">单选框 2</van-radio></van-radio-group>

禁用文本点击

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

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

自定义形状

通过 square 属性设置选中状态的图标颜色

<van-radio-group v-model="radio">  <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="radio">  <van-radio name="1" checked-color="#07c160">单选框 1</van-radio>  <van-radio name="2" checked-color="#07c160">单选框 2</van-radio></van-radio-group>

自定义大小

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

<van-radio-group v-model="radio">  <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="radio">  <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>
export default {  data() {    return {      radio: '1',      activeIcon: 'https://img.yzcdn.cn/vant/user-active.png',      inactiveIcon: 'https://img.yzcdn.cn/vant/user-inactive.png',    };  },};

与 Cell 组件一起使用

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

<van-radio-group v-model="radio">

  <van-cell-group>

    <van-cell title="单选框 1" clickable @click="radio = '1'">

      <template #right-icon>

        <van-radio name="1" />

      </template>

    </van-cell>

    <van-cell title="单选框 2" clickable @click="radio = '2'">

      <template #right-icon>

        <van-radio name="2" />

      </template>

    </van-cell>

  </van-cell-group>

</van-radio-group>

API

Radio Props

参数说明类型默认值
name标识符any-
shape形状,可选值为 squarestring

round

disabled是否为禁用状态boolean

false

label-disabled是否禁用文本内容点击boolean

false

label-position文本位置,可选值为 leftstring

right

icon-size图标大小,默认单位为 pxnumber | string20px
checked-color选中状态颜色string#1989fa

RadioGroup Props

 参数 说明 类型 默认值
 v-model 当前选中项的标识符 any -
 disabled 是否禁用所有单选框 boolean false
 direction           v2.5.0 排列方向,可选值为horizontal string vertical
 icon-size             v2.2.3
所有单选框的图标大小,默认单位为 px
 number | string 20px
 checked-color   v2.2.3 所有单选框的选中状态颜色 string #1989fa
Radio Events
事件名说明回调参数
click点击单选框时触发event: Event

RadioGroup Events

事件名说明回调参数
change当绑定值变化时触发的事件当前选中项的 name

Radio Slots

名称说明SlotProps
default自定义文本-
icon自定义图标checked: 是否为选中状态


实例演示

引入

import Vue from 'vue';import { Rate } from 'vant';Vue.use(Rate);

代码演示

基础用法

<van-rate v-model="value" />
export default {  data() {    return {      value: 3    };  }}

自定义图标

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

自定义样式

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

半星

<van-rate  v-model="value"  allow-half  void-icon="star"  void-color="#eee"/>
export default {  data() {    return {      value: 2.5    };  }}

自定义数量

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

禁用状态

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

只读状态

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

监听 change 事件

<van-rate v-model="value" @change="onChange" />
export default {  method: {    onChange(value) {      Toast('当前值:'+ value);    }  }}

API

Props

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

Events

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


实例演示

引入

import Vue from 'vue';import { Search } from 'vant';Vue.use(Search);

代码演示

基础用法

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

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

事件监听

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

<form action="/">  <van-search    v-model="value"    show-action    placeholder="请输入搜索关键词"    @search="onSearch"    @cancel="onCancel"  /></form>
import { Toast } from 'vant';export default {  data() {    return {      value: ''    };  },  methods: {    onSearch(val) {      Toast(val);    },    onCancel() {      Toast('取消');    }  }}
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  placeholder="请输入搜索关键词"  @search="onSearch">  <div slot="action" @click="onSearch">搜索</div></van-search>

API

Props

参数说明类型默认值
label搜索框左侧文本string-
shape搜索框形状,可选值为 roundstringsquare
background搜索框外部背景色string#f2f2f2
maxlength输入的最大字符数number | string-
placeholder占位提示文字string-
clearable是否启用清除控件booleantrue
autofocus是否自动聚焦,iOS 系统不支持该属性booleanfalse
show-action是否在搜索框右侧显示取消按钮booleanfalse
action-text v2.2.2取消按钮文字boolean取消
disabled是否禁用输入框booleanfalse
readonly是否将输入框设为只读booleanfalse
error是否将输入内容标红booleanfalse
input-align输入框内容对齐方式,可选值为 center rightstringleft
left-icon输入框左侧 图标名称 或图片链接stringsearch
right-icon输入框右侧 图标名称 或图片链接string-

Events

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

Slots

名称说明
label自定义搜索框左侧文本
action自定义搜索框右侧按钮,设置show-action属性后展示
left-icon自定义输入框左侧图标
right-icon自定义输入框右侧图标


实例演示

引入

import Vue from 'vue';import { Slider } from 'vant';Vue.use(Slider);

代码演示

基本用法

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

指定选择范围

<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">  <div slot="button" class="custom-button">    {{ value }}  </div></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>

垂直方向

Slider 垂直展示时,高度为 100% 父元素高度

<div :style="{ height: '100px' }">  <van-slider v-model="value" vertical /></div>

API

Props

参数说明类型默认值
value当前进度百分比number0
max最大值number | string100
min最小值number | string0
step步长number | string1
bar-height进度条高度,默认单位为pxnumber | string2px
button-size v2.4.5滑块按钮大小,默认单位为pxnumber | string24px
active-color进度条激活态颜色string#1989fa
inactive-color进度条非激活态颜色string#e5e5e5
disabled是否禁用滑块booleanfalse
vertical是否垂直展示booleanfalse

Events

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

Slots

名称说明
button自定义滑动按钮


实例演示

介绍

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

引入

import Vue from 'vue';import { Stepper } from 'vant';Vue.use(Stepper);

代码演示

基础用法

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

<van-stepper v-model="value" />
export default {  data() {    return {      value: 1    }  }}

步长设置

通过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 />

禁用输入框

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

<van-stepper v-model="value" disabled-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" />

异步变更

如果需要异步地修改输入框的值,可以设置async-change属性,并在change事件中手动修改value

<van-stepper  :value="value"  async-change  @change="onChange"/>
import { Toast } from 'vant';export default {  data() {    return {      value: 1    }  },  methods: {    onChange(value) {      Toast.loading({ forbidClick: true });      setTimeout(() => {        Toast.clear();        // 注意此时修改 value 后会再次触发 change 事件        this.value = value;      }, 500);    }  }}

API

Props

参数说明类型默认值
v-model当前输入值number | string-
min最小值number | string1
max最大值number | string-
default-value初始值,当 v-model 为空时生效number | string1
step步长,每次点击时改变的值number | string1
name v2.2.11标识符,可以在change事件回调参数中获取number | string-
input-width输入框宽度,默认单位为pxnumber | string32px
button-size v2.0.5按钮大小以及输入框高度,默认单位为pxnumber | string28px
decimal-length v2.2.1固定显示的小数位数number | string-
integer是否只允许输入整数booleanfalse
disabled是否禁用步进器booleanfalse
disable-plus v2.2.16是否禁用增加按钮booleanfalse
disable-minus v2.2.16是否禁用减少按钮booleanfalse
disable-input是否禁用输入框booleanfalse
async-change是否开启异步变更,开启后需要手动控制输入值booleanfalse
show-plus v2.1.2是否显示增加按钮booleantrue
show-minus v2.1.2是否显示减少按钮booleantrue
long-press v2.4.3是否开启长按手势booleantrue

Events

事件名说明回调参数
change当绑定值变化时触发的事件value: 当前组件的值, detail: 额外信息,包含 name 的字段
overlimit点击不可用的按钮时触发-
plus点击增加按钮时触发-
minus点击减少按钮时触发-
focus输入框聚焦时触发event: Event
blur输入框失焦时触发event: Event


实例演示

引入

import Vue from 'vue';import { Switch } from 'vant';Vue.use(Switch);

代码演示

基础用法

通过v-model绑定开关的选中状态,true表示开,false表示关

<van-switch v-model="checked" />
export default {  data() {    return {      checked: true    };  }};  

禁用状态

通过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="#07c160" inactive-color="#ee0a24" />

异步控制

需要异步控制开关时,可以使用value属性和input事件代替v-model,并在input事件回调函数中手动处理开关状态

<van-switch :value="checked" @input="onInput" />
export default {  data() {    return {      checked: true    };  },  methods: {    onInput(checked) {      Dialog.confirm({        title: '提醒',        message: '是否切换开关?'      }).then(() => {        this.checked = checked;      });    }  }}; 

搭配单元格使用

<van-cell center title="标题">  <van-switch v-model="checked" slot="right-icon" size="24" /></van-cell>

API

Props

参数说明类型默认值
v-model开关选中状态anyfalse
loading是否为加载状态booleanfalse
disabled是否为禁用状态booleanfalse
size v2.2.11开关尺寸,默认单位为pxnumber | string30px
active-color打开时的背景色string#1989fa
inactive-color关闭时的背景色stringwhite
active-value打开时的值anytrue
inactive-value关闭时的值anyfalse

Events

事件名说明回调参数
change开关状态切换回调checked: 是否选中开关
click v2.2.11点击时触发event: Event


实例演示

引入

import Vue from 'vue';import { Uploader } from 'vant';Vue.use(Uploader);

代码演示

基础用法

文件上传完毕后会触发after-read回调函数,获取到对应的file对象

<van-uploader :after-read="afterRead" />
export default {  methods: {    afterRead(file) {      // 此时可以自行将文件上传至服务器      console.log(file);    }  }};

图片预览

通过v-model可以绑定已经上传的图片列表,并展示图片列表的预览图

<van-uploader v-model="fileList" multiple />
export default {  data() {    return {      fileList: [        { url: 'https://img.yzcdn.cn/vant/leaf.jpg' },        // Uploader 根据文件后缀来判断是否为图片文件        // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明        { url: 'https://cloud-image', isImage: true }      ]    }  }};

限制上传数量

通过max-count属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域

<van-uploader  v-model="fileList"  multiple  :max-count="2"/>
export default {  data() {    return {      fileList: []    }  }};

自定义上传样式

通过插槽可以自定义上传区域的样式

<van-uploader>  <van-button icon="photo" type="primary">上传图片</van-button></van-uploader>

上传前校验

通过传入beforeRead函数可以在上传前进行校验,返回true表示校验通过,返回false表示校验失败。支持返回Promise进行异步校验

<van-uploader :before-read="beforeRead" />
import { Toast } from 'vant';export default {  methods: {    // 返回布尔值    beforeRead(file) {      if (file.type !== 'image/jpeg') {        Toast('请上传 jpg 格式图片');        return false;      }      return true;    },    // 返回 Promise    asyncBeforeRead(file) {      return new Promise((resolve, reject) => {        if (file.type !== 'image/jpeg') {          Toast('请上传 jpg 格式图片');          reject();        } else {          resolve();        }      });    }  }}

API

Props

参数说明类型默认值
accept允许上传的文件类型,详细说明stringimage/*
name v2.0.3标识符,可以在回调函数的第二项参数中获取number | string-
preview-size预览图和上传区域的尺寸,默认单位为pxnumber | string80px
preview-image是否在上传完成后展示预览图booleantrue
preview-full-image v2.1.5是否在点击预览图后展示全屏图片预览booleantrue
multiple是否开启图片多选,部分安卓机型不支持booleanfalse
disabled是否禁用文件上传booleanfalse
deletable v2.2.12是否展示删除按钮booleantrue
capture图片选取模式,可选值为camera(直接调起摄像头)string-
after-read文件读取完成后的回调函数Function-
before-read文件读取前的回调函数,返回false可终止文件读取,
支持返回Promise
Function-
before-delete文件删除前的回调函数,返回false可终止文件读取,
支持返回Promise
Function-
max-size文件大小限制,单位为bytenumber | string-
max-count文件上传数量限制number | string-
result-type v2.2.7文件读取结果类型,可选值为file textstringdataUrl
upload-text上传区域文字提示string-
image-fit v2.1.5预览图裁剪模式,可选值见 Image 组件stringcover

Events

事件名说明回调参数
oversize文件大小超过限制时触发after-read
click-preview点击预览图时触发after-read
close-preview关闭全屏图片预览时触发-
delete删除文件预览时触发after-read

Slots

名称说明
default自定义上传区域

回调参数

before-read、after-read、before-delete 执行时会传递以下回调参数:

参数名说明类型
file文件解析后的 file 对象object
detail额外信息,包含 name 和 index 字段object

ResultType 可选值

result-type字段表示文件读取结果的类型,上传大文件时,建议使用 file 类型,避免卡顿。

描述
file结果仅包含 File 对象
text结果包含 File 对象,以及文件的文本内容
dataUrl结果包含 File 对象,以及文件对应的 base64 编码

方法

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

方法名说明参数返回值
closeImagePreview关闭全屏的图片预览--


实例演示

引入

import Vue from 'vue';import { ActionSheet } from 'vant';Vue.use(ActionSheet);

代码演示

基础用法

ActionSheet通过actions数组来定义展示的选项,数组的每一项是一个对象,对象属性见文档下方表格。

<van-action-sheet v-model="show" :actions="actions" @select="onSelect" />
import { Toast } from 'vant';export default {  data() {    return {      show: false,      actions: [        { name: '选项' },        { name: '选项' },        { name: '选项', subname: '描述信息' }      ]    };  },  methods: {    onSelect(item) {      // 默认情况下点击选项时不会自动收起      // 可以通过 close-on-click-action 属性开启自动收起      this.show = false;      Toast(item.name);    }  }}

展示取消按钮

设置cancel-text属性后,会在底部展示取消按钮,点击后关闭当前菜单

<van-action-sheet  v-model="show"  :actions="actions"  cancel-text="取消"  @cancel="onCancel"/>
import { Toast } from 'vant';export default {  data() {    return {      show: false    };  },  methods: {    onCancel() {      this.show = false;      Toast('cancel');    }  }}

展示描述信息

设置description属性后,会在选项上方显示描述信息

<van-action-sheet  v-model="show"  :actions="actions"  description="这是一段描述信息"/>

选项状态

可以将选项设置为加载状态或禁用状态,或者通过color设置选项颜色

<van-action-sheet  v-model="show"  :actions="actions"  cancel-text="取消"  @cancel="onCancel"/>
export default {  data() {    return {      show: false,      actions: [        { name: '选项', color: '#07c160' },        { loading: true },        { name: '禁用选项', disabled: true }      ]    };  }}

自定义面板

通过插槽可以自定义菜单的展示内容,同时可以使用title属性展示标题栏

<van-action-sheet v-model="show" title="标题">  <div class="content">内容</div></van-action-sheet><style>.content {  padding: 16px 16px 160px;}</style>

API

Props

参数说明类型默认值
actions菜单选项Action[][]
title顶部标题string-
cancel-text取消按钮文字string-
description v2.2.8选项上方的描述信息string-
close-icon v2.2.13关闭 图标名称 或图片链接stringcross
duration v2.0.3动画时长,单位秒number | string0.3
round v2.0.9是否显示圆角booleantrue
overlay是否显示遮罩层booleantrue
lock-scroll是否锁定背景滚动booleantrue
lazy-render是否在显示弹层时才渲染节点booleantrue
close-on-click-action是否在点击选项后关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleantrue
safe-area-inset-bottom是否开启 底部安全区适配booleantrue
get-container指定挂载的节点,用法示例string | () => Element-

Action 数据结构

actions属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:

键名说明类型
name标题string
subname二级标题string
color选项文字颜色string
className为对应列添加额外的 classany
loading是否为加载状态boolean
disabled是否为禁用状态boolean

Events

事件名说明回调参数
select选中选项时触发,禁用或加载状态下不会触发item: 选项对应的对象, index: 选择对应的索引
cancel取消按钮点击时触发-
click-overlay点击遮罩层时触发-
open打开菜单时触发-
opened打开菜单且动画结束后触发-
close关闭菜单时触发-
closed关闭菜单且动画结束后触发-

常见问题

引入时提示 dependencies not found?

在 1.x 版本中,上拉菜单的组件名为Actionsheet,从 2.0 版本开始更名为ActionSheet,请注意区分。


实例演示

介绍

弹出模态框,常用于消息提示、消息确认、在当前页面内完成特定的交互操作

弹出框组件支持函数调用和组件调用两种方式

函数调用

Dialog 是一个函数而不是组件,因此可以直接调用,展示对应的提示弹窗

import { Dialog } from 'vant';Dialog({ message: '提示' });

组件调用

通过组件调用 Dialog 时,可以通过下面的方式进行注册

import Vue from 'vue';import { Dialog } from 'vant';// 全局注册Vue.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});

异步关闭

function beforeClose(action, done) {  if (action === 'confirm') {    setTimeout(done, 1000);  } else {    done();  }}Dialog.confirm({  title: '标题',  message: '弹窗内容',  beforeClose});

全局方法

引入 Dialog 组件后,会自动在 Vue 的 prototype 上挂载 $dialog 方法,在所有组件内部都可以直接调用此方法

export default {  mounted() {    this.$dialog.alert({      message: '弹窗内容'    });  }}

组件调用

如果需要在弹窗内嵌入组件或其他自定义内容,可以使用组件调用的方式

<van-dialog v-model="show" title="标题" show-cancel-button>  <img src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow" ></van-dialog>
export default {  data() {    return {      show: false    };  }}

API

方法

方法名说明参数返回值
Dialog展示弹窗optionsPromise
Dialog.alert展示消息提示弹窗optionsPromise
Dialog.confirm展示消息确认弹窗optionsPromise
Dialog.setDefaultOptions修改默认配置,对所有 Dialog 生效optionsvoid
Dialog.resetDefaultOptions重置默认配置,对所有 Dialog 生效-void
Dialog.close关闭弹窗-void

Options

通过函数调用 Dialog 时,支持传入以下选项:

参数说明类型默认值
title标题string-
width v2.2.7弹窗宽度,默认单位为pxnumber | string320px
message文本内容,支持通过 换行string-
messageAlign内容对齐方式,可选值为left rightstringcenter
className自定义类名any-
showConfirmButton是否展示确认按钮booleantrue
showCancelButton是否展示取消按钮booleanfalse
confirmButtonText确认按钮文案string确认
confirmButtonColor确认按钮颜色string#1989fa
cancelButtonText取消按钮文案string取消
cancelButtonColor取消按钮颜色stringblack
overlay是否展示遮罩层booleantrue
overlayClass v2.2.7自定义遮罩层类名string-
overlayStyle v2.2.7自定义遮罩层样式object-
closeOnPopstate v2.0.5是否在页面回退时自动关闭booleanfalse
closeOnClickOverlay是否在点击遮罩层后关闭弹窗booleanfalse
lockScroll是否锁定背景滚动booleantrue
beforeClose关闭前的回调函数,
调用 done() 后关闭弹窗,
调用 done(false) 阻止弹窗关闭
(action, done) => void-
transition v2.2.6动画类名,等价于 transition 的name属性string-
getContainer指定挂载的节点,用法示例string | () => Elementbody

Props

通过组件调用 Dialog 时,支持以下 Props:

参数说明类型默认值
v-model是否显示弹窗boolean-
title标题string-
width v2.2.7弹窗宽度,默认单位为pxnumber | string320px
message文本内容,支持通过 换行string-
message-align内容对齐方式,可选值为left rightstringcenter
show-confirm-button是否展示确认按钮booleantrue
show-cancel-button是否展示取消按钮booleanfalse
confirm-button-text确认按钮文案string确认
confirm-button-color确认按钮颜色string#1989fa
cancel-button-text取消按钮文案string取消
cancel-button-color取消按钮颜色stringblack
overlay是否展示遮罩层booleantrue
overlay-class v2.2.7自定义遮罩层类名string-
overlay-style v2.2.7自定义遮罩层样式object-
close-on-popstate v2.0.5是否在页面回退时自动关闭booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭弹窗booleanfalse
lazy-render是否在显示弹层时才渲染节点booleantrue
lock-scroll是否锁定背景滚动booleantrue
before-close关闭前的回调函数,
调用 done() 后关闭弹窗,
调用 done(false) 阻止弹窗关闭
(action, done) => void-
transition v2.2.6动画类名,等价于 transtion 的name属性string-
get-container指定挂载的节点,用法示例string | () => Element-

Events

通过组件调用 Dialog 时,支持以下事件:

事件说明回调参数
confirm点击确认按钮时触发-
cancel点击取消按钮时触发-
open打开弹窗时触发-
opened打开弹窗且动画结束后触发-
close关闭弹窗时触发-
closed关闭弹窗且动画结束后触发-

Slots

通过组件调用 Dialog 时,支持以下插槽:

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


实例演示

引入

app.jsonindex.json中引入组件,默认为ES6版本,
"usingComponents": {  "van-dropdown-menu": "@vant/weapp/dropdown-menu/index",  "van-dropdown-item": "@vant/weapp/dropdown-item/index"}

代码演示

基础用法

<van-dropdown-menu>  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" /></van-dropdown-menu>
Page({  data: {    option1: [      { text: '全部商品', value: 0 },      { text: '新款商品', value: 1 },      { text: '活动商品', value: 2 },    ],    option2: [      { text: '默认排序', value: 'a' },      { text: '好评排序', value: 'b' },      { text: '销量排序', value: 'c' },    ],    value1: 0,    value2: 'a',  },});

自定义菜单内容

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

<van-dropdown-menu>  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item id="item" title="{{ itemTitle }}">    <van-cell title="{{ switchTitle1 }}">      <van-switch        slot="right-icon"        size="24px"        style="height: 26px"        checked="{{ switch1 }}"        bind:change="onSwitch1Change"      />    </van-cell>    <van-cell title="{{ switchTitle2 }}">      <van-switch        slot="right-icon"        size="24px"        style="height: 26px"        checked="{{ switch2 }}"        bind:change="onSwitch2Change"      />    </van-cell>    <van-button type="info" block bind:click="onConfirm">      确定    </van-button>  </van-dropdown-item></van-dropdown-menu>
Page({  data: {    switchTitle1: '包邮',    switchTitle2: '团购',    itemTitle: '筛选',    option1: [      { text: '全部商品', value: 0 },      { text: '新款商品', value: 1 },      { text: '活动商品', value: 2 },    ],    value1: 0,  },  onConfirm() {    this.selectComponent('#item').toggle();  },  onSwitch1Change({ detail }) {    this.setData({ switch1: detail });  },  onSwitch2Change({ detail }) {    this.setData({ switch2: detail });  },});

自定义选中态颜色

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

<van-dropdown-menu active-color="#ee0a24">  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" /></van-dropdown-menu>

向上展开

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

<van-dropdown-menu direction="up">  <van-dropdown-item value="{{ value1 }}" options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" options="{{ option2 }}" /></van-dropdown-menu>

禁用菜单

<van-dropdown-menu>  <van-dropdown-item value="{{ value1 }}" disabled options="{{ option1 }}" />  <van-dropdown-item value="{{ value2 }}" disabled options="{{ option2 }}" /></van-dropdown-menu>

API

DropdownMenu Props

参数说明类型默认值
active-color菜单标题和选项的选中态颜色string#1989fa
direction v2.0.1菜单展开方向,可选值为upstringdown
z-index菜单栏 z-index 层级number | string10
duration动画时长,单位秒number | string0.2
overlay是否显示遮罩层booleantrue
close-on-click-overlay是否在点击遮罩层后关闭菜单booleantrue
close-on-click-outside v2.0.7是否在点击外部元素后关闭菜单booleantrue

DropdownItem Props

参数说明类型默认值
value当前选中项对应的 value,可以通过v-model双向绑定number | string-
title菜单项标题string当前选中项文字
options选项数组Option[][]
disabled是否禁用菜单booleanfalse
title-class标题额外类名string-
get-container v2.2.4指定挂载的节点,用法示例string | () => Element-

DropdownItem Events

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

DropdownItem Slots

名称说明
default菜单内容
title自定义标题,不支持动态渲染

DropdownItem 方法

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

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

Option 数据结构

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


实例演示

引入

import Vue from 'vue';import { Loading } from 'vant';Vue.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>

API

Props

参数说明类型默认值
color颜色string#c9c9c9
type类型,可选值为 spinnerstringcircular
size加载图标大小,默认单位为pxnumber | string30px
text-size文字大小,默认单位为pxnumber | string14px
vertical是否垂直排列图标和文字内容booleanfalse

Slots

名称说明
default加载文案


实例演示

引入

import Vue from 'vue';import { Notify } from 'vant';Vue.use(Notify);

代码演示

基础用法

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});

组件内调用

引入 Notify 组件后,会自动在 Vue 的 prototype 上挂载 $notify 方法,便于在组件内调用。

export default {  mounted() {    this.$notify('提示文案');  }}

API

方法

方法名说明参数返回值
Notify展示提示options | messagenotify 实例
Notify.clear关闭提示-void
Notify.setDefaultOptions修改默认配置,对所有 Notify 生效optionsvoid
Notify.resetDefaultOptions重置默认配置,对所有 Notify 生效-void

Options

参数说明类型默认值
type v2.1.6类型,可选值为 primary success warningstringdanger
message展示文案,支持通过 换行string-
duration展示时长(ms),值为 0 时,notify 不会消失number | string3000
color字体颜色stringwhite
background背景颜色string-
className自定义类名any-
onClick点击时的回调函数Function-
onOpened完全展示后的回调函数Function-
onClose关闭时的回调函数Function-


实例演示

介绍

创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作

引入

import Vue from 'vue';import { Overlay } from 'vant';Vue.use(Overlay);

代码演示

基础用法

<van-button type="primary" text="显示遮罩层" @click="show = true" /><van-overlay :show="show" @click="show = false" />
export default {  data() {    return {      show: false    }  }},

嵌入内容

通过默认插槽可以在遮罩层上嵌入任意内容

<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动画时长,单位秒number | string0.3
class-name自定义类名string-
custom-style v2.2.5自定义样式object-

Events

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

Slots

名称说明
default v2.0.5默认插槽,用于在遮罩层上方嵌入内容


实例演示

引入

import Vue from 'vue';import { PullRefresh } from 'vant';Vue.use(PullRefresh);

代码演示

基础用法

下拉刷新时会触发 refresh 事件,在事件的回调函数中可以进行同步或异步操作,操作完成后将 v-model 设置为 false,表示加载完成。

<van-pull-refresh v-model="isLoading" @refresh="onRefresh">  <p>刷新次数: {{ count }}</p></van-pull-refresh>
import { Toast } from 'vant';export default {  data() {    return {      count: 0,      isLoading: false    }  },  methods: {    onRefresh() {      setTimeout(() => {        Toast('刷新成功');        this.isLoading = false;        this.count++;      }, 1000);    }  }}

成功提示

通过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 实现一个缩放效果 -->  <img    class="doge"    slot="pulling"    slot-scope="props"    src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"     :style="{ transform: `scale(${props.distance / 80})` }"  >  <!-- 释放提示 -->  <img    class="doge"    slot="loosing"    src="https://img.yzcdn.cn/vant/doge.png" rel="external nofollow"  rel="external nofollow"   >  <!-- 加载提示 -->  <img    class="doge"    slot="loading"    src="https://img.yzcdn.cn/vant/doge-fire.jpg" rel="external nofollow"   >  <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 v2.4.2顶部内容高度number | string50
disabled是否禁用下拉刷新booleanfalse

Events

事件名说明回调参数
refresh下拉刷新时触发-

Slots

名称说明SlotProps
default自定义内容-
normal非下拉状态时顶部内容-
pulling下拉过程中顶部内容{ distance: 当前下拉距离 }
loosing释放过程中顶部内容{ distance: 当前下拉距离 }
loading加载过程中顶部内容{ distance: 当前下拉距离 }
success刷新成功提示内容-

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { SwipeCell } from 'vant';Vue.use(SwipeCell);

代码演示

基础用法

SwipeCell组件提供了left和right两个插槽,用于定义两侧滑动区域的内容

<van-swipe-cell>  <template slot="left">    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template slot="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"  />  <van-button    slot="right"    square    text="删除"    type="danger"    class="delete-button"  /></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 slot="left">    <van-button square type="primary" text="选择" />  </template>  <van-cell :border="false" title="单元格" value="内容" />  <template slot="right">    <van-button square type="danger" text="删除" />  </template></van-swipe-cell>
export default {  methods: {    // position 为关闭时点击的位置    // instance 为对应的 SwipeCell 实例    beforeClose({ position, instance }) {      switch (position) {        case 'left':        case 'cell':        case 'outside':          instance.close();          break;        case 'right':          Dialog.confirm({            message: '确定删除吗?'          }).then(() => {            instance.close();          });          break;      }    }  }}

API

Props

参数说明类型默认值
name v2.0.4标识符,可以在事件参数中获取到number | string-
left-width指定左侧滑动区域宽度,单位为pxnumber | stringauto
right-width指定右侧滑动区域宽度,单位为pxnumber | stringauto
before-close v2.3.0关闭前的回调函数Function-
disabled是否禁用滑动booleanfalse
stop-propagation v2.1.0是否阻止滑动事件冒泡booleanfalse

Slots

名称说明
default自定义显示内容
left左侧滑动内容
right右侧滑动内容

Events

事件名说明回调参数
click点击时触发关闭时的点击位置 (left right cell outside)
open打开时触发{ position: 'left' | 'right' , name: string }
close关闭时触发{ position: string , name: string }

beforeClose 参数

beforeClose 的第一个参数为对象,对象中包含以下属性:

参数名说明类型
name标识符string
position关闭时的点击位置 (left right cell outside)string
instanceSwipeCell 实例,用于调用实例方法SwipeCell

方法

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

方法名说明参数返回值
open打开单元格侧边栏position: left | right-
close收起单元格侧边栏--

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { Toast } from 'vant';Vue.use(Toast);

代码演示

文字提示

Toast('提示内容');

加载提示

使用Toast.loading方法展示加载提示,通过forbidClick属性可以禁用背景点击,通过loadingType属性可以自定义加载图标类型。

Toast.loading({  message: '加载中...',  forbidClick: true});// 自定义加载图标Toast.loading({  message: '加载中...',  forbidClick: true,  loadingType: 'spinner'});

成功/失败提示

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

自定义图标

Toast({  message: '自定义图标',  icon: 'like-o'});Toast({  message: '展示图片',  icon: 'https://img.yzcdn.cn/vant/logo.png'});

动态更新提示

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

组件内调用

引入 Toast 组件后,会自动在 Vue 的 prototype 上挂载 $toast 方法,便于在组件内调用。

export default {  mounted() {    this.$toast('提示文案');  }}

单例模式

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

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

修改默认配置

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

// 将所有 Toast 的展示时长设置为 2000 毫秒Toast.setDefaultOptions({ duration: 2000 });// 将所有 loading Toast 设置为背景不可点击 (2.2.10 版本开始支持)Toast.setDefaultOptions('loading', { forbidClick: true });// 重置所有 Toast 的默认配置Toast.resetDefaultOptions();// 重置 loading Toast 的默认配置 (2.2.10 版本开始支持)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 v2.0.1自定义图标,支持传入 图标名称 或图片链接string-
iconPrefix v2.0.9图标类名前缀stringvan-icon
overlay v2.2.13是否显示背景遮罩层booleanfalse
forbidClick是否禁止背景点击booleanfalse
closeOnClick v2.1.5是否在点击后关闭booleanfalse
closeOnClickOverlay v2.2.13是否在点击遮罩层后关闭booleanfalse
loadingType加载图标类型, 可选值为 spinnerstringcircular
duration展示时长(ms),值为 0 时,toast 不会消失number2000
className自定义类名any-
onOpened完全展示后的回调函数Function-
onClose关闭时的回调函数Function-
transition v2.2.6动画类名,等价于 transtion 的name属性stringvan-fade
getContainer指定挂载的节点,用法示例string | () => Elementbody


实例演示

引入

import Vue from 'vue';import { Circle } from 'vant';Vue.use(Circle);

代码演示

基础用法

rate属性表示进度条的目标进度,v-model表示动画过程中的实时进度。当rate发生变化时,v-model会以speed的速度变化,直至达到rate设定的值。

<van-circle  v-model="currentRate"  :rate="30"  :speed="100"  :text="text"/>
export default {  data() {    return {      currentRate: 0    };  },  computed: {    text() {      return this.currentRate.toFixed(0) + '%'    }  }};

宽度定制

通过stroke-width属性来控制进度条宽度

<van-circle  v-model="currentRate"  :rate="rate"  :stroke-width="60"  text="宽度定制"/>

颜色定制

通过color属性来控制进度条颜色,layer-color属性来控制轨道颜色

<van-circle  v-model="currentRate"  :rate="rate"  layer-color="#ebedf0"  text="颜色定制"/>

渐变色

color属性支持传入对象格式来定义渐变色

<van-circle  v-model="currentRate"  :rate="rate"  :color="gradientColor"  text="渐变色"/>
export default {  data() {    return {      currentRate: 0,      gradientColor: {        '0%': '#3fecff',        '100%': '#6149f6'      }    };  }};

逆时针方向

将clockwise设置为false,进度会从逆时针方向开始

<van-circle  v-model="currentRate"  :rate="rate"  :clockwise="false"  text="逆时针方向"/>

大小定制

通过size属性设置圆环直径

<van-circle  v-model="currentRate"  :rate="rate"  size="120px"  text="大小定制"/>

API

Props

参数说明类型默认值
v-model当前进度number-
rate目标进度number | string100
size圆环直径,默认单位为 pxnumber | string100px
color v2.1.4进度条颜色,传入对象格式可以定义渐变色string | object#1989fa
layer-color轨道颜色stringwhite
fill填充颜色stringnone
speed动画速度(单位为 rate/s)number | string0
text文字string-
stroke-width进度条宽度number | string40
stroke-linecap v2.2.15进度条端点的形状,可选值为sqaure buttstringround
clockwise是否顺时针增加booleantrue

Slots

名称说明
default自定义文字内容


实例演示

引入

import Vue from 'vue';import { Collapse, CollapseItem } from 'vant';Vue.use(Collapse);Vue.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" disabled>内容</van-collapse-item></van-collapse>
export default {  data() {    return {      activeNames: ['1']    };  }};

手风琴

通过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>
export default {  data() {    return {      activeName: '1'    };  }};

自定义标题内容

<van-collapse v-model="activeNames">  <van-collapse-item name="1">    <div slot="title">标题1 <van-icon name="question-o" /></div>    内容  </van-collapse-item>  <van-collapse-item title="标题2" name="2" icon="shop-o">    内容  </van-collapse-item></van-collapse>
export default {  data() {    return {      activeNames: ['1']    };  }};

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
title-class左侧标题额外类名string-
value-class右侧内容额外类名string-
label-class描述信息额外类名string-

CollapseItem Slots

名称说明
default面板内容
value自定义显示内容
icon自定义icon
title自定义title
right-icon自定义右侧按钮,默认是arrow


实例演示

引入

import Vue from 'vue';import { CountDown } from 'vant';Vue.use(CountDown);

代码演示

基本用法

time属性表示倒计时总时长,单位为毫秒

<van-count-down :time="time" />
export default {  data() {    return {      time: 30 * 60 * 60 * 1000    };  }}

自定义格式

通过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 v-slot="timeData">    <span class="item">{{ timeData.hours }}</span>    <span class="item">{{ timeData.minutes }}</span>    <span class="item">{{ timeData.seconds }}</span>  </template></van-count-down><style>.item {  display: inline-block;  width: 22px;  margin-right: 5px;  color: #fff;  font-size: 12px;  text-align: center;  background-color: #1989fa;}</style>

手动控制

通过 ref 获取到组件实例后,可以调用start、pause、reset方法

<van-count-down  ref="countDown"  millisecond  :time="3000"  :auto-start="false"  format="ss:SSS"  @finish="finish"/><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 {  methods: {    start() {      this.$refs.countDown.start();    },    pause() {      this.$refs.countDown.pause();    },    reset() {      this.$refs.countDown.reset();    },    finish() {      Toast('倒计时结束');    }  }}

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 v2.4.4倒计时变化时触发timeData

Slots

名称说明SlotProps
default自定义内容timeData

timeData 格式

名称说明类型
days剩余天数number
hours剩余小时number
minutes剩余分钟number
seconds剩余秒数number
milliseconds剩余毫秒number

方法

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

方法名说明参数返回值
start开始倒计时--
pause暂停倒计时--
reset重设倒计时,若auto-starttrue,重设后会自动开始倒计时--

常见问题

在 iOS 系统上倒计时不生效?

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

对此问题的详细解释:stackoverflow


实例演示

引入

import Vue from 'vue';import { Divider } from 'vant';Vue.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内容


实例演示

引入

ImagePreview和其他组件不同,不是通过HTML结构的方式来使用,而是通过函数调用的方式。使用前需要先引入它。

import Vue from 'vue';import { ImagePreview } from 'vant';Vue.use(ImagePreview);

代码演示

基础用法

直接传入图片数组,即可展示图片预览

ImagePreview([  'https://img.yzcdn.cn/1.jpg',  'https://img.yzcdn.cn/2.jpg']);

传入配置项

通过传入配置对象,可以指定初始图片的位置、监听关闭事件

ImagePreview({  images: [    'https://img.yzcdn.cn/1.jpg',    'https://img.yzcdn.cn/2.jpg'  ],  startPosition: 1,  onClose() {    // do something  }});

异步关闭

通过asyncClose属性可以开启异步关闭,开启后异步关闭后,只能通过实例上的 close 方法关闭图片预览

const instance = ImagePreview({  images: [    'https://img.yzcdn.cn/1.jpg',    'https://img.yzcdn.cn/2.jpg'  ],  asyncClose: true});setTimeout(() => {  instance.close();}, 1000);

组件调用

如果需要在图片预览内嵌入组件或其他自定义内容,可以使用组件调用的方式,调用前需要通过 Vue.use 注册组件

<van-image-preview v-model="show" :images="images" @change="onChange">  <template v-slot:index>第{{ index }}页</template></van-image-preview>
export default {  data() {    return {      show: false,      index: 0,      images: [        'https://img.yzcdn.cn/1.jpg',        'https://img.yzcdn.cn/2.jpg'      ]    };  },  methods: {    onChange(index) {      this.index = index;    }  }}

API

Options

通过函数调用 ImagePreview 时,支持传入以下选项:

参数名说明类型默认值
images需要预览的图片 URL 数组string[][]
startPosition图片预览起始位置索引number | string0
swipeDuration动画时长,单位为msnumber | string500
showIndex是否显示页码booleantrue
showIndicators是否显示轮播指示器booleanfalse
loop是否开启循环播放booleantrue
onClose关闭时的回调函数Function-
onChange v2.0.3切换图片时的回调函数,回调参数为当前索引Function-
asyncClose是否开启异步关闭booleanfalse
closeOnPopstate是否在页面回退时自动关闭booleanfalse
className自定义类名any-
lazyLoad是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
maxZoom手势缩放时,最大缩放比例number | string3
minZoom手势缩放时,最小缩放比例number | string1/3

Props

通过组件调用 ImagePreview 时,支持以下 Props:

参数说明类型默认值
images需要预览的图片 URL 数组string[][]
start-position图片预览起始位置索引number | string0
swipe-duration动画时长,单位为 msnumber | string500
show-index是否显示页码booleantrue
show-indicators是否显示轮播指示器booleanfalse
loop是否开启循环播放booleantrue
async-close是否开启异步关闭booleanfalse
close-on-popstate是否在页面回退时自动关闭booleanfalse
class-name自定义类名any-
lazy-load是否开启图片懒加载,须配合 Lazyload 组件使用booleanfalse
max-zoom手势缩放时,最大缩放比例number | string3
min-zoom手势缩放时,最小缩放比例number | string1/3

Events

通过组件调用 ImagePreview 时,支持以下事件:

事件说明回调参数
close关闭时触发{ index: 索引, url: 图片链接 }
change切换当前图片时触发index, 当前图片的索引

Slots

通过组件调用 ImagePreview 时,支持以下插槽:

名称说明
index自定义页码内容
cover自定义覆盖在图片预览上方的内容

onClose 回调参数

参数名说明类型
url当前图片 URLstring
index当前图片的索引值number

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

Lazyload​ 是 Vue 指令,使用前需要对指令进行注册

import Vue from 'vue';import { Lazyload } from 'vant';Vue.use(Lazyload);// 注册时可以配置额外的选项Vue.use(Lazyload, {  lazyComponent: true});

代码演示

基础用法

将​v-lazy​指令的值设置为你需要懒加载的图片

<img v-for = "img in imageList" v-lazy = "img" >
export default {  data() {    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`选项Vue.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 官方文档


实例演示

介绍

瀑布流滚动加载,用于展示长列表,当列表即将滚动到底部时,会触发事件并加载更多列表项。

引入

import Vue from 'vue';import { List } from 'vant';Vue.use(List);

代码演示

基础用法

List 组件通过loading和finished两个变量控制加载状态,当组件滚动到底部时,会触发load事件并将loading设置成true。此时可以发起异步操作并更新数据,数据更新完毕后,将loading设置成false即可。若数据已全部加载完毕,则直接将finished设置成true即可。

<van-list  v-model="loading"  :finished="finished"  finished-text="没有更多了"  @load="onLoad">  <van-cell v-for="item in list" :key="item" :title="item" /></van-list>
export default {  data() {    return {      list: [],      loading: false,      finished: false    };  },  methods: {    onLoad() {      // 异步更新数据      // setTimeout 仅做示例,真实场景中一般为 ajax 请求      setTimeout(() => {        for (let i = 0; i < 10; i++) {          this.list.push(this.list.length + 1);        }        // 加载状态结束        this.loading = false;        // 数据全部加载完成        if (this.list.length >= 40) {          this.finished = true;        }      }, 1000);    }  }}

错误提示

若列表数据加载失败,将error设置成true即可显示错误提示,用户点击错误提示后会重新触发 load 事件。

<van-list  v-model="loading"  :error.sync="error"  error-text="请求失败,点击重新加载"  @load="onLoad">  <van-cell v-for="item in list" :key="item" :title="item" /></van-list>
export default {  data() {    return {      list: [],      error: false,      loading: false    };  },  methods: {    onLoad() {      fetchSomeThing().catch(() => {        this.error = true;      })    }  }}

下拉刷新

List 组件可以与 PullRefresh 组件结合使用,实现下拉刷新的效果

<van-pull-refresh v-model="refreshing" @refresh="onRefresh">  <van-list    v-model="loading"    :finished="finished"    finished-text="没有更多了"    @load="onLoad"  >    <van-cell v-for="item in list" :key="item" :title="item" />  </van-list></van-pull-refresh>
export default {  data() {    return {      list: [],      loading: false,      finished: false,      refreshing: false    };  },  methods: {    onLoad() {      setTimeout(() => {        if (this.refreshing) {          this.list = [];          this.refreshing = false;        }        for (let i = 0; i < 10; i++) {          this.list.push(this.list.length + 1);        }        this.loading = false;        if (this.list.length >= 40) {          this.finished = true;        }      }, 1000);    },    onRefresh() {      // 清空列表数据      this.finished = false;      // 重新加载数据      // 将 loading 设置为 true,表示处于加载状态      this.loading = true;      this.onLoad();    }  }}

API

Props

参数说明类型默认值
v-model是否处于加载状态,加载过程中不触发load事件booleanfalse
finished是否已加载完成,加载完成后不再触发load事件booleanfalse
error是否加载失败,加载失败后点击错误提示可以重新
触发load事件,必须使用sync修饰符
booleanfalse
offset滚动条与底部距离小于 offset 时触发load事件number | string300
loading-text加载过程中的提示文案string加载中...
finished-text加载完成后的提示文案string-
error-text加载失败后的提示文案string-
immediate-check是否在初始化时立即执行滚动位置检查booleantrue
direction滚动触发加载的方向,可选值为upstringdown

Events

事件名说明回调参数
load滚动条与底部距离小于 offset 时触发-

方法

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

方法名说明参数返回值
check检查当前的滚动位置,若已滚动至底部,则会触发 load 事件--

Slots

名称说明
default列表内容
loading自定义底部加载中提示
finished自定义加载完成后的提示文案
error自定义加载失败后的提示文案

常见问题

List 的运行机制是什么?

List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List 会触发一次 load 事件。

为什么 List 初始化后会立即触发 load 事件?

List 初始化后会触发一次 load 事件,用于加载第一屏的数据,这个特性可以通过immediate-check属性关闭。

为什么会连续触发 load 事件?

如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load 事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。

loading 和 finished 分别是什么含义?

List有以下三种状态,理解这些状态有助于你正确地使用List组件:

  • 非加载中,loading为false,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
  • 加载中,loading为true,表示正在发送异步请求,此时不会触发load事件
  • 加载完成,finished为true,此时不会触发load事件

在每次请求完毕后,需要手动将loading设置为false,表示加载结束

使用 float 布局后一直触发加载?

若 List 的内容使用了 float 布局,可以在容器上添加van-clearfix类名来清除浮动,使得 List 能正确判断元素位置

<van-list>  <div class="van-clearfix">    <div class="float-item" />    <div class="float-item" />    <div class="float-item" />  </div></van-list>

在 html、body 上设置 overflow 后一直触发加载?

如果在 html 和 body 标签上设置了overflow-x: hidden样式,会导致 List 一直触发加载。

html,body {  overflow-x: hidden;}

这个问题的原因是当元素设置了overflow-x: hidden样式时,该元素的overflow-y会被浏览器设置为auto,而不是默认值visible,导致 List 无法正确地判断滚动容器。解决方法是去除该样式,或者在 html 和 body 标签上添加height: 100%样式。


实例演示

引入

import Vue from 'vue';import { NoticeBar } from 'vant';Vue.use(NoticeBar);

代码演示

基础用法

<van-notice-bar text="通知内容" left-icon="volume-o" />

禁用滚动

文字内容多于一行时,可通过scrollable参数控制是否开启滚动

<van-notice-bar :scrollable="false">  通知内容</van-notice-bar>

多行展示

禁用滚动时,可以设置wrapable来开启多行展示

<van-notice-bar wrapable :scrollable="false">  通知内容</van-notice-bar>

通知栏模式

默认模式为空,支持closeable和link两种模式

<!-- closeable 模式,在右侧显示关闭按钮 --><van-notice-bar mode="closeable">  通知内容</van-notice-bar><!-- link 模式,在右侧显示链接箭头 --><van-notice-bar mode="link">  通知内容</van-notice-bar>

自定义样式

<van-notice-bar  color="#1989fa"  background="#ecf9ff"  left-icon="info-o">  通知内容</van-notice-bar>

API

Props

参数说明类型默认值
mode通知栏模式,可选值为 closeable linkstring''
text通知文本内容string''
color文本颜色string#f60
background滚动条背景string#fff7cc
left-icon左侧 图标名称 或图片链接string-
delay动画延迟时间 (s)number | string1
speed滚动速率 (px/s)number | string50
scrollable是否在长度溢出时滚动播放booleantrue
wrapable是否开启文本换行,只在禁用滚动时生效booleanfalse

Events

事件名说明回调参数
click点击通知栏时触发event: Event
close关闭通知栏时触发event: Event

Slots

名称内容
default通知文本内容
left-icon自定义左侧图标
right-icon自定义右侧图标


实例演示

引入

import Vue from 'vue';import { Panel } from 'vant';Vue.use(Panel);

代码演示

基础用法

面板只是一个容器,里面可以放入自定义的内容

<van-panel title="标题" desc="描述信息" status="状态">  <div>内容</div></van-panel>

高级用法

使用slot自定义内容

<van-panel title="标题" desc="描述信息" status="状态">  <div>内容</div>  <div slot="footer">    <van-button size="small">按钮</van-button>    <van-button size="small" type="danger">按钮</van-button>  </div></van-panel>

API

Props

参数说明类型默认值
title标题string-
desc描述string-
status状态string-
icon标题左侧 图标名称 或图片链接string-

Slots

名称说明
default自定义内容
header自定义 header
footer自定义 footer


实例演示

引入

import Vue from 'vue';import { Progress } from 'vant';Vue.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 v2.2.1进度条粗细,默认单位为pxnumber | string4px
color进度条颜色string#1989fa
track-color v2.2.9轨道颜色string#e5e5e5
pivot-text进度文字内容string百分比
pivot-color进度文字背景色string同进度条颜色
text-color进度文字颜色stringwhite
inactive是否置灰booleanfalse
show-pivot是否显示进度文字booleantrue


实例演示

引入

import Vue from 'vue';import { Skeleton } from 'vant';Vue.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>
export default {  data() {    return {      loading: true    }  },  mounted() {    this.loading = false;  }};

API

Props

参数说明类型默认值
row段落占位图行数number | string0
row-width段落占位图宽度,可传数组来设置每一行的宽度number | string |
(number | string)[]
100%
title是否显示标题占位图booleanfalse
avatar是否显示头像占位图booleanfalse
loading是否显示骨架屏,传false时会展示子组件内容booleantrue
animate是否开启动画booleantrue
title-width标题占位图宽度number | string40%
avatar-size头像占位图大小number | string32px
avatar-shape头像占位图形状,可选值为squarestringround


实例演示

引入

import Vue from 'vue';import { Step, Steps } from 'vant';Vue.use(Step);Vue.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>
export default {  data() {    return {      active: 1    };  }}

自定义样式

可以通过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-color激活状态颜色string#07c160
active-icon激活状态底部图标,可选值见 Icon 组件stringchecked
inactive-icon未激活状态底部图标,可选值见 Icon 组件string-

Step Slots

名称说明
active-icon自定义激活状态图标
inactive-icon自定义未激活状态图标


实例演示

介绍

Sticky 组件与 CSS 中position: sticky属性实现的效果一致,当组件在屏幕范围内时,会按照正常的布局排列,当组件滚出屏幕范围时,始终会固定在屏幕顶部。

引入

import Vue from 'vue';import { Sticky } from 'vant';Vue.use(Sticky);

代码演示

基础用法

将内容包裹在Sticky组件内即可

<van-sticky>  <van-button type="primary">基础用法</van-button></van-sticky>

吸顶距离

通过offset-top属性可以设置组件在吸顶时与顶部的距离

<van-sticky :offset-top="50">  <van-button type="info">吸顶距离</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 {  data() {    return {      container: null    };  },  mounted() {    this.container = this.$refs.container;  }};

API

Props

参数说明类型默认值
offset-top吸顶时与顶部的距离,单位pxnumber | string0
z-index吸顶时的 z-indexnumber | string99
container容器对应的 HTML 节点Element-

Events

事件名说明回调参数
scroll滚动时触发{ scrollTop: 距离顶部位置, isFixed: 是否吸顶 }


实例演示

引入

import Vue from 'vue';import { Swipe, SwipeItem } from 'vant';Vue.use(Swipe);Vue.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 中含有图片时,可以配合 Lazyload 组件实现图片懒加载

<van-swipe :autoplay="3000">  <van-swipe-item v-for="(image, index) in images" :key="index">    <img v-lazy="image" />  </van-swipe-item></van-swipe>
import Vue from 'vue';import { Lazyload } from 'vant';Vue.use(Lazyload);export default {  data() {    return {      images: [        'https://img.yzcdn.cn/vant/apple-1.jpg',        'https://img.yzcdn.cn/vant/apple-2.jpg'      ]    }  }}

监听 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 {  methods: {    onChange(index) {      Toast('当前 Swipe 索引:' + index);    }  }}

纵向滚动

设置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 @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>  <div class="custom-indicator" slot="indicator">    {{ current + 1 }}/4  </div></van-swipe>
export default {  data() {    return {      current: 0    }  },  methods: {    onChange(index) {      this.current = index;    }  }}

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 v2.2.13是否阻止滑动事件冒泡booleantrue
indicator-color指示器颜色string#1989fa

Swipe Events

事件名说明回调参数
change每一页轮播结束后触发index, 当前页的索引

SwipeItem Events

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

Swipe 方法

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

方法名说明参数返回值
prev v2.4.2切换到上一轮播--
next v2.4.2切换到下一轮播--
swipeTo切换到指定位置index: number, options: Optionsvoid
resize v2.2.14外层元素大小变化后,可以调用此方法来触发重绘-void

swipeTo Options 格式

名称说明类型
immediate是否跳过动画boolean

Swipe Slots

名称说明
default轮播内容
indicator自定义指示器

常见问题

滑动轮播时为什么触发了 click 事件?

这种情况通常是由于项目中引入了fastclick库导致的。fastclick的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。

将 Swipe 组件的 stop-propagation 属性设置为 false 即可避免该问题。

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { Tag } from 'vant';Vue.use(Tag);

代码演示

基础用法

通过type属性控制标签颜色,默认为灰色

<van-tag>标签</van-tag><van-tag type="primary">标签</van-tag><van-tag type="success">标签</van-tag><van-tag type="danger">标签</van-tag><van-tag type="warning">标签</van-tag>

圆角样式

通过round设置为圆角样式

<van-tag round>标签</van-tag><van-tag round type="primary">标签</van-tag><van-tag round type="success">标签</van-tag><van-tag round type="danger">标签</van-tag><van-tag round type="warning">标签</van-tag>

标记样式

通过mark设置为标记样式(半圆角)

<van-tag mark>标签</van-tag><van-tag mark type="primary">标签</van-tag><van-tag mark type="success">标签</van-tag><van-tag mark type="danger">标签</van-tag><van-tag mark type="warning">标签</van-tag>

空心样式

设置plain属性设置为空心样式

<van-tag plain>标签</van-tag><van-tag plain type="primary">标签</van-tag><van-tag plain type="success">标签</van-tag><van-tag plain type="danger">标签</van-tag><van-tag plain type="warning">标签</van-tag>

自定义颜色

<van-tag color="#f2826a">标签</van-tag><van-tag color="#f2826a" plain>标签</van-tag><van-tag color="#7232dd">标签</van-tag><van-tag color="#7232dd" plain>标签</van-tag><van-tag color="#ffe1e1" text-color="#ad0000">标签</van-tag>

标签大小

<van-tag type="danger">标签</van-tag><van-tag type="danger" size="medium">标签</van-tag><van-tag type="danger" size="large">标签</van-tag>

可关闭标签

添加closeable属性表示标签是可关闭的,关闭标签时会触发close事件,在close事件中可以执行隐藏标签的逻辑

<van-tag  v-if="show.primary"  closeable  size="medium"  type="primary"  @close="close('primary')">  标签</van-tag><van-tag  v-if="show.success"  closeable  size="medium"  type="success"  @close="close('success')">  标签</van-tag>
export default {  data() {    return {      show: {        primary: true,        success: true      }    }  },  methods: {    close(type) {      this.show[type] = false;    }  }}

API

Props

参数说明类型默认值
type类型,可选值为primary success danger warningstringdefault
size大小, 可选值为large mediumstring-
color标签颜色string-
plain是否为空心样式booleanfalse
round是否为圆角样式booleanfalse
mark是否为标记样式booleanfalse
text-color文本颜色,优先级高于color属性stringwhite
closeable v2.2.9是否为可关闭标签booleanfalse

Slots

名称说明
default标签显示内容

Events

事件名说明回调参数
click点击时触发event: Event
close关闭标签时触发-


实例演示

介绍

宫格可以在水平方向上把页面分隔成等宽度的区块,用于展示内容或进行页面导航

引入

import Vue from 'vue';import { Grid, GridItem } from 'vant';Vue.use(Grid);Vue.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>

页面导航

通过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属性后,会在图标右上角展示一个小红点。设置info属性后,会在图标右上角展示相应的徽标

<van-grid :column-num="2">  <van-grid-item icon="home-o" text="文字" dot />  <van-grid-item icon="search" text="文字" info="99+" /></van-grid>

API

Grid Props

参数说明类型默认值
column-num v2.0.4列数number | string4
icon-size v2.2.6图标大小,默认单位为pxnumber | string28px
gutter格子之间的间距,默认单位为pxnumber | string0
border是否显示边框booleantrue
center是否将格子内容居中显示booleantrue
square是否将格子固定为正方形booleanfalse
clickable是否开启格子点击反馈booleanfalse

GridItem Props

参数说明类型默认值
text文字string-
icon图标名称 或图片链接string-
dot v2.2.1是否显示图标右上角小红点booleanfalse
info v2.2.1图标右上角徽标的内容number | string-
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

GridItem Events

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

GridItem Slots

名称说明
default自定义宫格的所有内容
icon自定义图标
text自定义文字


实例演示

引入

import Vue from 'vue';import { IndexBar, IndexAnchor } from 'vant';Vue.use(IndexBar);Vue.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 {  data() {    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 v2.0.7锚点自动吸顶时与顶部的距离number0
highlight-color索引字符高亮颜色string#07c160

IndexAnchor Props

参数说明类型默认值
index索引字符number | string-

IndexBar Events

事件名说明回调参数
select选中字符时触发index: 索引字符

IndexAnchor Slots

名称说明
default锚点位置显示内容,默认为索引字符


实例演示

引入

import Vue from 'vue';import { NavBar } from 'vant';Vue.use(NavBar);

代码演示

基础用法

<van-nav-bar  title="标题"  left-text="返回"  right-text="按钮"  left-arrow  @click-left="onClickLeft"  @click-right="onClickRight"/>
import { Toast } from 'vant';export default {  methods: {    onClickLeft() {      Toast('返回');    },    onClickRight() {      Toast('按钮');    }  }}

高级用法

通过插槽定制内容

<van-nav-bar title="标题" left-text="返回" left-arrow>  <van-icon name="search" slot="right" /></van-nav-bar>

API

Props

参数说明类型默认值
title标题string''
left-text左侧文案string''
right-text右侧文案string''
left-arrow是否显示左侧箭头booleanfalse
fixed是否固定在顶部booleanfalse
border是否显示下边框booleantrue
z-index元素 z-indexnumber | string1

Slots

名称说明
title自定义标题
left自定义左侧区域内容
right自定义右侧区域内容

Events

事件名说明回调参数
click-left点击左侧按钮时触发-
click-right点击右侧按钮时触发-


实例演示

引入

import Vue from 'vue';import { Pagination } from 'vant';Vue.use(Pagination);

代码演示

基础用法

<van-pagination   v-model="currentPage"   :total-items="24"   :items-per-page="5"/>
export default {  data() {    return  {      currentPage: 1    }  }}

简单模式

<van-pagination   v-model="currentPage"   :page-count="12"  mode="simple" />

显示省略号

<van-pagination   v-model="currentPage"   :total-items="125"   :show-page-size="3"   force-ellipses/>

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页码改变时触发-


实例演示

引入

import Vue from 'vue';import { Sidebar, SidebarItem } from 'vant';Vue.use(Sidebar);Vue.use(SidebarItem);

代码演示

基础用法

通过v-model绑定当前选中项的索引

<van-sidebar v-model="activeKey">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" /></van-sidebar>
export default {  data() {    return {      activeKey: 0    };  }};

提示信息

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

<van-sidebar v-model="activeKey">  <van-sidebar-item title="标签名称" dot />  <van-sidebar-item title="标签名称" info="5" />  <van-sidebar-item title="标签名称" info="99+" /></van-sidebar>

禁用选项

通过disabled属性禁用选项

<van-sidebar v-model="activeKey">  <van-sidebar-item title="标签名称" />  <van-sidebar-item title="标签名称" disabled />  <van-sidebar-item title="标签名称" /></van-sidebar>

监听切换事件

设置change方法来监听切换导航项时的事件

<van-sidebar v-model="activeKey" @change="onChange">  <van-sidebar-item title="标签名1" />  <van-sidebar-item title="标签名2" />  <van-sidebar-item title="标签名3" /></van-sidebar>
import { Notify } from 'vant';export default {  data() {    return {      activeKey: 0    };  },  methods: {    onChange(index) {      Notify({ type: 'primary', message: index });    }  }}

API

Sidebar Props

参数说明类型默认值
v-model v2.0.4当前导航项的索引number | string0

Sidebar Events

事件名说明回调参数
change切换导航项时触发index: 当前导航项的索引

SidebarItem Props

参数说明类型默认值
title内容string''
dot v2.2.1是否显示右上角小红点booleanfalse
info右上角徽标的内容number | string-
disabled v2.2.0是否禁用该项booleanfalse
url点击后跳转的链接地址string-
to v2.0.4点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace v2.0.4是否在跳转时替换当前页面历史booleanfalse

SidebarItem Events

事件名说明回调参数
click点击时触发index: 当前导航项的索引


实例演示

引入

import Vue from 'vue';import { Tab, Tabs } from 'vant';Vue.use(Tab);Vue.use(Tabs);

代码演示

基础用法

通过v-model绑定当前激活标签对应的索引值,默认情况下启用第一个标签

<van-tabs v-model="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>
export default {  data() {    return {      active: 2    };  }}

通过名称匹配

在标签指定name属性的情况下,v-model的值为当前标签的name

<van-tabs v-model="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>
export default {  data() {    return {      activeName: 'a'    };  }}

标签栏滚动

标签数量超过 4 个时,标签栏可以在水平方向上滚动,切换时会自动将当前标签居中

<van-tabs>  <van-tab v-for="index in 8" :title="'标签 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

禁用标签

设置disabled属性即可禁用标签。如果需要监听禁用标签的点击事件,可以在van-tabs上监听disabled事件

<van-tabs @disabled="onClickDisabled">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2" disabled>内容 2</van-tab>  <van-tab title="标签 3">内容 3</van-tab></van-tabs>
import { Toast } from 'vant';export default {  methods: {    onClickDisabled(name, title) {      Toast(name + '已被禁用');    }  }};

样式风格

Tab支持两种样式风格:linecard,默认为line样式,可以通过type属性修改样式风格

<van-tabs 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>

点击事件

可以在van-tabs上绑定click事件,事件传参为标签对应的索引和标题

<van-tabs @click="onClick">  <van-tab title="标签 1">内容 1</van-tab>  <van-tab title="标签 2">内容 2</van-tab></van-tabs>
import { Toast } from 'vant';export default {  methods: {    onClick(name, title) {      Toast(title);    }  }};

粘性布局

通过sticky属性可以开启粘性布局,粘性布局下,当 Tab 滚动到顶部时会自动吸顶

<van-tabs v-model="active" sticky>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

自定义标签

通过 title 插槽可以自定义标签内容

<van-tabs v-model="active">  <van-tab v-for="index in 2">    <div slot="title">      <van-icon name="more-o" />选项    </div>    内容 {{ index }}  </van-tab></van-tabs>

切换动画

通过animated属性可以开启切换标签内容时的转场动画

<van-tabs v-model="active" animated>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

滑动切换

通过swipeable属性可以开启滑动切换标签页

<van-tabs v-model="active" swipeable>  <van-tab v-for="index in 4" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

滚动导航

通过scrollspy属性可以开启滚动导航模式,该模式下,内容将会平铺展示

<van-tabs v-model="active" scrollspy sticky>  <van-tab v-for="index in 8" :title="'选项 ' + index">    内容 {{ index }}  </van-tab></van-tabs>

API

Tabs Props

参数说明类型默认值
v-model绑定当前选中标签的标识符number | string0
type样式风格类型,可选值为cardstringline
color标签主题色string#ee0a24
background标签栏背景色stringwhite
duration动画时间,单位秒number | string0.3
line-width底部条宽度,默认单位pxnumber | stringauto
line-height底部条高度,默认单位pxnumber | string3px
animated是否开启切换标签内容时的转场动画booleanfalse
border是否显示标签栏外边框,仅在type="line"时有效booleantrue
ellipsis是否省略过长的标题文字booleantrue
sticky是否使用粘性定位布局booleanfalse
swipeable是否开启手势滑动切换booleanfalse
lazy-render是否开启延迟渲染(首次切换到标签时才触发内容渲染)booleantrue
scrollspy v2.3.0是否开启滚动导航booleanfalse
offset-top粘性定位布局下与顶部的最小距离,单位pxnumber | string0
swipe-threshold滚动阈值,标签数量超过阈值时开始横向滚动number | string4
title-active-color标题选中态颜色string-
title-inactive-color标题默认态颜色string-

Tab Props

参数说明类型默认值
title标题string-
disabled是否禁用标签booleanfalse
dot v2.3.0是否在标题右上角显示小红点booleanfalse
info v2.3.0标题右上角徽标的内容number | string-
name v2.0.6标签名称,作为匹配的标识符number | string标签的索引值
url v2.2.1点击后跳转的链接地址string-
to v2.2.1点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace v2.2.1是否在跳转时替换当前页面历史booleanfalse
title-style v2.2.14自定义标题样式any-

Tabs Events

事件名说明回调参数
click点击标签时触发name:标识符,title:标题
change当前激活的标签改变时触发name:标识符,title:标题
disabled点击被禁用的标签时触发name:标识符,title:标题
rendered v2.3.0标签内容首次渲染时触发(仅在开启延迟渲染后触发)name:标识符,title:标题
scroll滚动时触发,仅在 sticky 模式下生效{ scrollTop: 距离顶部位置, isFixed: 是否吸顶 }

Tabs 方法

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

方法名说明参数返回值
resize外层元素大小变化后,可以调用此方法来触发重绘-void

Tabs Slots

名称说明
nav-left标题左侧内容
nav-right标题右侧内容

Tab Slots

名称说明
default标签页内容
title自定义标题,不支持动态渲染


实例演示

引入

import Vue from 'vue';import { Tabbar, TabbarItem } from 'vant';Vue.use(Tabbar);Vue.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>
export default {  data() {    return {      active: 0    }  }}

通过名称匹配

在标签指定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>
export default {  data() {    return {      active: 'home'    }  }}

提示信息

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

<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" info="5">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o" info="20">标签</van-tabbar-item></van-tabbar>

自定义图标

通过 icon 插槽自定义图标,可以通过 slot-scope 判断标签是否选中

<van-tabbar v-model="active">  <van-tabbar-item info="3">    <span>自定义</span>    <img      slot="icon"      slot-scope="props"      :src="props.active ? icon.active : icon.inactive"    >  </van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
export default {  data() {    return {      active: 0,      icon: {        active: 'https://img.yzcdn.cn/vant/user-active.png',        inactive: 'https://img.yzcdn.cn/vant/user-inactive.png'      }    }  }}

自定义颜色

<van-tabbar  v-model="active"  active-color="#07c160"  inactive-color="#000">  <van-tabbar-item icon="home-o">标签</van-tabbar-item>  <van-tabbar-item icon="search">标签</van-tabbar-item>  <van-tabbar-item icon="freinds-o">标签</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>

监听切换事件

<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="freinds-o">标签3</van-tabbar-item>  <van-tabbar-item icon="setting-o">标签4</van-tabbar-item></van-tabbar>
import { Notify } from 'vant';export default {  methods: {    onChange(index) {      Notify({ type: 'primary', message: index });    }  }}

路由模式

标签栏支持路由模式,用于搭配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
safe-area-inset-bottom是否开启 底部安全区适配booleanfalse

Tabbar Events

事件名说明回调参数
change切换标签时触发active: 当前选中标签的名称或索引值

TabbarItem Props

参数说明类型默认值
name标签名称,作为匹配的标识符number | string当前标签的索引值
icon图标名称 或图片链接string-
dot是否显示图标右上角小红点booleanfalse
info图标右上角徽标的内容number | string-
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

TabbarItem Slots

名称说明SlotProps
icon自定义图标active: 是否为选中标签


实例演示

引入

import Vue from 'vue';import { TreeSelect } from 'vant';Vue.use(TreeSelect);

代码演示

单选模式

item为分类显示所需的数据,数据格式见下方示例。main-active-index表示左侧高亮选项的索引,active-id表示右侧高亮选项的 id

<van-tree-select  :items="items"  :active-id.sync="activeId"  :main-active-index.sync="activeIndex"/>
export default {  data() {    return {      items,      activeId: 1,      activeIndex: 0    };  }}

多选模式

active-id为数组格式时,可以选中多个右侧选项

<van-tree-select  :items="items"  :active-id.sync="activeIds"  :main-active-index.sync="activeIndex"/>
export default {  data() {    return {      items,      activeIds: [1, 2],      activeIndex: 0    };  }}

自定义内容

通过content插槽可以自定义右侧区域的内容

<van-tree-select  height="55vw"  :items="items"  :main-active-index.sync="active">  <template slot="content">    <van-image v-if="active === 0" src="https://img.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow"  />    <van-image v-if="active === 1" src="https://img.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow"  />  </template></van-tree-select>
export default {  data() {    return {      active: 0,      items: [{ text: '分组 1' }, { text: '分组 2' }]    }  }}

提示信息

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

<van-tree-select  height="55vw"  :items="items"  :main-active-index.sync="activeIndex"/>
export default {  data() {    return {      activeIndex: 0,      items: [        { text: '浙江', children: [], dot: true },        { text: '江苏', children: [], info: 5 }      ]    }  }}

API

Props

参数说明类型默认值
items分类显示所需的数据Item[][]
height高度,默认单位为pxnumber | string300
main-active-index左侧选中项的索引number | string0
active-id右侧选中项的 id,支持传入数组number | string |
(number | string)[]
0
max v2.2.0右侧项最大选中个数number | stringInfinity

Events

事件名说明回调参数
click-nav点击左侧导航时触发index:被点击的导航的索引
click-item点击右侧选择项时触发data: 该点击项的数据

Slots

名称说明
content自定义右侧区域内容

Item 数据结构

items 整体为一个数组,数组内包含一系列描述分类的对象,每个分类里,text表示当前分类的名称,children表示分类里的可选项。

[  {    // 导航名称    text: '所有城市',    // 导航名称右上角徽标    info: 3,    // 是否在导航名称右上角显示小红点    dot: true,    // 导航节点额外类名    className: 'my-class',    // 该导航下所有的可选项    children: [      {        // 名称        text: '温州',        // id,作为匹配选中状态的标识符        id: 1,        // 禁用选项        disabled: true      },      {        text: '杭州',        id: 2      }    ]  }]


实例演示

引入

import Vue from 'vue';import { AddressEdit } from 'vant';Vue.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 { Toast } from 'vant';export default {  data() {    return {      areaList,      searchResult: []    }  },  methods: {    onSave() {      Toast('save');    },    onDelete() {      Toast('delete');    },    onChangeDetail(val) {      if (val) {        this.searchResult = [{          name: '黄龙万科中心',          address: '杭州市西湖区'        }];      } else {        this.searchResult = [];      }    }  }}

API

Props

参数说明类型默认值
area-list地区列表object-
area-columns-placeholder v2.2.5地区选择列占位提示文字string[][]
address-info收货人信息初始值AddressInfo{}
search-result详细地址搜索结果SearchResult[][]
show-postal是否显示邮政编码booleanfalse
show-delete是否显示删除按钮booleanfalse
show-set-default是否显示默认地址栏booleanfalse
show-search-result是否显示搜索结果booleanfalse
save-button-text保存按钮文字string保存
delete-button-text删除按钮文字string删除
detail-rows详细地址输入框行数number | string1
detail-maxlength v2.0.4详细地址最大长度number | string200
is-saving是否显示保存按钮加载动画booleanfalse
is-deleting是否显示删除按钮加载动画booleanfalse
tel-validator手机号格式校验函数string => boolean-
postal-validator v2.1.2邮政编码格式校验函数string => boolean-
validator自定义校验函数(key, val) => string-

Events

事件名说明回调参数
save点击保存按钮时触发content:表单内容
focus输入框聚焦时触发key: 聚焦的输入框对应的 key
delete确认删除地址时触发content:表单内容
cancel-delete取消删除地址时触发content:表单内容
select-search选中搜索结果时触发value: 搜索结果
change-area修改收件地区时触发values: 地区信息
change-detail修改详细地址时触发value: 详细地址内容
change-default切换是否使用默认地址时触发value: 是否选中

Slots

名称说明
default在邮政编码下方插入内容

方法

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

方法名说明参数返回值
setAddressDetail设置详细地址addressDetail: string-

AddressInfo 数据格式

注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取

key说明类型
id每条地址的唯一标识number | string
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 组件。


实例演示

引入

import Vue from 'vue';import { AddressList } from 'vant';Vue.use(AddressList);

代码演示

基础用法

<van-address-list  v-model="chosenAddressId"  :list="list"  :disabled-list="disabledList"  disabled-text="以下地址超出配送范围"  default-tag-text="默认"  @add="onAdd"  @edit="onEdit"/>
import { Toast } from 'vant';export default {  data() {    return {      chosenAddressId: '1',      list: [        {          id: '1',          name: '张三',          tel: '13000000000',          address: '浙江省杭州市西湖区文三路 138 号东方通信大厦 7 楼 501 室'        },        {          id: '2',          name: '李四',          tel: '1310000000',          address: '浙江省杭州市拱墅区莫干山路 50 号'        }      ],      disabledList: [        {          id: '3',          name: '王五',          tel: '1320000000',          address: '浙江省杭州市滨江区江南大道 15 号'        }      ]    }  },  methods: {    onAdd() {      Toast('新增地址');    },    onEdit(item, index) {      Toast('编辑地址:' + index);    }  }}

API

Props

参数说明类型默认值
v-model当前选中地址的 idstring-
list地址列表Address[][]
disabled-list不可配送地址列表Address[][]
disabled-text不可配送提示文案string-
switchable是否允许切换地址booleantrue
add-button-text底部按钮文字string新增地址
default-tag-text v2.3.0默认地址标签文字string-

Events

事件名说明回调参数
add点击新增按钮时触发-
edit点击编辑按钮时触发item: 地址对象,index: 索引
select切换选中的地址时触发item: 地址对象,index: 索引
edit-disabled编辑不可配送的地址时触发item: 地址对象,index: 索引
select-disabled选中不可配送的地址时触发item: 地址对象,index: 索引
click-item点击任意地址时触发item: 地址对象,index: 索引

Address 数据结构

键名说明类型
id每条地址的唯一标识number | string
name收货人姓名string
tel收货人手机号number | string
address收货地址string
isDefault是否为默认地址boolean

Slots

名称说明
default在列表下方插入内容
top在顶部插入内容


实例演示

介绍

省市区三级联动选择,通常与 弹出层 组件配合使用

引入

import Vue from 'vue';import { Area } from 'vant';Vue.use(Area);

代码演示

基础用法

要初始化一个Area组件,你需要传入一个area-list属性,数据格式具体可看下面数据格式章节

<van-area :area-list="areaList" />

选中省市区

如果想选中某个省市区,需要传入一个value属性,绑定对应的省市区code

<van-area :area-list="areaList" value="110101" />

配置显示列

可以通过columns-num属性配置省市区显示的列数,默认情况下会显示省市区,当你设置为2,则只会显示省市选择

<van-area :area-list="areaList" :columns-num="2" title="标题" />

配置列占位提示文字

可以通过columns-placeholder属性配置每一列的占位提示文字

<van-area  :area-list="areaList"  :columns-placeholder="['请选择', '请选择', '请选择']"  title="标题"/>

API

Props

参数说明类型默认值
value当前选中的省市区codestring-
title顶部栏标题string-
confirm-button-text确认按钮文字string确认
cancel-button-text取消按钮文字string取消
area-list省市区数据,格式见下方object-
columns-placeholder v2.2.5列占位提示文字string[][]
loading是否显示加载状态booleanfalse
item-height选项高度number | string44
columns-num显示列数,3-省市区,2-省市,1-省number | string3
visible-item-count可见的选项个数number | string5
swipe-duration v2.2.13快速滑动时惯性滚动的时长,单位msnumber | string1000
is-oversea-code v2.1.4根据code校验海外地址,海外地址会划分至单独的分类() => boolean-

Events

事件说明回调参数
confirm点击右上方完成按钮一个数组参数,具体格式看下方数据格式章节
cancel点击取消按钮时-
change选项改变时触发Picker 实例,所有列选中值,当前列对应的索引

方法

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

方法名说明参数返回值
reset根据 code 重置所有选项,若不传 code,则重置到第一项code?: string-

省市区列表数据格式

整体是一个 object,包含 province_list, city_list, county_list 三个 key。

每项以省市区编码作为 key,省市区名字作为 value。编码为 6 位数字,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。如北京编码为 11,以零补足 6 位,为 110000。

AreaList具体格式如下:

{  province_list: {    110000: '北京市',    120000: '天津市'  },  city_list: {    110100: '北京市',    110200: '县',    120100: '天津市',    120200: '县'  },  county_list: {    110101: '东城区',    110102: '西城区',    110105: '朝阳区',    110106: '丰台区'    120101: '和平区',    120102: '河东区',    120103: '河西区',    120104: '南开区',    120105: '河北区',    // ....  }}

完整数据见 Area.json

点击完成时返回的数据格式

返回的数据整体为一个数组,数组内包含 columnsNum 个数据, 每个数据对应一列选项中被选中的数据。

code 代表被选中的地区编码, name 代表被选中的地区名称

[  {    code: '110000',    name: '北京市'  },  {    code: '110100',    name: '北京市'  },  {    code: '110101',    name: '东城区'  }];

常见问题

在桌面端无法操作组件?

参见在桌面端使用


实例演示

引入

import Vue from 'vue';import { Card } from 'vant';Vue.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">  <div slot="tags">    <van-tag plain type="danger">标签</van-tag>    <van-tag plain type="danger">标签</van-tag>  </div>  <div slot="footer">    <van-button size="mini">按钮</van-button>    <van-button size="mini">按钮</van-button>  </div></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: Event
click-thumb点击自定义图片时触发event: Event

Slots

名称说明
title自定义标题
desc自定义描述
num自定义数量
price自定义价格
origin-price自定义商品原价
price-top自定义价格上方区域
bottom自定义价格下方区域
thumb自定义图片
tag自定义图片角标
tags自定义描述下方标签区域
footer自定义右下角内容


实例演示

介绍

通过 Contact 组件可以实现联系人的展示、选择、编辑等功能。

引入

import Vue from 'vue';import { ContactCard, ContactList, ContactEdit } from 'vant';Vue.use(ContactCard);Vue.use(ContactList);Vue.use(ContactEdit);

代码演示

基础用法

<!-- 联系人卡片 --><van-contact-card  :type="cardType"  :name="currentContact.name"  :tel="currentContact.tel"  @click="showList = true"/><!-- 联系人列表 --><van-popup v-model="showList" position="bottom">  <van-contact-list    v-model="chosenContactId"    :list="list"    @add="onAdd"    @edit="onEdit"    @select="onSelect"  /></van-popup><!-- 联系人编辑 --><van-popup v-model="showEdit" position="bottom">  <van-contact-edit    :contact-info="editingContact"    :is-edit="isEdit"    @save="onSave"    @delete="onDelete"  /></van-popup>
export default {  data() {    return {      chosenContactId: null,      editingContact: {},      showList: false,      showEdit: false,      isEdit: false,      list: [{        name: '张三',        tel: '13000000000',        id: 0      }]    };  },  computed: {    cardType() {      return this.chosenContactId !== null ? 'edit' : 'add';    },    currentContact() {      const id = this.chosenContactId;      return id !== null ? this.list.filter(item => item.id === id)[0] : {};    }  },  methods: {    // 添加联系人    onAdd() {      this.editingContact = { id: this.list.length };      this.isEdit = false;      this.showEdit = true;    },    // 编辑联系人    onEdit(item) {      this.isEdit = true;            this.showEdit = true;      this.editingContact = item;    },    // 选中联系人    onSelect() {      this.showList = false;    },    // 保存联系人    onSave(info) {      this.showEdit = false;      this.showList = false;            if (this.isEdit) {        this.list = this.list.map(item => item.id === info.id ? info : item);      } else {        this.list.push(info);      }      this.chosenContactId = info.id;    },    // 删除联系人    onDelete(info) {      this.showEdit = false;      this.list = this.list.filter(item => item.id !== info.id);      if (this.chosenContactId === info.id) {        this.chosenContactId = null;      }    }  }};

不可编辑

<van-contact-card  type="edit"  name="张三"  tel="13000000000"  :editable="false"/>

API

ContactCard Props

参数说明类型默认值
type类型,可选值为 add editstringadd
name联系人姓名string-
tel联系人手机号string-
add-text添加时的文案提示string添加订单联系人信息

ContactCard Events

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

ContactList Props

参数说明类型默认值
v-model当前选中联系人的 idnumber | string-
list联系人列表Contact[][]
add-text新建按钮文案string新建联系人
default-tag-text v2.3.0默认联系人标签文案string-

ContactList Events

事件名说明回调参数
add点击新增按钮时触发-
edit点击编辑按钮时触发item: 当前联系人对象,index: 索引
select切换选中的联系人时触发item: 当前联系人对象,index: 索引

ContactEdit Props

参数说明类型默认值
contact-info联系人信息object[]
is-edit是否为编辑联系人booleanfalse
is-saving是否显示保存按钮加载动画booleanfalse
is-deleting是否显示删除按钮加载动画booleanfalse
tel-validator手机号格式校验函数(tel: string) => boolean-
show-set-default v2.3.0是否显示默认联系人栏booleanfalse
set-default-label v2.3.0默认联系人栏文案string-

ContactEdit Events

事件名说明回调参数
save点击保存按钮时触发content:表单内容
delete点击删除按钮时触发content:表单内容

Contact 数据结构

键名说明类型
id每位联系人的唯一标识number | string
name联系人姓名string
tel联系人手机号number | string
isDefault是否为默认联系人boolean


实例演示

引入

import Vue from 'vue';import { CouponCell, CouponList } from 'vant';Vue.use(CouponCell);Vue.use(CouponList);

代码演示

基础用法

<!-- 优惠券单元格 --><van-coupon-cell  :coupons="coupons"  :chosen-coupon="chosenCoupon"  @click="showList = true"/><!-- 优惠券列表 --><van-popup  v-model="showList"  round  position="bottom"  style="height: 90%; padding-top: 4px;">  <van-coupon-list    :coupons="coupons"    :chosen-coupon="chosenCoupon"    :disabled-coupons="disabledCoupons"    @change="onChange"    @exchange="onExchange"  /></van-popup>
const coupon = {  available: 1,  condition: '无使用门槛
最多优惠12元',  reason: '',  value: 150,  name: '优惠券名称',  startAt: 1489104000,  endAt: 1514592000,  valueDesc: '1.5',  unitDesc: '元'};export default {  data() {    return {      chosenCoupon: -1,      coupons: [coupon],      disabledCoupons: [coupon]    }  },  methods: {    onChange(index) {      this.showList = false;      this.chosenCoupon = index;    },    onExchange(code) {      this.coupons.push(coupon);    }  }}

API

CouponCell Props

参数说明类型默认值
title单元格标题string优惠券
chosen-coupon当前选中优惠券的索引number-1
coupons可用优惠券列表Coupon[][]
editable能否切换优惠券booleantrue
border是否显示内边框booleantrue
currency货币符号string¥

CouponList Props

参数说明类型默认值
v-model当前输入的兑换码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 v2.1.0列表为空时的占位图stringhttps://img.yzcdn.cn/vant/coupon-empty.png
show-count v2.3.0是否展示可用 / 不可用数量booleantrue

CouponList Events

事件名说明回调参数
change优惠券切换回调index, 选中优惠券的索引
exchange兑换优惠券回调code, 兑换码

Coupon 数据结构

键名说明类型
id优惠券 idstring
name优惠券名称string
condition满减条件string
startAt卡有效开始时间 (时间戳, 单位秒)number
endAt卡失效日期 (时间戳, 单位秒)number
description描述信息,优惠券可用时展示string
reason不可用原因,优惠券不可用时展示string
value折扣券优惠金额,单位分number
valueDesc折扣券优惠金额文案string
unitDesc单位文案string


实例演示

引入

import Vue from 'vue';import { GoodsAction, GoodsActionIcon, GoodsActionButton } from 'vant';Vue.use(GoodsAction);Vue.use(GoodsActionButton);Vue.use(GoodsActionIcon);

代码演示

基础用法

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" @click="onClickIcon" />  <van-goods-action-icon icon="cart-o" text="购物车" @click="onClickIcon" />  <van-goods-action-button type="warning" text="加入购物车" @click="onClickButton" />  <van-goods-action-button type="danger" text="立即购买" @click="onClickButton" /></van-goods-action>
import { Toast } from 'vant';export default {  methods: {    onClickIcon() {      Toast('点击图标');    },    onClickButton() {      Toast('点击按钮');    }  }}

徽标提示

通过info属性在图标右上角显示徽标

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" />  <van-goods-action-icon icon="cart-o" text="购物车" info="5" />  <van-goods-action-icon icon="shop-o" text="店铺" info="12" />  <van-goods-action-button type="warning" text="加入购物车" />  <van-goods-action-button type="danger" text="立即购买" /></van-goods-action>

自定义图标颜色

通过 GoodsActionIcon 的color属性可以自定义图标的颜色

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" color="#07c160" />  <van-goods-action-icon icon="cart-o" text="购物车" />  <van-goods-action-icon icon="star" text="已收藏" color="#ff5000" />  <van-goods-action-button type="warning" text="加入购物车" />  <van-goods-action-button type="danger" text="立即购买" /></van-goods-action>

自定义按钮颜色

通过 GoodsActionButton 的color属性可以自定义按钮的颜色,支持传入linear-gradient渐变色

<van-goods-action>  <van-goods-action-icon icon="chat-o" text="客服" />  <van-goods-action-icon icon="shop-o" text="店铺" />  <van-goods-action-button color="#be99ff" type="warning" text="加入购物车" />  <van-goods-action-button color="#7232dd" type="danger" text="立即购买" /></van-goods-action>

API

GoodsAction Props

参数说明类型默认值
safe-area-inset-bottom是否开启 底部安全区适配booleanfalse

GoodsActionIcon Props

参数说明类型默认值
text按钮文字string-
icon图标string-
color v2.4.2图标颜色string#323233
icon-class图标额外类名any-
info图标右上角徽标的内容number | string-
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

GoodsActionButton Props

参数说明类型默认值
text按钮文字string-
type按钮类型,可选值为 primary info warning dangerstringdefault
color v2.1.8按钮颜色,支持传入linear-gradient渐变色string-
icon v2.4.4左侧 图标名称 或图片链接string-
disabled是否禁用按钮booleanfalse
loading是否显示为加载状态booleanfalse
url点击后跳转的链接地址string-
to点击后跳转的目标路由对象,同 vue-router 的 to 属性string | object-
replace是否在跳转时替换当前页面历史booleanfalse

GoodsActionIcon Slots

名称说明
default文本内容
icon自定义图标

GoodsActionButton Slots

名称说明
default按钮显示内容


实例演示

引入

import Vue from 'vue';import { SubmitBar } from 'vant';Vue.use(SubmitBar);

代码演示

基础用法

<van-submit-bar  :price="3050"  button-text="提交订单"  @submit="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>  <span slot="tip">    你的收货地址不支持同城送, <span>修改地址</span>  </span></van-submit-bar>

API

Props

参数说明类型默认值
price价格(单位分)number-
label价格左侧文案string合计:
suffix-label价格右侧文案string-
text-align v2.3.0价格文案对齐方向,可选值为 leftstringright
button-text按钮文字string-
button-type按钮类型stringdanger
tip提示文案string-
tip-icon左侧 图标名称 或图片链接string-
currency货币符号string¥
decimal-length价格小数点后位数number | string2
disabled是否禁用按钮booleanfalse
loading是否显示加载中的按钮booleanfalse
safe-area-inset-bottom是否开启 底部安全区适配booleanfalse

Events

事件名说明回调参数
submit按钮点击事件回调-

Slots

名称说明
default自定义订单栏左侧内容
top自定义订单栏上方内容
tip提示文案中的额外操作和说明


实例演示

引入

import Vue from 'vue';import { Sku } from 'vant';Vue.use(Sku);

代码演示

基础用法

<van-sku  v-model="show"  :sku="sku"  :goods="goods"  :goods-id="goodsId"  :quota="quota"  :quota-used="quotaUsed"  :hide-stock="sku.hide_stock"  :message-config="messageConfig"  @buy-clicked="onBuyClicked"  @add-cart="onAddCartClicked"/>
export default {  data() {    return {      show: false,      sku: {        // 数据结构见下方文档      },      goods: {        // 数据结构见下方文档      },      messageConfig: {        // 数据结构见下方文档      }    };  }}

自定义步进器

<van-sku  v-model="show"  :sku="sku"  :goods="goods"  :goods-id="goodsId"  :quota="quota"  :quota-used="quotaUsed"  :hide-stock="sku.hide_stock"  :custom-stepper-config="customStepperConfig"  @buy-clicked="onBuyClicked"  @add-cart="onAddCartClicked"/>

高级用法

<van-sku  v-model="show"  stepper-title="我要买"  :sku="sku"  :goods="goods"  :goods-id="goodsId"  :quota="quota"  :quota-used="quotaUsed"  :hide-stock="sku.hide_stock"  show-add-cart-btn  reset-stepper-on-hide  :initial-sku="initialSku"  @buy-clicked="onBuyClicked"  @add-cart="onAddCartClicked">  <!-- 自定义 sku-header-price -->  <template slot="sku-header-price" slot-scope="props">    <div class="van-sku__goods-price">      <span class="van-sku__price-symbol">¥</span><span class="van-sku__price-num">{{ props.price }}</span>    </div>  </template>  <!-- 自定义 sku actions -->  <template slot="sku-actions" slot-scope="props">    <div class="van-sku-actions">      <van-button        square        size="large"        type="warning"        @click="onPointClicked"      >        积分兑换      </van-button>      <!-- 直接触发 sku 内部事件,通过内部事件执行 onBuyClicked 回调 -->      <van-button        square        size="large"        type="danger"        @click="props.skuEventBus.$emit('sku:buy')"      >        买买买      </van-button>    </div>  </template></van-sku>

API

Props

参数说明类型默认值
v-model是否显示skubooleanfalse
sku商品sku数据object-
goods商品信息object-
goods-id商品 idnumber | string-
price-tag显示在价格后面的标签string-
hide-stock是否显示商品剩余库存booleanfalse
hide-quota-text是否显示限购提示booleanfalse
hide-selected-text是否隐藏已选提示booleanfalse
stock-threshold库存阈值。低于这个值会把库存数高亮显示boolean50
show-add-cart-btn是否显示加入购物车按钮booleantrue
buy-text购买按钮文字string立即购买
add-cart-text加入购物车按钮文字string加入购物车
quota限购数,0 表示不限购number0
quota-used已经购买过的数量number0
reset-stepper-on-hide隐藏时重置选择的商品数量booleanfalse
reset-selected-sku-on-hide隐藏时重置已选择的 skubooleanfalse
disable-stepper-input是否禁用步进器输入booleanfalse
close-on-click-overlay是否在点击遮罩层后关闭booleanfalse
stepper-title数量选择组件左侧文案string购买数量
custom-stepper-config步进器相关自定义配置object{}
message-config留言相关配置object{}
get-container指定挂载的节点,用法示例string | () => Element-
initial-sku默认选中的 sku,具体参考高级用法object{}
show-soldout-sku是否展示售罄的 sku,默认展示并置灰booleantrue
safe-area-inset-bottom v2.2.1是否开启 底部安全区适配booleanfalse
start-sale-num v2.3.0起售数量number1
properties v2.4.2商品属性array-

Events

事件名说明回调参数
add-cart点击添加购物车回调skuData: object
buy-clicked点击购买回调skuData: object
stepper-change购买数量变化时触发value: number
sku-selected切换规格类目时触发{ skuValue, selectedSku, selectedSkuComb }
sku-prop-selected切换商品属性时触发{ propValue, selectedProp, selectedSkuComb }
open-preview打开商品图片预览时触发data: object
close-preview关闭商品图片预览时触发data: object

方法

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

方法名说明参数返回值
getSkuData获取当前 skuData-skuData
resetSelectedSku v2.3.0重置选中规格到初始状态--

Slots

Sku 组件默认划分好了若干区块,这些区块都定义成了插槽,可以按需进行替换。区块顺序见下表:

名称说明
sku-header商品信息展示区,包含商品图片、名称、价格等信息
sku-header-price自定义 sku 头部价格展示
sku-header-origin-price自定义 sku 头部原价展示
sku-header-extra额外 sku 头部区域
sku-body-topsku 展示区上方的内容,无默认展示内容,按需使用
sku-group商品 sku 展示区
extra-sku-group额外商品 sku 展示区,一般用不到
sku-stepper商品数量选择区
sku-messages商品留言区
sku-actions操作按钮区

sku 对象结构

sku: {  // 所有sku规格类目与其值的从属关系,比如商品有颜色和尺码两大类规格,颜色下面又有红色和蓝色两个规格值。  // 可以理解为一个商品可以有多个规格类目,一个规格类目下可以有多个规格值。  tree: [    {      k: '颜色', // skuKeyName:规格类目名称      v: [        {          id: '30349', // skuValueId:规格值 id          name: '红色', // skuValueName:规格值名称          imgUrl: 'https://img.yzcdn.cn/1.jpg', // 规格类目图片,只有第一个规格类目可以定义图片          previewImgUrl: 'https://img.yzcdn.cn/1p.jpg', // 用于预览显示的规格类目图片        },        {          id: '1215',          name: '蓝色',          imgUrl: 'https://img.yzcdn.cn/2.jpg',          previewImgUrl: 'https://img.yzcdn.cn/2p.jpg',        }      ],      k_s: 's1' // skuKeyStr:sku 组合列表(下方 list)中当前类目对应的 key 值,value 值会是从属于当前类目的一个规格值 id    }  ],  // 所有 sku 的组合列表,比如红色、M 码为一个 sku 组合,红色、S 码为另一个组合  list: [    {      id: 2259, // skuId,下单时后端需要      price: 100, // 价格(单位分)      s1: '1215', // 规格类目 k_s 为 s1 的对应规格值 id      s2: '1193', // 规格类目 k_s 为 s2 的对应规格值 id      s3: '0', // 最多包含3个规格值,为0表示不存在该规格      stock_num: 110 // 当前 sku 组合对应的库存    }  ],  price: '1.00', // 默认价格(单位元)  stock_num: 227, // 商品总库存  collection_id: 2261, // 无规格商品 skuId 取 collection_id,否则取所选 sku 组合对应的 id  none_sku: false, // 是否无规格商品  messages: [    {      // 商品留言      datetime: '0', // 留言类型为 time 时,是否含日期。'1' 表示包含      multiple: '0', // 留言类型为 text 时,是否多行文本。'1' 表示多行      name: '留言', // 留言名称      type: 'text', // 留言类型,可选: id_no(身份证), text, tel, date, time, email      required: '1', // 是否必填 '1' 表示必填      placeholder: '' // 可选值,占位文本    }  ],  hide_stock: false // 是否隐藏剩余库存}

properties 对象结构

  [ // 商品属性    {      k_id: 123, // 属性id      k: '加料', // 属性名      is_multiple: true, // 是否可多选      v: [        {          id: 1222, // 属性值id          name: '珍珠', // 属性值名          price: 1, // 属性值加价        },        {          id: 1223,          name: '椰果',          price: 1,        }      ],    }  ]

initialSku 对象结构

{  // 键:skuKeyStr(sku 组合列表中当前类目对应的 key 值)  // 值:skuValueId(规格值 id)  s1: '30349',  s2: '1193',  // 初始选中数量  selectedNum: 3,  // 初始选中的商品属性  // 键:属性id  // 值:属性值id列表  selectedProp: {    123: [1222]  }}

goods 对象结构

goods: {  // 商品标题  title: '测试商品',  // 默认商品 sku 缩略图  picture: 'https://img.yzcdn.cn/1.jpg'}

customStepperConfig 对象结构

customStepperConfig: {  // 自定义限购文案  quotaText: '每次限购xxx件',  // 自定义步进器超过限制时的回调  handleOverLimit: (data) => {    const { action, limitType, quota, quotaUsed, startSaleNum } = data;    if (action === 'minus') {      Toast(startSaleNum > 1  ? `${startSaleNum}件起售` : '至少选择一件商品');    } else if (action === 'plus') {      // const { LIMIT_TYPE } = Sku.skuConstants;      if (limitType === LIMIT_TYPE.QUOTA_LIMIT) {        let msg = `单次限购${quota}件`;        if (quotaUsed > 0) msg += `,你已购买${quotaUsed}`;        Toast(msg);      } else {        Toast('库存不够了');      }    }  },  // 步进器变化的回调  handleStepperChange: currentValue => {},  // 库存  stockNum: 1999,  // 格式化库存  stockFormatter: stockNum => {},}

messageConfig Data Structure

messageConfig: {  // 图片上传回调,需要返回一个promise,promise正确执行的结果需要是一个图片url  uploadImg: () => {    return new Promise((resolve) => {      setTimeout(() => resolve('https://img.yzcdn.cn/upload_files/2017/02/21/FjKTOxjVgnUuPmHJRdunvYky9OHP.jpg!100x100.jpg'), 1000);    });  },  // 最大上传体积 (MB)  uploadMaxSize: 3,  // placeholder 配置  placeholderMap: {    text: 'xxx',    tel: 'xxx',    ...  }}

添加购物车和点击购买回调函数接收的 skuData 对象结构

skuData: {  // 商品 id  goodsId: '946755',  // 留言信息  messages: {    message_0: '12',    message_1: ''  },  // 另一种格式的留言,key 不同  cartMessages: {    '留言1': 'xxxx'  },  // 选择的商品数量  selectedNum: 1,  // 选择的 sku 组合  selectedSkuComb: {    id: 2257,    price: 100,    s1: '30349',    s2: '1193',    s3: '0',    stock_num: 111,    properties: [      {        k_id: 123,        k: '加料',        is_multiple: true,        v: [          {            id: 1223,            name: '椰果',            price: 1          }        ]      }    ],    property_price: 1  },}


实例演示

废弃提示

SwitchCell 组件将在 3.0 版本中废弃,请直接使用 Cell 和 Switch 组件代替

引入

import Vue from 'vue';import { SwitchCell } from 'vant';Vue.use(SwitchCell);

代码演示

基础用法

<van-cell-group>  <van-switch-cell v-model="checked" title="标题" /></van-cell-group>
export default {  data() {    return {      checked: true    }  }}

禁用状态

通过disabled属性可以将组件设置为禁用状态

<van-cell-group>  <van-switch-cell v-model="checked" disabled title="标题" /></van-cell-group>

加载状态

通过loading属性可以将组件设置为加载状态

<van-cell-group>  <van-switch-cell v-model="checked" loading title="标题" /></van-cell-group>

API

Props

参数说明类型默认值
v-model开关状态anyfalse
title左侧标题string''
border是否展示单元格内边框booleantrue
cell-size单元格大小,可选值为 largestring-
loading是否为加载状态booleanfalse
disabled是否为禁用状态booleanfalse
size开关尺寸number | string24px
active-color开关时的背景色string#1989fa
inactive-color开关时的背景色stringwhite
active-value打开时的值anytrue
inactive-value关闭时的值anyfalse

Events

事件名说明回调参数
change开关状态切换回调checked: 是否选中开关


实例演示