请参考 快速上手 章节
修改代码请阅读我们的 开发指南
使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR
现代浏览器以及 Android 4.0+, iOS 8.0+
有赞前端团队是由一群年轻、皮实、对技术饱含热情的小伙伴组成的,目前共有 100 多名前端工程师,分布在业务中台、电商、零售、美业、资产、赋能等业务线。
我们热爱分享和开源,崇尚用工程师的方式解决问题,因此造了很多工具来解决我们遇到的问题,目前我们维护的开源产品有:
我们正在寻找更多优秀的小伙伴,一起拓展前端技术的边界,期待你的加入!
项目 | 描述 |
---|---|
vant-demo | Vant 官方示例合集 |
vant-weapp | 微信小程序组件库 |
vant-cli | 开箱即用的组件库搭建工具 |
vant-icons | Vant 图标库 |
vant-touch-emulator | 在桌面端使用 Vant 的辅助库 |
本项目基于 MIT 协议,请自由地享受和参与开源
在新项目中使用 Vant 时,推荐使用 Vue 官方提供的脚手架 Vue Cli 创建项目
# 安装 Vue Clinpm install -g @vue/cli# 创建一个项目vue create hello-world# 创建完成后,可以通过命令打开图形化界面,如下图所示vue ui
在图形化界面中,点击依赖 -> 安装依赖,然后将 vant 添加到依赖中即可。
在现有项目中使用 Vant 时,可以通过npm或yarn安装
# 通过 npm 安装npm i vant -S# 通过 yarn 安装yarn add vant
我们提供了一个基于 Vue Cli 的示例工程,示例工程会帮助你了解如下内容:
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);
配置按需引入后,将不允许直接导入所有组件
使用 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>
Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具:
下面提供了一份基本的 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 语义化版本规范。
发布节奏
2020-02-01
Bug Fixes
2020-02-01
Feature
Style
Bug Fixes
2020-01-24
Feature
Bug Fixes
2020-01-19
Feature
Improvement
Bug Fixes
Types
2020-01-14
Feature
Improvement
Bug Fixes
2020-01-02
Feature
Bug Fixes
2020-01-01
New Component
Feature
Compatibility
在之前的版本中,有较多同学反馈在 iOS 10 ~ 11 上会偶现组件无法操作的情况,该问题的原因是 Vue 2.6.x 版本在绑定事件时存在事件无法冒泡的兼容性问题。相关 issue
从 2.4 版本开始,我们通过手动绑定事件的方式来规避这个问题,涉及以下组件:
Bug Fixes
Types
2019-12-21
Bug Fixes
2019-12-20
Bug Fixes
2019-12-20
Bug Fixes
2019-12-20
Style
在 2.3.0 版本中,我们对业务组件的样式进行了全新升级,涉及以下组件:
Features
Bug Fixes
2019-12-03
Features
2019-11-28
Bug Fixes
2019-11-22
Features
Bug Fixes
2019-11-14
Features
Bug Fixes
2019-11-07
Features
Bug Fixes
2019-11-04
Features
Bug Fixes
2019-10-27
Features
Bug Fixes
2019-10-20
Features
Bug Fixes
2019-10-17
Features
Bug Fixes
2019-10-11
Features
Bug Fixes
2019-10-08
Features
Bug Fixes
2019-09-28
Features
Bug Fixes
2019-09-28 ????????
Tips
2019-09-24
Features
2019-09-19
Features
Bug Fixes
2019-09-12
Features
Bug Fixes
2019-09-06
Features
Bug Fixes
2019-08-29
Features
Bug Fixes
2019-08-26
Bug Fixes
2019-08-26
Features
Bug Fixes
2019-08-23
Features
Bug Fixes
2019-08-21
Features
Bug Fixes
2019-08-15
Features
Bug Fixes
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 之前,请先花几分钟时间阅读以下文字。
按照下面的步骤操作,即可在本地开发 Vant 组件
# 克隆仓库git clone git@github.com:youzan/vant.git# 安装依赖cd vant && npm run bootstrap# 进入开发模式,浏览器访问 http://localhost:8080npm 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 # 中文文档
提 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 开发时,请遵守约定的单文件组件风格指南,指南内容节选自 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 的时候,其命名应该始终使用 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 一行,闭合标签单起一行。
<!-- 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 应该有统一的顺序,依次为指令、属性和事件。
<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 组件的国际化需求,请自行配置国际化文案。
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 primary info warning danger | string | default |
size | 尺寸,可选值为 large small mini | string | normal |
text | 按钮文字 | string | - |
color v2.1.8 | 按钮颜色,支持传入linear-gradient 渐变色 | string | - |
icon | 左侧 图标名称 或图片链接 | string | - |
tag | HTML 标签 | string | button |
native-type | 原生 button 标签 type 属性 | string | - |
block | 是否为块级元素 | boolean | false |
plain | 是否为朴素按钮 | boolean | false |
square | 是否为方形按钮 | boolean | false |
round | 是否为圆形按钮 | boolean | false |
disabled | 是否禁用按钮 | boolean | false |
hairline | 是否使用 0.5px 边框 | boolean | false |
loading | 是否显示为加载状态 | boolean | false |
loading-text | 加载状态提示文字 | string | - |
loading-type | 加载图标类型,可选值为spinner | string | circular |
loading-size | 加载图标大小 | string | 20px |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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时,内容会靠左对齐
<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="描述信息" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 分组标题 | string | - |
border | 是否显示外边框 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
icon | 左侧 图标名称 或图片链接 | string | - |
title | 左侧标题 | number | string | - |
value | 右侧内容 | number | string | - |
label | 标题下方的描述信息 | string | - |
size | 单元格大小,可选值为 large | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
border | 是否显示内边框 | boolean | true |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
clickable | 是否开启点击反馈 | boolean | false |
is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false |
required | 是否显示表单必填星号 | boolean | false |
center | 是否使内容垂直居中 | boolean | false |
arrow-direction | 箭头方向,可选值为 left up down | string | right |
title-style | 左侧标题额外样式 | any | - |
title-class | 左侧标题额外类名 | any | - |
value-class | 右侧内容额外类名 | any | - |
label-class | 描述信息额外类名 | any | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击单元格时触发 | event: Event |
名称 | 说明 |
---|---|
default | 默认插槽 |
title | 自定义分组标题 |
名称 | 说明 |
---|---|
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" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 图标名称或图片链接 | string | - |
dot v2.2.1 | 是否显示图标右上角小红点 | boolean | false |
info | 图标右上角徽标的内容 | number | string | - |
color | 图标颜色 | string | inherit |
size | 图标大小,如 20px 2em ,默认单位为px | number | string | inherit |
class-prefix | 类名前缀 | string | van-icon |
tag | HTML 标签 | string | i |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
src | 图片链接 | string | - |
fit | 图片填充模式 | string | fill |
alt | 替代文本 | string | - |
width | 宽度,默认单位为px | number | string | - |
height | 高度,默认单位为px | number | string | - |
radius v2.1.6 | 圆角大小,默认单位为px | number | string | 0 |
round | 是否显示为圆形 | boolean | false |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
show-error v2.0.9 | 是否展示图片加载失败提示 | boolean | true |
show-loading v2.0.9 | 是否展示图片加载中提示 | boolean | true |
error-icon v2.4.2 | 失败时提示的 图标名称 或图片链接 | string | warning-o |
loading-icon v2.4.2 | 加载时提示的 图标名称 或图片链接 | string | photo-o |
名称 | 含义 |
---|---|
contain | 保持宽高缩放图片,使图片的长边能完全显示出来 |
cover | 保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边 |
fill | 拉伸图片,使图片填满元素 |
none | 保持图片原有尺寸 |
scale-down | 取none 或contain 中较小的一个 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击图片时触发 | event: Event |
load | 图片加载完毕时触发 | - |
error | 图片加载失败时触发 | - |
名称 | 说明 |
---|---|
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>
将 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 布局方式,可选值为flex | string | - |
gutter | 列元素之间的间距(单位为px) | number | string | - |
tag | 自定义元素标签 | string | div |
justify | Flex 主轴对齐方式,可选值为 end center space-around space-between | string | start |
align | Flex 交叉轴对齐方式,可选值为 center bottom | string | top |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
span | 列元素宽度 | number | string | - |
offset | 列元素偏移距离 | number | string | - |
tag | 自定义元素标签 | string | div |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
运行效果:
弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示
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 属性的组件不能为根节点
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前组件是否显示 | boolean | false |
overlay | 是否显示遮罩层 | boolean | true |
position | 弹出位置,可选值为 top bottom right left | string | center |
overlay-class | 自定义遮罩层类名 | string | - |
overlay-style | 自定义遮罩层样式 | object | - |
duration | 动画时长,单位秒 | number | string | 0.3 |
round v2.0.7 | 是否显示圆角 | boolean | false |
lock-scroll | 是否锁定背景滚动 | boolean | true |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
close-on-popstate v2.2.10 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
closeable v2.2.0 | 是否显示关闭图标 | boolean | false |
close-icon v2.2.0 | 关闭图标名称或图片链接 | string | cross |
close-icon-position v2.2.2 | 关闭图标位置,可选值为top-left bottom-left bottom-right | string | top-right |
transition | 动画类名,等价于 transtion 的name 属性 | string | - |
get-container | 指定挂载的节点 | string | () => Element | - |
safe-area-inset-bottom v2.2.1 | 是否开启 底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
为元素添加 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' }"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示日历弹窗 | boolean | false |
type | 选择类型,single 表示选择单个日期,range 表示选择日期区间 | string | single |
title | 日历标题 | string | 日期选择 |
color | 颜色,对底部按钮和选中日期生效 | string | #ee0a24 |
min-date | 最小日期 | Date | 当前日期 |
max-date | 最大日期 | Date | 当前日期的六个月后 |
default-date | 默认选中的日期 | Date | Date[] | 今天 |
row-height | 日期行高 | number | string | 64 |
formatter | 日期格式化函数 | (day: Day) => Day | - |
position | 弹出位置,可选值为 top right left | string | bottom |
poppable | 是否以弹层的形式展示日历 | boolean | true |
round | 是否显示圆角弹窗 | boolean | true |
show-mark | 是否显示月份背景水印 | boolean | true |
show-confirm | 是否展示确认按钮 | boolean | true |
close-on-popstate v2.4.4 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | true |
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 对象,通过formatter属性可以自定义 Day 对象的内容
键名 | 说明 | 类型 |
---|---|---|
date | 日期对应的 Date 对象 | Date |
type | 日期类型,可选值为selected 、start 、middle 、end 、disabled | string |
text | 中间显示的文字 | string |
topInfo | 上方的提示信息 | string |
bottomInfo | 下方的提示信息 | string |
className | 额外类名 | string |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 点击任意日期时触发 | value: Date | Date[] |
confirm | 日期选择完成后触发,若show-confirm 为true ,则点击确认按钮后触发 | value: Date | Date[] |
名称 | 说明 |
---|---|
title | 自定义标题 |
footer | 自定义底部区域内容 |
通过 ref 可以获取到 Calendar 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
reset | 重置选中的日期到默认值 | - | - |
如果你遇到了在 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(); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标识符 | any | - |
shape | 形状,可选值为 square | string | round |
v-model | 是否为选中状态 | boolean | false |
disabled | 是否禁用复选框 | boolean | false |
label-disabled | 是否禁用复选框文本点击 | boolean | false |
label-position | 文本位置,可选值为 left | string | right |
icon-size | 图标大小,默认单位为px | number | string | 20px |
checked-color | 选中状态颜色 | string | #1989fa |
bind-group v2.2.4 | 是否与复选框组绑定 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 所有选中项的标识符 | any[] | - |
disabled | 是否禁用所有复选框 | boolean | false |
max | 最大可选数,0 为无限制 | number | string | 0 |
icon-size v2.2.3 | 所有复选框的图标大小,默认单位为px | number | string | 20px |
checked-color v2.2.3 | 所有复选框的选中状态颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | 当前组件的值 |
click | 点击复选框时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | 当前组件的值 |
名称 | 说明 | SlotProps |
---|---|---|
default | 自定义文本 | - |
icon | 自定义图标 | checked: 是否为选中状态 |
通过 ref 可以获取到 CheckboxGroup 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggleAll | 切换所有复选框,传true 为选中,false 为取消选中,不传参为取反 | checked?: boolean | - |
通过 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; } }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 date time year-month | string | datetime |
title | 顶部栏标题 | string | '' |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
show-toolbar | 是否显示顶部栏 | boolean | true |
loading | 是否显示加载状态 | boolean | false |
filter | 选项过滤函数 | (type, vals) => vals | - |
formatter | 选项格式化函数 | (type, val) => val | - |
item-height | 选项高度 | number | string | 44 |
visible-item-count | 可见的选项个数 | number | string | 5 |
swipe-duration v2.2.13 | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
当时间选择器类型为 date 或 datetime 时,支持以下 props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
min-date | 可选的最小时间,精确到分钟 | Date | 十年前 |
max-date | 可选的最大时间,精确到分钟 | Date | 十年后 |
当时间选择器类型为 time 时,支持以下 props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
min-hour | 可选的最小小时 | number | string | 0 |
max-hour | 可选的最大小时 | number | string | 23 |
min-minute | 可选的最小分钟 | number | string | 0 |
max-minute | 可选的最大分钟 | number | string | 59 |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当值变化时触发的事件 | picker: Picker 实例 |
confirm | 点击完成按钮时触发的事件 | value: 当前选中的时间 |
cancel | 点击取消按钮时触发的事件 | - |
通过 ref 可以获取到 DatetimePicker 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
getPicker v2.4.0 | 获取 Picker 实例,用于调用 Picker 的实例方法 | - | - |
请注意不要在模板中直接使用类似min-date="new Date()"的写法,这样会导致每次渲染组件时传入一个新的 Date 对象,而传入新的数据会触发下一次渲染,从而陷入死循环。
正确的做法是将min-date作为一个数据定义在data函数中。
如果你遇到了在 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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 输入框左侧文本 | string | - |
value | 当前输入的值 | number | string | - |
type | 输入框类型, 可选值为 tel digit number textarea password 等 | string | text |
size | 大小,可选值为 large | string | - |
maxlength | 输入的最大字符数 | number | string | - |
placeholder | 占位提示文字 | string | - |
border | 是否显示内边框 | boolean | true |
disabled | 是否禁用输入框 | boolean | false |
readonly | 是否只读 | boolean | false |
required | 是否显示表单必填星号 | boolean | false |
clearable | 是否启用清除控件 | boolean | false |
clickable | 是否开启点击反馈 | boolean | false |
is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false |
autofocus | 是否自动聚焦,iOS 系统不支持该属性 | boolean | false |
show-word-limit v2.2.8 | 是否显示字数统计,需要设置maxlength 属性 | boolean | false |
error | 是否将输入内容标红 | boolean | false |
formatter v2.4.2 | 输入内容格式化函数 | Function | - |
arrow-direction v2.0.4 | 箭头方向,可选值为 left up down | string | right |
error-message | 底部错误提示文案,为空时不展示 | string | '' |
label-class | 左侧文本额外类名 | any | - |
label-width | 左侧文本宽度,默认单位为px | number | string | 90px |
label-align | 左侧文本对齐方式,可选值为 center right | string | left |
input-align | 输入框内容对齐方式,可选值为 center right | string | left |
error-message-align | 错误提示文案对齐方式,可选值为 center right | string | left |
autosize | 是否自适应内容高度,只对 textarea 有效, 可传入对象,如 { maxHeight: 100, minHeight: 50 }, 单位为 px | boolean | object | false |
left-icon | 左侧 图标名称 或图片链接 | string | - |
right-icon | 右侧 图标名称 或图片链接 | string | - |
除下列事件外,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 | 取消输入框焦点 | - | - |
名称 | 说明 |
---|---|
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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model v2.0.2 | 当前输入值 | string | - |
show | 是否显示键盘 | boolean | - |
theme | 样式风格,可选值为 default custom | string | default |
title | 键盘标题 | string | - |
maxlength v2.0.2 | 输入值最大长度 | number | string | - |
transition | 是否开启过场动画 | boolean | true |
z-index | 键盘 z-index | number | string | 100 |
extra-key | 左下角按键内容 | string | '' |
close-button-text | 关闭按钮文字,空则不展示 | string | - |
delete-button-text | 删除按钮文字 | string | 删除 |
show-delete-key | 是否展示删除按钮 | boolean | true |
hide-on-click-outside | 点击外部时是否收起键盘 | boolean | true |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
input | 点击按键时触发 | key: 按键内容 |
delete | 点击删除键时触发 | - |
close | 点击关闭按钮时触发 | - |
blur | 点击关闭按钮或非键盘区域时触发 | - |
show | 键盘完全弹出时触发 | - |
hide | 键盘完全收起时触发 | - |
名称 | 说明 |
---|---|
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 密码值 | string | '' |
info | 输入框下方文字提示 | string | - |
error-info | 输入框下方错误提示 | string | - |
length | 密码最大长度 | number | string | 6 |
gutter | 输入框格子之间的间距,如 20px 2em ,默认单位为px | number | string | 0 |
mask | 是否隐藏密码内容 | boolean | true |
focused v2.1.8 | 是否已聚焦,聚焦时会显示光标 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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; } }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
columns | 对象数组,配置每一列显示的数据 | Column[] | [] |
title | 顶部栏标题 | string | - |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
value-key | 选项对象中,选项文字对应的键名 | string | text |
toolbar-position | 顶部栏位置,可选值为bottom | string | top |
loading | 是否显示加载状态 | boolean | false |
show-toolbar | 是否显示顶部栏 | boolean | false |
allow-html v2.1.8 | 是否允许选项内容中渲染 HTML | boolean | true |
default-index | 单列选择时,默认选中项的索引 | number | string | 0 |
item-height | 选项高度 | number | string | 44 |
visible-item-count | 可见的选项个数 | number | string | 5 |
swipe-duration v2.2.10 | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
当选择器有多列时,事件回调参数会返回数组
事件名 | 说明 | 回调参数 |
---|---|---|
confirm | 点击完成按钮时触发 | 单列:选中值,选中值对应的索引 多列:所有列选中值,所有列选中值对应的索引 |
cancel | 点击取消按钮时触发 | 单列:选中值,选中值对应的索引 多列:所有列选中值,所有列选中值对应的索引 |
change | 选项改变时触发 | 单列:Picker 实例,选中值,选中值对应的索引 多列:Picker 实例,所有列选中值,当前列对应的索引 |
名称 | 说明 |
---|---|
default | 自定义顶部栏内容 |
title | 自定义标题内容 |
columns-top | 自定义选项上方内容 |
columns-bottom | 自定义选项下方内容 |
当传入多列数据时,columns为一个对象数组,数组中的每一个对象配置每一列,每一列有以下key
键名 | 说明 | 类型 |
---|---|---|
values | 列中对应的备选值 | string[] |
defaultIndex | 初始选中项的索引,默认为 0 | number |
className | 为对应列添加额外的类名 | any |
children v2.4.5 | 级联选项 | Column |
通过 ref 可以获取到 Picker 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
getValues | 获取所有列选中的值 | - | values |
setValues | 设置所有列选中的值 | values | - |
getIndexes | 获取所有列选中值对应的索引 | - | indexes |
setIndexes | 设置所有列选中值对应的索引 | indexes | - |
getColumnValue | 获取对应列选中的值 | columnIndex | value |
setColumnValue | 设置对应列选中的值 | columnIndex, value | - |
getColumnIndex | 获取对应列选中项的索引 | columnIndex | optionIndex |
setColumnIndex | 设置对应列选中项的索引 | columnIndex, optionIndex | - |
getColumnValues | 获取对应列中所有选项 | columnIndex | values |
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 和 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标识符 | any | - |
shape | 形状,可选值为 square | string | round |
disabled | 是否为禁用状态 | boolean | false |
label-disabled | 是否禁用文本内容点击 | boolean | false |
label-position | 文本位置,可选值为 left | string | right |
icon-size | 图标大小,默认单位为 px | number | string | 20px |
checked-color | 选中状态颜色 | string | #1989fa |
参数 | 说明 | 类型 | 默认值 |
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 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击单选框时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | 当前选中项的 name |
名称 | 说明 | 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 />
<van-rate v-model="value" @change="onChange" />
export default { method: { onChange(value) { Toast('当前值:'+ value); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前分值 | number | - |
count | 图标总数 | number | string | 5 |
size | 图标大小,默认单位为px | number | string | 20px |
gutter | 图标间距,默认单位为px | number | string | 4px |
color | 选中时的颜色 | string | #ffd21e |
void-color | 未选中时的颜色 | string | #c8c9cc |
disabled-color | 禁用时的颜色 | string | #bdbdbd |
icon | 选中时的 图标名称 或图片链接 | string | star |
void-icon | 未选中时的 图标名称 或图片链接 | string | star-o |
allow-half | 是否允许半选 | boolean | false |
readonly | 是否为只读状态 | boolean | false |
disabled | 是否禁用评分 | boolean | false |
touchable v2.2.0 | 是否可以通过滑动手势选择评分 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 搜索框左侧文本 | string | - |
shape | 搜索框形状,可选值为 round | string | square |
background | 搜索框外部背景色 | string | #f2f2f2 |
maxlength | 输入的最大字符数 | number | string | - |
placeholder | 占位提示文字 | string | - |
clearable | 是否启用清除控件 | boolean | true |
autofocus | 是否自动聚焦,iOS 系统不支持该属性 | boolean | false |
show-action | 是否在搜索框右侧显示取消按钮 | boolean | false |
action-text v2.2.2 | 取消按钮文字 | boolean | 取消 |
disabled | 是否禁用输入框 | boolean | false |
readonly | 是否将输入框设为只读 | boolean | false |
error | 是否将输入内容标红 | boolean | false |
input-align | 输入框内容对齐方式,可选值为 center right | string | left |
left-icon | 输入框左侧 图标名称 或图片链接 | string | search |
right-icon | 输入框右侧 图标名称 或图片链接 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
search | 确定搜索时触发 | value: 输入框当前值 |
input | 输入框内容变化时触发 | value: 输入框当前值 |
focus | 输入框获得焦点时触发 | event: Event |
blur | 输入框失去焦点时触发 | event: Event |
clear | 点击清除按钮后触发 | event: Event |
cancel | 点击取消按钮时触发 | - |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前进度百分比 | number | 0 |
max | 最大值 | number | string | 100 |
min | 最小值 | number | string | 0 |
step | 步长 | number | string | 1 |
bar-height | 进度条高度,默认单位为px | number | string | 2px |
button-size v2.4.5 | 滑块按钮大小,默认单位为px | number | string | 24px |
active-color | 进度条激活态颜色 | string | #1989fa |
inactive-color | 进度条非激活态颜色 | string | #e5e5e5 |
disabled | 是否禁用滑块 | boolean | false |
vertical | 是否垂直展示 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
input | 进度变化时实时触发 | value: 当前进度 |
change | 进度变化且结束拖动后触发 | value: 当前进度 |
drag-start | 开始拖动时触发 | - |
drag-end | 结束拖动时触发 | - |
名称 | 说明 |
---|---|
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前输入值 | number | string | - |
min | 最小值 | number | string | 1 |
max | 最大值 | number | string | - |
default-value | 初始值,当 v-model 为空时生效 | number | string | 1 |
step | 步长,每次点击时改变的值 | number | string | 1 |
name v2.2.11 | 标识符,可以在change 事件回调参数中获取 | number | string | - |
input-width | 输入框宽度,默认单位为px | number | string | 32px |
button-size v2.0.5 | 按钮大小以及输入框高度,默认单位为px | number | string | 28px |
decimal-length v2.2.1 | 固定显示的小数位数 | number | string | - |
integer | 是否只允许输入整数 | boolean | false |
disabled | 是否禁用步进器 | boolean | false |
disable-plus v2.2.16 | 是否禁用增加按钮 | boolean | false |
disable-minus v2.2.16 | 是否禁用减少按钮 | boolean | false |
disable-input | 是否禁用输入框 | boolean | false |
async-change | 是否开启异步变更,开启后需要手动控制输入值 | boolean | false |
show-plus v2.1.2 | 是否显示增加按钮 | boolean | true |
show-minus v2.1.2 | 是否显示减少按钮 | boolean | true |
long-press v2.4.3 | 是否开启长按手势 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 开关选中状态 | any | false |
loading | 是否为加载状态 | boolean | false |
disabled | 是否为禁用状态 | boolean | false |
size v2.2.11 | 开关尺寸,默认单位为px | number | string | 30px |
active-color | 打开时的背景色 | string | #1989fa |
inactive-color | 关闭时的背景色 | string | white |
active-value | 打开时的值 | any | true |
inactive-value | 关闭时的值 | any | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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(); } }); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
accept | 允许上传的文件类型,详细说明 | string | image/* |
name v2.0.3 | 标识符,可以在回调函数的第二项参数中获取 | number | string | - |
preview-size | 预览图和上传区域的尺寸,默认单位为px | number | string | 80px |
preview-image | 是否在上传完成后展示预览图 | boolean | true |
preview-full-image v2.1.5 | 是否在点击预览图后展示全屏图片预览 | boolean | true |
multiple | 是否开启图片多选,部分安卓机型不支持 | boolean | false |
disabled | 是否禁用文件上传 | boolean | false |
deletable v2.2.12 | 是否展示删除按钮 | boolean | true |
capture | 图片选取模式,可选值为camera (直接调起摄像头) | string | - |
after-read | 文件读取完成后的回调函数 | Function | - |
before-read | 文件读取前的回调函数,返回false 可终止文件读取,支持返回 Promise | Function | - |
before-delete | 文件删除前的回调函数,返回false 可终止文件读取,支持返回 Promise | Function | - |
max-size | 文件大小限制,单位为byte | number | string | - |
max-count | 文件上传数量限制 | number | string | - |
result-type v2.2.7 | 文件读取结果类型,可选值为file text | string | dataUrl |
upload-text | 上传区域文字提示 | string | - |
image-fit v2.1.5 | 预览图裁剪模式,可选值见 Image 组件 | string | cover |
事件名 | 说明 | 回调参数 |
---|---|---|
oversize | 文件大小超过限制时触发 | 同after-read |
click-preview | 点击预览图时触发 | 同after-read |
close-preview | 关闭全屏图片预览时触发 | - |
delete | 删除文件预览时触发 | 同after-read |
名称 | 说明 |
---|---|
default | 自定义上传区域 |
before-read、after-read、before-delete 执行时会传递以下回调参数:
参数名 | 说明 | 类型 |
---|---|---|
file | 文件解析后的 file 对象 | object |
detail | 额外信息,包含 name 和 index 字段 | object |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
actions | 菜单选项 | Action[] | [] |
title | 顶部标题 | string | - |
cancel-text | 取消按钮文字 | string | - |
description v2.2.8 | 选项上方的描述信息 | string | - |
close-icon v2.2.13 | 关闭 图标名称 或图片链接 | string | cross |
duration v2.0.3 | 动画时长,单位秒 | number | string | 0.3 |
round v2.0.9 | 是否显示圆角 | boolean | true |
overlay | 是否显示遮罩层 | boolean | true |
lock-scroll | 是否锁定背景滚动 | boolean | true |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
close-on-click-action | 是否在点击选项后关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | true |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
actions属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:
键名 | 说明 | 类型 |
---|---|---|
name | 标题 | string |
subname | 二级标题 | string |
color | 选项文字颜色 | string |
className | 为对应列添加额外的 class | any |
loading | 是否为加载状态 | boolean |
disabled | 是否为禁用状态 | boolean |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 选中选项时触发,禁用或加载状态下不会触发 | item: 选项对应的对象, index: 选择对应的索引 |
cancel | 取消按钮点击时触发 | - |
click-overlay | 点击遮罩层时触发 | - |
open | 打开菜单时触发 | - |
opened | 打开菜单且动画结束后触发 | - |
close | 关闭菜单时触发 | - |
closed | 关闭菜单且动画结束后触发 | - |
在 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 }; }}
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Dialog | 展示弹窗 | options | Promise |
Dialog.alert | 展示消息提示弹窗 | options | Promise |
Dialog.confirm | 展示消息确认弹窗 | options | Promise |
Dialog.setDefaultOptions | 修改默认配置,对所有 Dialog 生效 | options | void |
Dialog.resetDefaultOptions | 重置默认配置,对所有 Dialog 生效 | - | void |
Dialog.close | 关闭弹窗 | - | void |
通过函数调用 Dialog 时,支持传入以下选项:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
width v2.2.7 | 弹窗宽度,默认单位为px | number | string | 320px |
message | 文本内容,支持通过
换行 | string | - |
messageAlign | 内容对齐方式,可选值为left right | string | center |
className | 自定义类名 | any | - |
showConfirmButton | 是否展示确认按钮 | boolean | true |
showCancelButton | 是否展示取消按钮 | boolean | false |
confirmButtonText | 确认按钮文案 | string | 确认 |
confirmButtonColor | 确认按钮颜色 | string | #1989fa |
cancelButtonText | 取消按钮文案 | string | 取消 |
cancelButtonColor | 取消按钮颜色 | string | black |
overlay | 是否展示遮罩层 | boolean | true |
overlayClass v2.2.7 | 自定义遮罩层类名 | string | - |
overlayStyle v2.2.7 | 自定义遮罩层样式 | object | - |
closeOnPopstate v2.0.5 | 是否在页面回退时自动关闭 | boolean | false |
closeOnClickOverlay | 是否在点击遮罩层后关闭弹窗 | boolean | false |
lockScroll | 是否锁定背景滚动 | boolean | true |
beforeClose | 关闭前的回调函数, 调用 done() 后关闭弹窗, 调用 done(false) 阻止弹窗关闭 | (action, done) => void | - |
transition v2.2.6 | 动画类名,等价于 transition 的name 属性 | string | - |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | body |
通过组件调用 Dialog 时,支持以下 Props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示弹窗 | boolean | - |
title | 标题 | string | - |
width v2.2.7 | 弹窗宽度,默认单位为px | number | string | 320px |
message | 文本内容,支持通过
换行 | string | - |
message-align | 内容对齐方式,可选值为left right | string | center |
show-confirm-button | 是否展示确认按钮 | boolean | true |
show-cancel-button | 是否展示取消按钮 | boolean | false |
confirm-button-text | 确认按钮文案 | string | 确认 |
confirm-button-color | 确认按钮颜色 | string | #1989fa |
cancel-button-text | 取消按钮文案 | string | 取消 |
cancel-button-color | 取消按钮颜色 | string | black |
overlay | 是否展示遮罩层 | boolean | true |
overlay-class v2.2.7 | 自定义遮罩层类名 | string | - |
overlay-style v2.2.7 | 自定义遮罩层样式 | object | - |
close-on-popstate v2.0.5 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭弹窗 | boolean | false |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
lock-scroll | 是否锁定背景滚动 | boolean | true |
before-close | 关闭前的回调函数, 调用 done() 后关闭弹窗, 调用 done(false) 阻止弹窗关闭 | (action, done) => void | - |
transition v2.2.6 | 动画类名,等价于 transtion 的name 属性 | string | - |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
通过组件调用 Dialog 时,支持以下事件:
事件 | 说明 | 回调参数 |
---|---|---|
confirm | 点击确认按钮时触发 | - |
cancel | 点击取消按钮时触发 | - |
open | 打开弹窗时触发 | - |
opened | 打开弹窗且动画结束后触发 | - |
close | 关闭弹窗时触发 | - |
closed | 关闭弹窗且动画结束后触发 | - |
通过组件调用 Dialog 时,支持以下插槽:
名称 | 说明 |
---|---|
default | 自定义内容 |
title | 自定义标题 |
app.json
或index.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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
active-color | 菜单标题和选项的选中态颜色 | string | #1989fa |
direction v2.0.1 | 菜单展开方向,可选值为up | string | down |
z-index | 菜单栏 z-index 层级 | number | string | 10 |
duration | 动画时长,单位秒 | number | string | 0.2 |
overlay | 是否显示遮罩层 | boolean | true |
close-on-click-overlay | 是否在点击遮罩层后关闭菜单 | boolean | true |
close-on-click-outside v2.0.7 | 是否在点击外部元素后关闭菜单 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中项对应的 value,可以通过v-model 双向绑定 | number | string | - |
title | 菜单项标题 | string | 当前选中项文字 |
options | 选项数组 | Option[] | [] |
disabled | 是否禁用菜单 | boolean | false |
title-class | 标题额外类名 | string | - |
get-container v2.2.4 | 指定挂载的节点,用法示例 | string | () => Element | - |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 点击选项导致 value 变化时触发 | value |
open | 打开菜单栏时触发 | - |
opened | 打开菜单栏且动画结束后触发 | - |
close | 关闭菜单栏时触发 | - |
opened | 关闭菜单栏且动画结束后触发 | - |
名称 | 说明 |
---|---|
default | 菜单内容 |
title | 自定义标题,不支持动态渲染 |
通过 ref 可以获取到 DropdownItem 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggle | 切换菜单展示状态,传true 为显示,false 为隐藏,不传参为取反 | show?: boolean | - |
键名 | 说明 | 类型 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
color | 颜色 | string | #c9c9c9 |
type | 类型,可选值为 spinner | string | circular |
size | 加载图标大小,默认单位为px | number | string | 30px |
text-size | 文字大小,默认单位为px | number | string | 14px |
vertical | 是否垂直排列图标和文字内容 | boolean | false |
名称 | 说明 |
---|---|
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('提示文案'); }}
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Notify | 展示提示 | options | message | notify 实例 |
Notify.clear | 关闭提示 | - | void |
Notify.setDefaultOptions | 修改默认配置,对所有 Notify 生效 | options | void |
Notify.resetDefaultOptions | 重置默认配置,对所有 Notify 生效 | - | void |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type v2.1.6 | 类型,可选值为 primary success warning | string | danger |
message | 展示文案,支持通过
换行 | string | - |
duration | 展示时长(ms),值为 0 时,notify 不会消失 | number | string | 3000 |
color | 字体颜色 | string | white |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
show | 是否展示遮罩层 | boolean | false |
z-index | z-index 层级 | number | string | 1 |
duration | 动画时长,单位秒 | number | string | 0.3 |
class-name | 自定义类名 | string | - |
custom-style v2.2.5 | 自定义样式 | object | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否处于加载中状态 | boolean | - |
pulling-text | 下拉过程提示文案 | string | 下拉即可刷新... |
loosing-text | 释放过程提示文案 | string | 释放即可刷新... |
loading-text | 加载过程提示文案 | string | 加载中... |
success-text | 刷新成功提示文案 | string | - |
success-duration | 刷新成功提示展示时长(ms) | number | string | 500 |
animation-duration | 动画时长 | number | string | 300 |
head-height v2.4.2 | 顶部内容高度 | number | string | 50 |
disabled | 是否禁用下拉刷新 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
refresh | 下拉刷新时触发 | - |
名称 | 说明 | 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; } } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name v2.0.4 | 标识符,可以在事件参数中获取到 | number | string | - |
left-width | 指定左侧滑动区域宽度,单位为px | number | string | auto |
right-width | 指定右侧滑动区域宽度,单位为px | number | string | auto |
before-close v2.3.0 | 关闭前的回调函数 | Function | - |
disabled | 是否禁用滑动 | boolean | false |
stop-propagation v2.1.0 | 是否阻止滑动事件冒泡 | boolean | false |
名称 | 说明 |
---|---|
default | 自定义显示内容 |
left | 左侧滑动内容 |
right | 右侧滑动内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | 关闭时的点击位置 (left right cell outside ) |
open | 打开时触发 | { position: 'left' | 'right' , name: string } |
close | 关闭时触发 | { position: string , name: string } |
beforeClose 的第一个参数为对象,对象中包含以下属性:
参数名 | 说明 | 类型 |
---|---|---|
name | 标识符 | string |
position | 关闭时的点击位置 (left right cell outside ) | string |
instance | SwipeCell 实例,用于调用实例方法 | 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');
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Toast | 展示提示 | options | message | toast 实例 |
Toast.loading | 展示加载提示 | options | message | toast 实例 |
Toast.success | 展示成功提示 | options | message | toast 实例 |
Toast.fail | 展示失败提示 | options | message | toast 实例 |
Toast.clear | 关闭提示 | clearAll: boolean | void |
Toast.allowMultiple | 允许同时存在多个 Toast | - | void |
Toast.setDefaultOptions | 修改默认配置,对所有 Toast 生效。 传入 type 可以修改指定类型的默认配置 | type | options | void |
Toast.resetDefaultOptions | 重置默认配置,对所有 Toast 生效。 传入 type 可以重置指定类型的默认配置 | type | void |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 提示类型,可选值为 loading success fail html | string | text |
position | 位置,可选值为 top bottom | string | middle |
message | 文本内容,支持通过
换行 | string | '' |
icon v2.0.1 | 自定义图标,支持传入 图标名称 或图片链接 | string | - |
iconPrefix v2.0.9 | 图标类名前缀 | string | van-icon |
overlay v2.2.13 | 是否显示背景遮罩层 | boolean | false |
forbidClick | 是否禁止背景点击 | boolean | false |
closeOnClick v2.1.5 | 是否在点击后关闭 | boolean | false |
closeOnClickOverlay v2.2.13 | 是否在点击遮罩层后关闭 | boolean | false |
loadingType | 加载图标类型, 可选值为 spinner | string | circular |
duration | 展示时长(ms),值为 0 时,toast 不会消失 | number | 2000 |
className | 自定义类名 | any | - |
onOpened | 完全展示后的回调函数 | Function | - |
onClose | 关闭时的回调函数 | Function | - |
transition v2.2.6 | 动画类名,等价于 transtion 的name 属性 | string | van-fade |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | body |
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="大小定制"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前进度 | number | - |
rate | 目标进度 | number | string | 100 |
size | 圆环直径,默认单位为 px | number | string | 100px |
color v2.1.4 | 进度条颜色,传入对象格式可以定义渐变色 | string | object | #1989fa |
layer-color | 轨道颜色 | string | white |
fill | 填充颜色 | string | none |
speed | 动画速度(单位为 rate/s) | number | string | 0 |
text | 文字 | string | - |
stroke-width | 进度条宽度 | number | string | 40 |
stroke-linecap v2.2.15 | 进度条端点的形状,可选值为sqaure butt | string | round |
clockwise | 是否顺时针增加 | boolean | true |
名称 | 说明 |
---|---|
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'] }; }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前展开面板的 name | 手风琴模式:number | string 非手风琴模式:(number | string)[] | - |
accordion | 是否开启手风琴模式 | boolean | false |
border | 是否显示外边框 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换面板时触发 | activeNames: 类型与 v-model 绑定的值一致 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 唯一标识符,默认为索引值 | number | string | index |
icon | 标题栏左侧 图标名称 或图片链接 | string | - |
size | 标题栏大小,可选值为 large | string | - |
title | 标题栏左侧内容 | number | string | - |
value | 标题栏右侧内容 | number | string | - |
label | 标题栏描述信息 | number | string | - |
border | 是否显示内边框 | boolean | true |
is-link | 是否展示标题栏右侧箭头并开启点击反馈 | boolean | true |
disabled | 是否禁用面板 | boolean | false |
title-class | 左侧标题额外类名 | string | - |
value-class | 右侧内容额外类名 | string | - |
label-class | 描述信息额外类名 | string | - |
名称 | 说明 |
---|---|
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('倒计时结束'); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
time | 倒计时时长,单位毫秒 | number | string | 0 |
format | 时间格式 | string | HH:mm:ss |
auto-start | 是否自动开始倒计时 | boolean | true |
millisecond | 是否开启毫秒级渲染 | boolean | false |
格式 | 说明 |
---|---|
DD | 天数 |
HH | 小时 |
mm | 分钟 |
ss | 秒数 |
S | 毫秒(1 位) |
SS | 毫秒(2 位) |
SSS | 毫秒(3 位) |
事件名 | 说明 | 回调参数 |
---|---|---|
finish | 倒计时结束时触发 | - |
change v2.4.4 | 倒计时变化时触发 | timeData |
名称 | 说明 | SlotProps |
---|---|---|
default | 自定义内容 | timeData |
名称 | 说明 | 类型 |
---|---|---|
days | 剩余天数 | number |
hours | 剩余小时 | number |
minutes | 剩余分钟 | number |
seconds | 剩余秒数 | number |
milliseconds | 剩余毫秒 | number |
通过 ref 可以获取到 CountDown 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
start | 开始倒计时 | - | - |
pause | 暂停倒计时 | - | - |
reset | 重设倒计时,若auto-start 为true ,重设后会自动开始倒计时 | - | - |
如果你遇到了在 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
dashed | 是否使用虚线 | boolean | false |
hairline | 是否使用 0.5px 线 | boolean | true |
content-position | 内容位置,可选值为left right | string | center |
名称 | 说明 |
---|---|
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; } }}
通过函数调用 ImagePreview 时,支持传入以下选项:
参数名 | 说明 | 类型 | 默认值 |
---|---|---|---|
images | 需要预览的图片 URL 数组 | string[] | [] |
startPosition | 图片预览起始位置索引 | number | string | 0 |
swipeDuration | 动画时长,单位为ms | number | string | 500 |
showIndex | 是否显示页码 | boolean | true |
showIndicators | 是否显示轮播指示器 | boolean | false |
loop | 是否开启循环播放 | boolean | true |
onClose | 关闭时的回调函数 | Function | - |
onChange v2.0.3 | 切换图片时的回调函数,回调参数为当前索引 | Function | - |
asyncClose | 是否开启异步关闭 | boolean | false |
closeOnPopstate | 是否在页面回退时自动关闭 | boolean | false |
className | 自定义类名 | any | - |
lazyLoad | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
maxZoom | 手势缩放时,最大缩放比例 | number | string | 3 |
minZoom | 手势缩放时,最小缩放比例 | number | string | 1/3 |
通过组件调用 ImagePreview 时,支持以下 Props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
images | 需要预览的图片 URL 数组 | string[] | [] |
start-position | 图片预览起始位置索引 | number | string | 0 |
swipe-duration | 动画时长,单位为 ms | number | string | 500 |
show-index | 是否显示页码 | boolean | true |
show-indicators | 是否显示轮播指示器 | boolean | false |
loop | 是否开启循环播放 | boolean | true |
async-close | 是否开启异步关闭 | boolean | false |
close-on-popstate | 是否在页面回退时自动关闭 | boolean | false |
class-name | 自定义类名 | any | - |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
max-zoom | 手势缩放时,最大缩放比例 | number | string | 3 |
min-zoom | 手势缩放时,最小缩放比例 | number | string | 1/3 |
通过组件调用 ImagePreview 时,支持以下事件:
事件 | 说明 | 回调参数 |
---|---|---|
close | 关闭时触发 | { index: 索引, url: 图片链接 } |
change | 切换当前图片时触发 | index, 当前图片的索引 |
通过组件调用 ImagePreview 时,支持以下插槽:
名称 | 说明 |
---|---|
index | 自定义页码内容 |
cover | 自定义覆盖在图片预览上方的内容 |
参数名 | 说明 | 类型 |
---|---|---|
url | 当前图片 URL | string |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
loading | 加载时的图片 | string | - |
error | 错误时的图片 | string | - |
preload | 预加载高度的比例 | string | - |
attempt | 尝试次数 | number | 3 |
listenEvents | 监听的事件 | string[] | scroll 等 |
adapter | 适配器 | object | - |
filter | 图片 URL 过滤 | object | - |
lazyComponent | 是否能懒加载模块 | boolean | false |
更多内容请参照: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(); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否处于加载状态,加载过程中不触发load 事件 | boolean | false |
finished | 是否已加载完成,加载完成后不再触发load 事件 | boolean | false |
error | 是否加载失败,加载失败后点击错误提示可以重新 触发 load 事件,必须使用sync 修饰符 | boolean | false |
offset | 滚动条与底部距离小于 offset 时触发load 事件 | number | string | 300 |
loading-text | 加载过程中的提示文案 | string | 加载中... |
finished-text | 加载完成后的提示文案 | string | - |
error-text | 加载失败后的提示文案 | string | - |
immediate-check | 是否在初始化时立即执行滚动位置检查 | boolean | true |
direction | 滚动触发加载的方向,可选值为up | string | down |
事件名 | 说明 | 回调参数 |
---|---|---|
load | 滚动条与底部距离小于 offset 时触发 | - |
通过 ref 可以获取到 List 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
check | 检查当前的滚动位置,若已滚动至底部,则会触发 load 事件 | - | - |
名称 | 说明 |
---|---|
default | 列表内容 |
loading | 自定义底部加载中提示 |
finished | 自定义加载完成后的提示文案 |
error | 自定义加载失败后的提示文案 |
List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List 会触发一次 load 事件。
List 初始化后会触发一次 load 事件,用于加载第一屏的数据,这个特性可以通过immediate-check属性关闭。
如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load 事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。
List有以下三种状态,理解这些状态有助于你正确地使用List组件:
在每次请求完毕后,需要手动将loading设置为false,表示加载结束
若 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-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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
mode | 通知栏模式,可选值为 closeable link | string | '' |
text | 通知文本内容 | string | '' |
color | 文本颜色 | string | #f60 |
background | 滚动条背景 | string | #fff7cc |
left-icon | 左侧 图标名称 或图片链接 | string | - |
delay | 动画延迟时间 (s) | number | string | 1 |
speed | 滚动速率 (px/s) | number | string | 50 |
scrollable | 是否在长度溢出时滚动播放 | boolean | true |
wrapable | 是否开启文本换行,只在禁用滚动时生效 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击通知栏时触发 | event: Event |
close | 关闭通知栏时触发 | event: Event |
名称 | 内容 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
desc | 描述 | string | - |
status | 状态 | string | - |
icon | 标题左侧 图标名称 或图片链接 | string | - |
名称 | 说明 |
---|---|
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)"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
percentage | 进度百分比 | number | string | 0 |
stroke-width v2.2.1 | 进度条粗细,默认单位为px | number | string | 4px |
color | 进度条颜色 | string | #1989fa |
track-color v2.2.9 | 轨道颜色 | string | #e5e5e5 |
pivot-text | 进度文字内容 | string | 百分比 |
pivot-color | 进度文字背景色 | string | 同进度条颜色 |
text-color | 进度文字颜色 | string | white |
inactive | 是否置灰 | boolean | false |
show-pivot | 是否显示进度文字 | boolean | true |
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; }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
row | 段落占位图行数 | number | string | 0 |
row-width | 段落占位图宽度,可传数组来设置每一行的宽度 | number | string | (number | string)[] | 100% |
title | 是否显示标题占位图 | boolean | false |
avatar | 是否显示头像占位图 | boolean | false |
loading | 是否显示骨架屏,传false 时会展示子组件内容 | boolean | true |
animate | 是否开启动画 | boolean | true |
title-width | 标题占位图宽度 | number | string | 40% |
avatar-size | 头像占位图大小 | number | string | 32px |
avatar-shape | 头像占位图形状,可选值为square | string | round |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
active | 当前步骤 | number | string | 0 |
direction | 显示方向,可选值为 vertical | string | horizontal |
active-color | 激活状态颜色 | string | #07c160 |
active-icon | 激活状态底部图标,可选值见 Icon 组件 | string | checked |
inactive-icon | 未激活状态底部图标,可选值见 Icon 组件 | string | - |
名称 | 说明 |
---|---|
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; }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
offset-top | 吸顶时与顶部的距离,单位px | number | string | 0 |
z-index | 吸顶时的 z-index | number | string | 99 |
container | 容器对应的 HTML 节点 | Element | - |
事件名 | 说明 | 回调参数 |
---|---|---|
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' ] } }}
<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; } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
autoplay | 自动轮播间隔,单位为 ms | number | string | - |
duration | 动画时长,单位为 ms | number | string | 500 |
initial-swipe | 初始位置索引值 | number | string | 0 |
width | 滑块宽度,单位为px | number | string | auto |
height | 滑块高度,单位为px | number | string | auto |
loop | 是否开启循环播放 | boolean | true |
show-indicators | 是否显示指示器 | boolean | true |
vertical | 是否为纵向滚动 | boolean | false |
touchable | 是否可以通过手势滑动 | boolean | true |
stop-propagation v2.2.13 | 是否阻止滑动事件冒泡 | boolean | true |
indicator-color | 指示器颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 每一页轮播结束后触发 | index, 当前页的索引 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
通过 ref 可以获取到 Swipe 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
prev v2.4.2 | 切换到上一轮播 | - | - |
next v2.4.2 | 切换到下一轮播 | - | - |
swipeTo | 切换到指定位置 | index: number, options: Options | void |
resize v2.2.14 | 外层元素大小变化后,可以调用此方法来触发重绘 | - | void |
名称 | 说明 | 类型 |
---|---|---|
immediate | 是否跳过动画 | boolean |
名称 | 说明 |
---|---|
default | 轮播内容 |
indicator | 自定义指示器 |
这种情况通常是由于项目中引入了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; } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为primary success danger warning | string | default |
size | 大小, 可选值为large medium | string | - |
color | 标签颜色 | string | - |
plain | 是否为空心样式 | boolean | false |
round | 是否为圆角样式 | boolean | false |
mark | 是否为标记样式 | boolean | false |
text-color | 文本颜色,优先级高于color 属性 | string | white |
closeable v2.2.9 | 是否为可关闭标签 | boolean | false |
名称 | 说明 |
---|---|
default | 标签显示内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
column-num v2.0.4 | 列数 | number | string | 4 |
icon-size v2.2.6 | 图标大小,默认单位为px | number | string | 28px |
gutter | 格子之间的间距,默认单位为px | number | string | 0 |
border | 是否显示边框 | boolean | true |
center | 是否将格子内容居中显示 | boolean | true |
square | 是否将格子固定为正方形 | boolean | false |
clickable | 是否开启格子点击反馈 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 文字 | string | - |
icon | 图标名称 或图片链接 | string | - |
dot v2.2.1 | 是否显示图标右上角小红点 | boolean | false |
info v2.2.1 | 图标右上角徽标的内容 | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击格子时触发 | event: Event |
名称 | 说明 |
---|---|
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] } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
index-list | 索引字符列表 | string[] | number[] | A-Z |
z-index | z-index 层级 | number | string | 1 |
sticky | 是否开启锚点自动吸顶 | boolean | true |
sticky-offset-top v2.0.7 | 锚点自动吸顶时与顶部的距离 | number | 0 |
highlight-color | 索引字符高亮颜色 | string | #07c160 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
index | 索引字符 | number | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 选中字符时触发 | index: 索引字符 |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | '' |
left-text | 左侧文案 | string | '' |
right-text | 右侧文案 | string | '' |
left-arrow | 是否显示左侧箭头 | boolean | false |
fixed | 是否固定在顶部 | boolean | false |
border | 是否显示下边框 | boolean | true |
z-index | 元素 z-index | number | string | 1 |
名称 | 说明 |
---|---|
title | 自定义标题 |
left | 自定义左侧区域内容 |
right | 自定义右侧区域内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
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/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前页码 | number | - |
mode | 显示模式,可选值为 simple | string | multi |
prev-text | 上一页按钮文字 | string | 上一页 |
next-text | 下一页按钮文字 | string | 下一页 |
page-count | 总页数 | number | string | 根据页数计算 |
total-items | 总记录数 | number | string | 0 |
items-per-page | 每页记录数 | number | string | 10 |
show-page-size | 显示的页码个数 | number | string | 5 |
force-ellipses | 是否显示省略号 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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 }); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model v2.0.4 | 当前导航项的索引 | number | string | 0 |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换导航项时触发 | index: 当前导航项的索引 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 内容 | string | '' |
dot v2.2.1 | 是否显示右上角小红点 | boolean | false |
info | 右上角徽标的内容 | number | string | - |
disabled v2.2.0 | 是否禁用该项 | boolean | false |
url | 点击后跳转的链接地址 | string | - |
to v2.0.4 | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace v2.0.4 | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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支持两种样式风格:line
和card
,默认为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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 绑定当前选中标签的标识符 | number | string | 0 |
type | 样式风格类型,可选值为card | string | line |
color | 标签主题色 | string | #ee0a24 |
background | 标签栏背景色 | string | white |
duration | 动画时间,单位秒 | number | string | 0.3 |
line-width | 底部条宽度,默认单位px | number | string | auto |
line-height | 底部条高度,默认单位px | number | string | 3px |
animated | 是否开启切换标签内容时的转场动画 | boolean | false |
border | 是否显示标签栏外边框,仅在type="line" 时有效 | boolean | true |
ellipsis | 是否省略过长的标题文字 | boolean | true |
sticky | 是否使用粘性定位布局 | boolean | false |
swipeable | 是否开启手势滑动切换 | boolean | false |
lazy-render | 是否开启延迟渲染(首次切换到标签时才触发内容渲染) | boolean | true |
scrollspy v2.3.0 | 是否开启滚动导航 | boolean | false |
offset-top | 粘性定位布局下与顶部的最小距离,单位px | number | string | 0 |
swipe-threshold | 滚动阈值,标签数量超过阈值时开始横向滚动 | number | string | 4 |
title-active-color | 标题选中态颜色 | string | - |
title-inactive-color | 标题默认态颜色 | string | - |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
disabled | 是否禁用标签 | boolean | false |
dot v2.3.0 | 是否在标题右上角显示小红点 | boolean | false |
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 | 是否在跳转时替换当前页面历史 | boolean | false |
title-style v2.2.14 | 自定义标题样式 | any | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击标签时触发 | name:标识符,title:标题 |
change | 当前激活的标签改变时触发 | name:标识符,title:标题 |
disabled | 点击被禁用的标签时触发 | name:标识符,title:标题 |
rendered v2.3.0 | 标签内容首次渲染时触发(仅在开启延迟渲染后触发) | name:标识符,title:标题 |
scroll | 滚动时触发,仅在 sticky 模式下生效 | { scrollTop: 距离顶部位置, isFixed: 是否吸顶 } |
通过 ref
可以获取到 Tabs
实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
resize | 外层元素大小变化后,可以调用此方法来触发重绘 | - | void |
名称 | 说明 |
---|---|
nav-left | 标题左侧内容 |
nav-right | 标题右侧内容 |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中标签的名称或索引值 | number | string | 0 |
fixed | 是否固定在底部 | boolean | true |
border | 是否显示外边框 | boolean | true |
z-index | 元素 z-index | number | string | 1 |
active-color | 选中标签的颜色 | string | #1989fa |
inactive-color | 未选中标签的颜色 | string | #7d7e80 |
route | 是否开启路由模式 | boolean | false |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换标签时触发 | active: 当前选中标签的名称或索引值 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标签名称,作为匹配的标识符 | number | string | 当前标签的索引值 |
icon | 图标名称 或图片链接 | string | - |
dot | 是否显示图标右上角小红点 | boolean | false |
info | 图标右上角徽标的内容 | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
名称 | 说明 | 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 } ] } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
items | 分类显示所需的数据 | Item[] | [] |
height | 高度,默认单位为px | number | string | 300 |
main-active-index | 左侧选中项的索引 | number | string | 0 |
active-id | 右侧选中项的 id,支持传入数组 | number | string | (number | string)[] | 0 |
max v2.2.0 | 右侧项最大选中个数 | number | string | Infinity |
事件名 | 说明 | 回调参数 |
---|---|---|
click-nav | 点击左侧导航时触发 | index:被点击的导航的索引 |
click-item | 点击右侧选择项时触发 | data: 该点击项的数据 |
名称 | 说明 |
---|---|
content | 自定义右侧区域内容 |
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 = []; } } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
area-list | 地区列表 | object | - |
area-columns-placeholder v2.2.5 | 地区选择列占位提示文字 | string[] | [] |
address-info | 收货人信息初始值 | AddressInfo | {} |
search-result | 详细地址搜索结果 | SearchResult[] | [] |
show-postal | 是否显示邮政编码 | boolean | false |
show-delete | 是否显示删除按钮 | boolean | false |
show-set-default | 是否显示默认地址栏 | boolean | false |
show-search-result | 是否显示搜索结果 | boolean | false |
save-button-text | 保存按钮文字 | string | 保存 |
delete-button-text | 删除按钮文字 | string | 删除 |
detail-rows | 详细地址输入框行数 | number | string | 1 |
detail-maxlength v2.0.4 | 详细地址最大长度 | number | string | 200 |
is-saving | 是否显示保存按钮加载动画 | boolean | false |
is-deleting | 是否显示删除按钮加载动画 | boolean | false |
tel-validator | 手机号格式校验函数 | string => boolean | - |
postal-validator v2.1.2 | 邮政编码格式校验函数 | string => boolean | - |
validator | 自定义校验函数 | (key, val) => string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
save | 点击保存按钮时触发 | content:表单内容 |
focus | 输入框聚焦时触发 | key: 聚焦的输入框对应的 key |
delete | 确认删除地址时触发 | content:表单内容 |
cancel-delete | 取消删除地址时触发 | content:表单内容 |
select-search | 选中搜索结果时触发 | value: 搜索结果 |
change-area | 修改收件地区时触发 | values: 地区信息 |
change-detail | 修改详细地址时触发 | value: 详细地址内容 |
change-default | 切换是否使用默认地址时触发 | value: 是否选中 |
名称 | 说明 |
---|---|
default | 在邮政编码下方插入内容 |
通过 ref 可以获取到 AddressEdit 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
setAddressDetail | 设置详细地址 | addressDetail: string | - |
注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取
key | 说明 | 类型 |
---|---|---|
id | 每条地址的唯一标识 | number | string |
name | 收货人姓名 | string |
tel | 收货人手机号 | string |
province | 省份 | string |
city | 城市 | string |
county | 区县 | string |
addressDetail | 详细地址 | string |
areaCode | 地区编码,通过省市区选择 获取(必填) | string |
postalCode | 邮政编码 | string |
isDefault | 是否为默认地址 | boolean |
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中地址的 id | string | - |
list | 地址列表 | Address[] | [] |
disabled-list | 不可配送地址列表 | Address[] | [] |
disabled-text | 不可配送提示文案 | string | - |
switchable | 是否允许切换地址 | boolean | true |
add-button-text | 底部按钮文字 | string | 新增地址 |
default-tag-text v2.3.0 | 默认地址标签文字 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
add | 点击新增按钮时触发 | - |
edit | 点击编辑按钮时触发 | item: 地址对象,index: 索引 |
select | 切换选中的地址时触发 | item: 地址对象,index: 索引 |
edit-disabled | 编辑不可配送的地址时触发 | item: 地址对象,index: 索引 |
select-disabled | 选中不可配送的地址时触发 | item: 地址对象,index: 索引 |
click-item | 点击任意地址时触发 | item: 地址对象,index: 索引 |
键名 | 说明 | 类型 |
---|---|---|
id | 每条地址的唯一标识 | number | string |
name | 收货人姓名 | string |
tel | 收货人手机号 | number | string |
address | 收货地址 | string |
isDefault | 是否为默认地址 | boolean |
名称 | 说明 |
---|---|
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="标题"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中的省市区code | string | - |
title | 顶部栏标题 | string | - |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
area-list | 省市区数据,格式见下方 | object | - |
columns-placeholder v2.2.5 | 列占位提示文字 | string[] | [] |
loading | 是否显示加载状态 | boolean | false |
item-height | 选项高度 | number | string | 44 |
columns-num | 显示列数,3-省市区,2-省市,1-省 | number | string | 3 |
visible-item-count | 可见的选项个数 | number | string | 5 |
swipe-duration v2.2.13 | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
is-oversea-code v2.1.4 | 根据code 校验海外地址,海外地址会划分至单独的分类 | () => boolean | - |
事件 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
thumb | 左侧图片 URL | string | - |
title | 标题 | string | - |
desc | 描述 | string | - |
tag | 图片角标 | string | - |
num | 商品数量 | number | string | - |
price | 商品价格 | number | string | - |
origin-price | 商品划线原价 | number | string | - |
centered | 内容是否垂直居中 | boolean | false |
currency | 货币符号 | string | ¥ |
thumb-link | 点击左侧图片后跳转的链接地址 | string | - |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
click-thumb | 点击自定义图片时触发 | event: Event |
名称 | 说明 |
---|---|
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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 add edit | string | add |
name | 联系人姓名 | string | - |
tel | 联系人手机号 | string | - |
add-text | 添加时的文案提示 | string | 添加订单联系人信息 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中联系人的 id | number | string | - |
list | 联系人列表 | Contact[] | [] |
add-text | 新建按钮文案 | string | 新建联系人 |
default-tag-text v2.3.0 | 默认联系人标签文案 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
add | 点击新增按钮时触发 | - |
edit | 点击编辑按钮时触发 | item: 当前联系人对象,index: 索引 |
select | 切换选中的联系人时触发 | item: 当前联系人对象,index: 索引 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
contact-info | 联系人信息 | object | [] |
is-edit | 是否为编辑联系人 | boolean | false |
is-saving | 是否显示保存按钮加载动画 | boolean | false |
is-deleting | 是否显示删除按钮加载动画 | boolean | false |
tel-validator | 手机号格式校验函数 | (tel: string) => boolean | - |
show-set-default v2.3.0 | 是否显示默认联系人栏 | boolean | false |
set-default-label v2.3.0 | 默认联系人栏文案 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
save | 点击保存按钮时触发 | content:表单内容 |
delete | 点击删除按钮时触发 | content:表单内容 |
键名 | 说明 | 类型 |
---|---|---|
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 单元格标题 | string | 优惠券 |
chosen-coupon | 当前选中优惠券的索引 | number | -1 |
coupons | 可用优惠券列表 | Coupon[] | [] |
editable | 能否切换优惠券 | boolean | true |
border | 是否显示内边框 | boolean | true |
currency | 货币符号 | string | ¥ |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
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 | 是否显示兑换按钮加载动画 | boolean | false |
exchange-button-disabled | 是否禁用兑换按钮 | boolean | false |
exchange-min-length | 兑换码最小长度 | number | 1 |
displayed-coupon-index | 滚动至特定优惠券位置 | number | - |
show-close-button | 是否显示列表底部按钮 | boolean | true |
close-button-text | 列表底部按钮文字 | string | 不使用优惠 |
input-placeholder | 输入框文字提示 | string | 请输入优惠码 |
show-exchange-bar | 是否展示兑换栏 | boolean | true |
currency | 货币符号 | string | ¥ |
empty-image v2.1.0 | 列表为空时的占位图 | string | https://img.yzcdn.cn/vant/coupon-empty.png |
show-count v2.3.0 | 是否展示可用 / 不可用数量 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 优惠券切换回调 | index, 选中优惠券的索引 |
exchange | 兑换优惠券回调 | code, 兑换码 |
键名 | 说明 | 类型 |
---|---|---|
id | 优惠券 id | string |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
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 | 是否在跳转时替换当前页面历史 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 按钮文字 | string | - |
type | 按钮类型,可选值为 primary info warning danger | string | default |
color v2.1.8 | 按钮颜色,支持传入linear-gradient 渐变色 | string | - |
icon v2.4.4 | 左侧 图标名称 或图片链接 | string | - |
disabled | 是否禁用按钮 | boolean | false |
loading | 是否显示为加载状态 | boolean | false |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
名称 | 说明 |
---|---|
default | 文本内容 |
icon | 自定义图标 |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
price | 价格(单位分) | number | - |
label | 价格左侧文案 | string | 合计: |
suffix-label | 价格右侧文案 | string | - |
text-align v2.3.0 | 价格文案对齐方向,可选值为 left | string | right |
button-text | 按钮文字 | string | - |
button-type | 按钮类型 | string | danger |
tip | 提示文案 | string | - |
tip-icon | 左侧 图标名称 或图片链接 | string | - |
currency | 货币符号 | string | ¥ |
decimal-length | 价格小数点后位数 | number | string | 2 |
disabled | 是否禁用按钮 | boolean | false |
loading | 是否显示加载中的按钮 | boolean | false |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
submit | 按钮点击事件回调 | - |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示sku | boolean | false |
sku | 商品sku数据 | object | - |
goods | 商品信息 | object | - |
goods-id | 商品 id | number | string | - |
price-tag | 显示在价格后面的标签 | string | - |
hide-stock | 是否显示商品剩余库存 | boolean | false |
hide-quota-text | 是否显示限购提示 | boolean | false |
hide-selected-text | 是否隐藏已选提示 | boolean | false |
stock-threshold | 库存阈值。低于这个值会把库存数高亮显示 | boolean | 50 |
show-add-cart-btn | 是否显示加入购物车按钮 | boolean | true |
buy-text | 购买按钮文字 | string | 立即购买 |
add-cart-text | 加入购物车按钮文字 | string | 加入购物车 |
quota | 限购数,0 表示不限购 | number | 0 |
quota-used | 已经购买过的数量 | number | 0 |
reset-stepper-on-hide | 隐藏时重置选择的商品数量 | boolean | false |
reset-selected-sku-on-hide | 隐藏时重置已选择的 sku | boolean | false |
disable-stepper-input | 是否禁用步进器输入 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | false |
stepper-title | 数量选择组件左侧文案 | string | 购买数量 |
custom-stepper-config | 步进器相关自定义配置 | object | {} |
message-config | 留言相关配置 | object | {} |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
initial-sku | 默认选中的 sku,具体参考高级用法 | object | {} |
show-soldout-sku | 是否展示售罄的 sku,默认展示并置灰 | boolean | true |
safe-area-inset-bottom v2.2.1 | 是否开启 底部安全区适配 | boolean | false |
start-sale-num v2.3.0 | 起售数量 | number | 1 |
properties v2.4.2 | 商品属性 | array | - |
事件名 | 说明 | 回调参数 |
---|---|---|
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 | 重置选中规格到初始状态 | - | - |
Sku 组件默认划分好了若干区块,这些区块都定义成了插槽,可以按需进行替换。区块顺序见下表:
名称 | 说明 |
---|---|
sku-header | 商品信息展示区,包含商品图片、名称、价格等信息 |
sku-header-price | 自定义 sku 头部价格展示 |
sku-header-origin-price | 自定义 sku 头部原价展示 |
sku-header-extra | 额外 sku 头部区域 |
sku-body-top | sku 展示区上方的内容,无默认展示内容,按需使用 |
sku-group | 商品 sku 展示区 |
extra-sku-group | 额外商品 sku 展示区,一般用不到 |
sku-stepper | 商品数量选择区 |
sku-messages | 商品留言区 |
sku-actions | 操作按钮区 |
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 // 是否隐藏剩余库存}
[ // 商品属性 { k_id: 123, // 属性id k: '加料', // 属性名 is_multiple: true, // 是否可多选 v: [ { id: 1222, // 属性值id name: '珍珠', // 属性值名 price: 1, // 属性值加价 }, { id: 1223, name: '椰果', price: 1, } ], } ]
{ // 键:skuKeyStr(sku 组合列表中当前类目对应的 key 值) // 值:skuValueId(规格值 id) s1: '30349', s2: '1193', // 初始选中数量 selectedNum: 3, // 初始选中的商品属性 // 键:属性id // 值:属性值id列表 selectedProp: { 123: [1222] }}
goods: { // 商品标题 title: '测试商品', // 默认商品 sku 缩略图 picture: 'https://img.yzcdn.cn/1.jpg'}
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: { // 图片上传回调,需要返回一个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: { // 商品 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 开关状态 | any | false |
title | 左侧标题 | string | '' |
border | 是否展示单元格内边框 | boolean | true |
cell-size | 单元格大小,可选值为 large | string | - |
loading | 是否为加载状态 | boolean | false |
disabled | 是否为禁用状态 | boolean | false |
size | 开关尺寸 | number | string | 24px |
active-color | 开关时的背景色 | string | #1989fa |
inactive-color | 开关时的背景色 | string | white |
active-value | 打开时的值 | any | true |
inactive-value | 关闭时的值 | any | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 开关状态切换回调 | checked: 是否选中开关 |
请参考 快速上手 章节
修改代码请阅读我们的 开发指南
使用过程中发现任何问题都可以提 Issue 给我们,当然,我们也非常欢迎你给我们发 PR
现代浏览器以及 Android 4.0+, iOS 8.0+
有赞前端团队是由一群年轻、皮实、对技术饱含热情的小伙伴组成的,目前共有 100 多名前端工程师,分布在业务中台、电商、零售、美业、资产、赋能等业务线。
我们热爱分享和开源,崇尚用工程师的方式解决问题,因此造了很多工具来解决我们遇到的问题,目前我们维护的开源产品有:
我们正在寻找更多优秀的小伙伴,一起拓展前端技术的边界,期待你的加入!
项目 | 描述 |
---|---|
vant-demo | Vant 官方示例合集 |
vant-weapp | 微信小程序组件库 |
vant-cli | 开箱即用的组件库搭建工具 |
vant-icons | Vant 图标库 |
vant-touch-emulator | 在桌面端使用 Vant 的辅助库 |
本项目基于 MIT 协议,请自由地享受和参与开源
在新项目中使用 Vant 时,推荐使用 Vue 官方提供的脚手架 Vue Cli 创建项目
# 安装 Vue Clinpm install -g @vue/cli# 创建一个项目vue create hello-world# 创建完成后,可以通过命令打开图形化界面,如下图所示vue ui
在图形化界面中,点击依赖 -> 安装依赖,然后将 vant 添加到依赖中即可。
在现有项目中使用 Vant 时,可以通过npm或yarn安装
# 通过 npm 安装npm i vant -S# 通过 yarn 安装yarn add vant
我们提供了一个基于 Vue Cli 的示例工程,示例工程会帮助你了解如下内容:
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);
配置按需引入后,将不允许直接导入所有组件
使用 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>
Vant 中的样式默认使用px作为单位,如果需要使用rem单位,推荐使用以下两个工具:
下面提供了一份基本的 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 语义化版本规范。
发布节奏
2020-02-01
Bug Fixes
2020-02-01
Feature
Style
Bug Fixes
2020-01-24
Feature
Bug Fixes
2020-01-19
Feature
Improvement
Bug Fixes
Types
2020-01-14
Feature
Improvement
Bug Fixes
2020-01-02
Feature
Bug Fixes
2020-01-01
New Component
Feature
Compatibility
在之前的版本中,有较多同学反馈在 iOS 10 ~ 11 上会偶现组件无法操作的情况,该问题的原因是 Vue 2.6.x 版本在绑定事件时存在事件无法冒泡的兼容性问题。相关 issue
从 2.4 版本开始,我们通过手动绑定事件的方式来规避这个问题,涉及以下组件:
Bug Fixes
Types
2019-12-21
Bug Fixes
2019-12-20
Bug Fixes
2019-12-20
Bug Fixes
2019-12-20
Style
在 2.3.0 版本中,我们对业务组件的样式进行了全新升级,涉及以下组件:
Features
Bug Fixes
2019-12-03
Features
2019-11-28
Bug Fixes
2019-11-22
Features
Bug Fixes
2019-11-14
Features
Bug Fixes
2019-11-07
Features
Bug Fixes
2019-11-04
Features
Bug Fixes
2019-10-27
Features
Bug Fixes
2019-10-20
Features
Bug Fixes
2019-10-17
Features
Bug Fixes
2019-10-11
Features
Bug Fixes
2019-10-08
Features
Bug Fixes
2019-09-28
Features
Bug Fixes
2019-09-28 ????????
Tips
2019-09-24
Features
2019-09-19
Features
Bug Fixes
2019-09-12
Features
Bug Fixes
2019-09-06
Features
Bug Fixes
2019-08-29
Features
Bug Fixes
2019-08-26
Bug Fixes
2019-08-26
Features
Bug Fixes
2019-08-23
Features
Bug Fixes
2019-08-21
Features
Bug Fixes
2019-08-15
Features
Bug Fixes
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 之前,请先花几分钟时间阅读以下文字。
按照下面的步骤操作,即可在本地开发 Vant 组件
# 克隆仓库git clone git@github.com:youzan/vant.git# 安装依赖cd vant && npm run bootstrap# 进入开发模式,浏览器访问 http://localhost:8080npm 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 # 中文文档
提 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 开发时,请遵守约定的单文件组件风格指南,指南内容节选自 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 的时候,其命名应该始终使用 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 一行,闭合标签单起一行。
<!-- 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 应该有统一的顺序,依次为指令、属性和事件。
<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 组件的国际化需求,请自行配置国际化文案。
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 primary info warning danger | string | default |
size | 尺寸,可选值为 large small mini | string | normal |
text | 按钮文字 | string | - |
color v2.1.8 | 按钮颜色,支持传入linear-gradient 渐变色 | string | - |
icon | 左侧 图标名称 或图片链接 | string | - |
tag | HTML 标签 | string | button |
native-type | 原生 button 标签 type 属性 | string | - |
block | 是否为块级元素 | boolean | false |
plain | 是否为朴素按钮 | boolean | false |
square | 是否为方形按钮 | boolean | false |
round | 是否为圆形按钮 | boolean | false |
disabled | 是否禁用按钮 | boolean | false |
hairline | 是否使用 0.5px 边框 | boolean | false |
loading | 是否显示为加载状态 | boolean | false |
loading-text | 加载状态提示文字 | string | - |
loading-type | 加载图标类型,可选值为spinner | string | circular |
loading-size | 加载图标大小 | string | 20px |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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时,内容会靠左对齐
<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="描述信息" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 分组标题 | string | - |
border | 是否显示外边框 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
icon | 左侧 图标名称 或图片链接 | string | - |
title | 左侧标题 | number | string | - |
value | 右侧内容 | number | string | - |
label | 标题下方的描述信息 | string | - |
size | 单元格大小,可选值为 large | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
border | 是否显示内边框 | boolean | true |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
clickable | 是否开启点击反馈 | boolean | false |
is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false |
required | 是否显示表单必填星号 | boolean | false |
center | 是否使内容垂直居中 | boolean | false |
arrow-direction | 箭头方向,可选值为 left up down | string | right |
title-style | 左侧标题额外样式 | any | - |
title-class | 左侧标题额外类名 | any | - |
value-class | 右侧内容额外类名 | any | - |
label-class | 描述信息额外类名 | any | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击单元格时触发 | event: Event |
名称 | 说明 |
---|---|
default | 默认插槽 |
title | 自定义分组标题 |
名称 | 说明 |
---|---|
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" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 图标名称或图片链接 | string | - |
dot v2.2.1 | 是否显示图标右上角小红点 | boolean | false |
info | 图标右上角徽标的内容 | number | string | - |
color | 图标颜色 | string | inherit |
size | 图标大小,如 20px 2em ,默认单位为px | number | string | inherit |
class-prefix | 类名前缀 | string | van-icon |
tag | HTML 标签 | string | i |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
src | 图片链接 | string | - |
fit | 图片填充模式 | string | fill |
alt | 替代文本 | string | - |
width | 宽度,默认单位为px | number | string | - |
height | 高度,默认单位为px | number | string | - |
radius v2.1.6 | 圆角大小,默认单位为px | number | string | 0 |
round | 是否显示为圆形 | boolean | false |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
show-error v2.0.9 | 是否展示图片加载失败提示 | boolean | true |
show-loading v2.0.9 | 是否展示图片加载中提示 | boolean | true |
error-icon v2.4.2 | 失败时提示的 图标名称 或图片链接 | string | warning-o |
loading-icon v2.4.2 | 加载时提示的 图标名称 或图片链接 | string | photo-o |
名称 | 含义 |
---|---|
contain | 保持宽高缩放图片,使图片的长边能完全显示出来 |
cover | 保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边 |
fill | 拉伸图片,使图片填满元素 |
none | 保持图片原有尺寸 |
scale-down | 取none 或contain 中较小的一个 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击图片时触发 | event: Event |
load | 图片加载完毕时触发 | - |
error | 图片加载失败时触发 | - |
名称 | 说明 |
---|---|
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>
将 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 布局方式,可选值为flex | string | - |
gutter | 列元素之间的间距(单位为px) | number | string | - |
tag | 自定义元素标签 | string | div |
justify | Flex 主轴对齐方式,可选值为 end center space-around space-between | string | start |
align | Flex 交叉轴对齐方式,可选值为 center bottom | string | top |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
span | 列元素宽度 | number | string | - |
offset | 列元素偏移距离 | number | string | - |
tag | 自定义元素标签 | string | div |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
运行效果:
弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示
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 属性的组件不能为根节点
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前组件是否显示 | boolean | false |
overlay | 是否显示遮罩层 | boolean | true |
position | 弹出位置,可选值为 top bottom right left | string | center |
overlay-class | 自定义遮罩层类名 | string | - |
overlay-style | 自定义遮罩层样式 | object | - |
duration | 动画时长,单位秒 | number | string | 0.3 |
round v2.0.7 | 是否显示圆角 | boolean | false |
lock-scroll | 是否锁定背景滚动 | boolean | true |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
close-on-popstate v2.2.10 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
closeable v2.2.0 | 是否显示关闭图标 | boolean | false |
close-icon v2.2.0 | 关闭图标名称或图片链接 | string | cross |
close-icon-position v2.2.2 | 关闭图标位置,可选值为top-left bottom-left bottom-right | string | top-right |
transition | 动画类名,等价于 transtion 的name 属性 | string | - |
get-container | 指定挂载的节点 | string | () => Element | - |
safe-area-inset-bottom v2.2.1 | 是否开启 底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
为元素添加 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' }"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示日历弹窗 | boolean | false |
type | 选择类型,single 表示选择单个日期,range 表示选择日期区间 | string | single |
title | 日历标题 | string | 日期选择 |
color | 颜色,对底部按钮和选中日期生效 | string | #ee0a24 |
min-date | 最小日期 | Date | 当前日期 |
max-date | 最大日期 | Date | 当前日期的六个月后 |
default-date | 默认选中的日期 | Date | Date[] | 今天 |
row-height | 日期行高 | number | string | 64 |
formatter | 日期格式化函数 | (day: Day) => Day | - |
position | 弹出位置,可选值为 top right left | string | bottom |
poppable | 是否以弹层的形式展示日历 | boolean | true |
round | 是否显示圆角弹窗 | boolean | true |
show-mark | 是否显示月份背景水印 | boolean | true |
show-confirm | 是否展示确认按钮 | boolean | true |
close-on-popstate v2.4.4 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | true |
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 对象,通过formatter属性可以自定义 Day 对象的内容
键名 | 说明 | 类型 |
---|---|---|
date | 日期对应的 Date 对象 | Date |
type | 日期类型,可选值为selected 、start 、middle 、end 、disabled | string |
text | 中间显示的文字 | string |
topInfo | 上方的提示信息 | string |
bottomInfo | 下方的提示信息 | string |
className | 额外类名 | string |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 点击任意日期时触发 | value: Date | Date[] |
confirm | 日期选择完成后触发,若show-confirm 为true ,则点击确认按钮后触发 | value: Date | Date[] |
名称 | 说明 |
---|---|
title | 自定义标题 |
footer | 自定义底部区域内容 |
通过 ref 可以获取到 Calendar 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
reset | 重置选中的日期到默认值 | - | - |
如果你遇到了在 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(); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标识符 | any | - |
shape | 形状,可选值为 square | string | round |
v-model | 是否为选中状态 | boolean | false |
disabled | 是否禁用复选框 | boolean | false |
label-disabled | 是否禁用复选框文本点击 | boolean | false |
label-position | 文本位置,可选值为 left | string | right |
icon-size | 图标大小,默认单位为px | number | string | 20px |
checked-color | 选中状态颜色 | string | #1989fa |
bind-group v2.2.4 | 是否与复选框组绑定 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 所有选中项的标识符 | any[] | - |
disabled | 是否禁用所有复选框 | boolean | false |
max | 最大可选数,0 为无限制 | number | string | 0 |
icon-size v2.2.3 | 所有复选框的图标大小,默认单位为px | number | string | 20px |
checked-color v2.2.3 | 所有复选框的选中状态颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | 当前组件的值 |
click | 点击复选框时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | 当前组件的值 |
名称 | 说明 | SlotProps |
---|---|---|
default | 自定义文本 | - |
icon | 自定义图标 | checked: 是否为选中状态 |
通过 ref 可以获取到 CheckboxGroup 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggleAll | 切换所有复选框,传true 为选中,false 为取消选中,不传参为取反 | checked?: boolean | - |
通过 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; } }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 date time year-month | string | datetime |
title | 顶部栏标题 | string | '' |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
show-toolbar | 是否显示顶部栏 | boolean | true |
loading | 是否显示加载状态 | boolean | false |
filter | 选项过滤函数 | (type, vals) => vals | - |
formatter | 选项格式化函数 | (type, val) => val | - |
item-height | 选项高度 | number | string | 44 |
visible-item-count | 可见的选项个数 | number | string | 5 |
swipe-duration v2.2.13 | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
当时间选择器类型为 date 或 datetime 时,支持以下 props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
min-date | 可选的最小时间,精确到分钟 | Date | 十年前 |
max-date | 可选的最大时间,精确到分钟 | Date | 十年后 |
当时间选择器类型为 time 时,支持以下 props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
min-hour | 可选的最小小时 | number | string | 0 |
max-hour | 可选的最大小时 | number | string | 23 |
min-minute | 可选的最小分钟 | number | string | 0 |
max-minute | 可选的最大分钟 | number | string | 59 |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当值变化时触发的事件 | picker: Picker 实例 |
confirm | 点击完成按钮时触发的事件 | value: 当前选中的时间 |
cancel | 点击取消按钮时触发的事件 | - |
通过 ref 可以获取到 DatetimePicker 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
getPicker v2.4.0 | 获取 Picker 实例,用于调用 Picker 的实例方法 | - | - |
请注意不要在模板中直接使用类似min-date="new Date()"的写法,这样会导致每次渲染组件时传入一个新的 Date 对象,而传入新的数据会触发下一次渲染,从而陷入死循环。
正确的做法是将min-date作为一个数据定义在data函数中。
如果你遇到了在 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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 输入框左侧文本 | string | - |
value | 当前输入的值 | number | string | - |
type | 输入框类型, 可选值为 tel digit number textarea password 等 | string | text |
size | 大小,可选值为 large | string | - |
maxlength | 输入的最大字符数 | number | string | - |
placeholder | 占位提示文字 | string | - |
border | 是否显示内边框 | boolean | true |
disabled | 是否禁用输入框 | boolean | false |
readonly | 是否只读 | boolean | false |
required | 是否显示表单必填星号 | boolean | false |
clearable | 是否启用清除控件 | boolean | false |
clickable | 是否开启点击反馈 | boolean | false |
is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false |
autofocus | 是否自动聚焦,iOS 系统不支持该属性 | boolean | false |
show-word-limit v2.2.8 | 是否显示字数统计,需要设置maxlength 属性 | boolean | false |
error | 是否将输入内容标红 | boolean | false |
formatter v2.4.2 | 输入内容格式化函数 | Function | - |
arrow-direction v2.0.4 | 箭头方向,可选值为 left up down | string | right |
error-message | 底部错误提示文案,为空时不展示 | string | '' |
label-class | 左侧文本额外类名 | any | - |
label-width | 左侧文本宽度,默认单位为px | number | string | 90px |
label-align | 左侧文本对齐方式,可选值为 center right | string | left |
input-align | 输入框内容对齐方式,可选值为 center right | string | left |
error-message-align | 错误提示文案对齐方式,可选值为 center right | string | left |
autosize | 是否自适应内容高度,只对 textarea 有效, 可传入对象,如 { maxHeight: 100, minHeight: 50 }, 单位为 px | boolean | object | false |
left-icon | 左侧 图标名称 或图片链接 | string | - |
right-icon | 右侧 图标名称 或图片链接 | string | - |
除下列事件外,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 | 取消输入框焦点 | - | - |
名称 | 说明 |
---|---|
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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model v2.0.2 | 当前输入值 | string | - |
show | 是否显示键盘 | boolean | - |
theme | 样式风格,可选值为 default custom | string | default |
title | 键盘标题 | string | - |
maxlength v2.0.2 | 输入值最大长度 | number | string | - |
transition | 是否开启过场动画 | boolean | true |
z-index | 键盘 z-index | number | string | 100 |
extra-key | 左下角按键内容 | string | '' |
close-button-text | 关闭按钮文字,空则不展示 | string | - |
delete-button-text | 删除按钮文字 | string | 删除 |
show-delete-key | 是否展示删除按钮 | boolean | true |
hide-on-click-outside | 点击外部时是否收起键盘 | boolean | true |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
input | 点击按键时触发 | key: 按键内容 |
delete | 点击删除键时触发 | - |
close | 点击关闭按钮时触发 | - |
blur | 点击关闭按钮或非键盘区域时触发 | - |
show | 键盘完全弹出时触发 | - |
hide | 键盘完全收起时触发 | - |
名称 | 说明 |
---|---|
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 密码值 | string | '' |
info | 输入框下方文字提示 | string | - |
error-info | 输入框下方错误提示 | string | - |
length | 密码最大长度 | number | string | 6 |
gutter | 输入框格子之间的间距,如 20px 2em ,默认单位为px | number | string | 0 |
mask | 是否隐藏密码内容 | boolean | true |
focused v2.1.8 | 是否已聚焦,聚焦时会显示光标 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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; } }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
columns | 对象数组,配置每一列显示的数据 | Column[] | [] |
title | 顶部栏标题 | string | - |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
value-key | 选项对象中,选项文字对应的键名 | string | text |
toolbar-position | 顶部栏位置,可选值为bottom | string | top |
loading | 是否显示加载状态 | boolean | false |
show-toolbar | 是否显示顶部栏 | boolean | false |
allow-html v2.1.8 | 是否允许选项内容中渲染 HTML | boolean | true |
default-index | 单列选择时,默认选中项的索引 | number | string | 0 |
item-height | 选项高度 | number | string | 44 |
visible-item-count | 可见的选项个数 | number | string | 5 |
swipe-duration v2.2.10 | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
当选择器有多列时,事件回调参数会返回数组
事件名 | 说明 | 回调参数 |
---|---|---|
confirm | 点击完成按钮时触发 | 单列:选中值,选中值对应的索引 多列:所有列选中值,所有列选中值对应的索引 |
cancel | 点击取消按钮时触发 | 单列:选中值,选中值对应的索引 多列:所有列选中值,所有列选中值对应的索引 |
change | 选项改变时触发 | 单列:Picker 实例,选中值,选中值对应的索引 多列:Picker 实例,所有列选中值,当前列对应的索引 |
名称 | 说明 |
---|---|
default | 自定义顶部栏内容 |
title | 自定义标题内容 |
columns-top | 自定义选项上方内容 |
columns-bottom | 自定义选项下方内容 |
当传入多列数据时,columns为一个对象数组,数组中的每一个对象配置每一列,每一列有以下key
键名 | 说明 | 类型 |
---|---|---|
values | 列中对应的备选值 | string[] |
defaultIndex | 初始选中项的索引,默认为 0 | number |
className | 为对应列添加额外的类名 | any |
children v2.4.5 | 级联选项 | Column |
通过 ref 可以获取到 Picker 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
getValues | 获取所有列选中的值 | - | values |
setValues | 设置所有列选中的值 | values | - |
getIndexes | 获取所有列选中值对应的索引 | - | indexes |
setIndexes | 设置所有列选中值对应的索引 | indexes | - |
getColumnValue | 获取对应列选中的值 | columnIndex | value |
setColumnValue | 设置对应列选中的值 | columnIndex, value | - |
getColumnIndex | 获取对应列选中项的索引 | columnIndex | optionIndex |
setColumnIndex | 设置对应列选中项的索引 | columnIndex, optionIndex | - |
getColumnValues | 获取对应列中所有选项 | columnIndex | values |
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 和 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标识符 | any | - |
shape | 形状,可选值为 square | string | round |
disabled | 是否为禁用状态 | boolean | false |
label-disabled | 是否禁用文本内容点击 | boolean | false |
label-position | 文本位置,可选值为 left | string | right |
icon-size | 图标大小,默认单位为 px | number | string | 20px |
checked-color | 选中状态颜色 | string | #1989fa |
参数 | 说明 | 类型 | 默认值 |
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 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击单选框时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | 当前选中项的 name |
名称 | 说明 | 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 />
<van-rate v-model="value" @change="onChange" />
export default { method: { onChange(value) { Toast('当前值:'+ value); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前分值 | number | - |
count | 图标总数 | number | string | 5 |
size | 图标大小,默认单位为px | number | string | 20px |
gutter | 图标间距,默认单位为px | number | string | 4px |
color | 选中时的颜色 | string | #ffd21e |
void-color | 未选中时的颜色 | string | #c8c9cc |
disabled-color | 禁用时的颜色 | string | #bdbdbd |
icon | 选中时的 图标名称 或图片链接 | string | star |
void-icon | 未选中时的 图标名称 或图片链接 | string | star-o |
allow-half | 是否允许半选 | boolean | false |
readonly | 是否为只读状态 | boolean | false |
disabled | 是否禁用评分 | boolean | false |
touchable v2.2.0 | 是否可以通过滑动手势选择评分 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 搜索框左侧文本 | string | - |
shape | 搜索框形状,可选值为 round | string | square |
background | 搜索框外部背景色 | string | #f2f2f2 |
maxlength | 输入的最大字符数 | number | string | - |
placeholder | 占位提示文字 | string | - |
clearable | 是否启用清除控件 | boolean | true |
autofocus | 是否自动聚焦,iOS 系统不支持该属性 | boolean | false |
show-action | 是否在搜索框右侧显示取消按钮 | boolean | false |
action-text v2.2.2 | 取消按钮文字 | boolean | 取消 |
disabled | 是否禁用输入框 | boolean | false |
readonly | 是否将输入框设为只读 | boolean | false |
error | 是否将输入内容标红 | boolean | false |
input-align | 输入框内容对齐方式,可选值为 center right | string | left |
left-icon | 输入框左侧 图标名称 或图片链接 | string | search |
right-icon | 输入框右侧 图标名称 或图片链接 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
search | 确定搜索时触发 | value: 输入框当前值 |
input | 输入框内容变化时触发 | value: 输入框当前值 |
focus | 输入框获得焦点时触发 | event: Event |
blur | 输入框失去焦点时触发 | event: Event |
clear | 点击清除按钮后触发 | event: Event |
cancel | 点击取消按钮时触发 | - |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前进度百分比 | number | 0 |
max | 最大值 | number | string | 100 |
min | 最小值 | number | string | 0 |
step | 步长 | number | string | 1 |
bar-height | 进度条高度,默认单位为px | number | string | 2px |
button-size v2.4.5 | 滑块按钮大小,默认单位为px | number | string | 24px |
active-color | 进度条激活态颜色 | string | #1989fa |
inactive-color | 进度条非激活态颜色 | string | #e5e5e5 |
disabled | 是否禁用滑块 | boolean | false |
vertical | 是否垂直展示 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
input | 进度变化时实时触发 | value: 当前进度 |
change | 进度变化且结束拖动后触发 | value: 当前进度 |
drag-start | 开始拖动时触发 | - |
drag-end | 结束拖动时触发 | - |
名称 | 说明 |
---|---|
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前输入值 | number | string | - |
min | 最小值 | number | string | 1 |
max | 最大值 | number | string | - |
default-value | 初始值,当 v-model 为空时生效 | number | string | 1 |
step | 步长,每次点击时改变的值 | number | string | 1 |
name v2.2.11 | 标识符,可以在change 事件回调参数中获取 | number | string | - |
input-width | 输入框宽度,默认单位为px | number | string | 32px |
button-size v2.0.5 | 按钮大小以及输入框高度,默认单位为px | number | string | 28px |
decimal-length v2.2.1 | 固定显示的小数位数 | number | string | - |
integer | 是否只允许输入整数 | boolean | false |
disabled | 是否禁用步进器 | boolean | false |
disable-plus v2.2.16 | 是否禁用增加按钮 | boolean | false |
disable-minus v2.2.16 | 是否禁用减少按钮 | boolean | false |
disable-input | 是否禁用输入框 | boolean | false |
async-change | 是否开启异步变更,开启后需要手动控制输入值 | boolean | false |
show-plus v2.1.2 | 是否显示增加按钮 | boolean | true |
show-minus v2.1.2 | 是否显示减少按钮 | boolean | true |
long-press v2.4.3 | 是否开启长按手势 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 开关选中状态 | any | false |
loading | 是否为加载状态 | boolean | false |
disabled | 是否为禁用状态 | boolean | false |
size v2.2.11 | 开关尺寸,默认单位为px | number | string | 30px |
active-color | 打开时的背景色 | string | #1989fa |
inactive-color | 关闭时的背景色 | string | white |
active-value | 打开时的值 | any | true |
inactive-value | 关闭时的值 | any | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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(); } }); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
accept | 允许上传的文件类型,详细说明 | string | image/* |
name v2.0.3 | 标识符,可以在回调函数的第二项参数中获取 | number | string | - |
preview-size | 预览图和上传区域的尺寸,默认单位为px | number | string | 80px |
preview-image | 是否在上传完成后展示预览图 | boolean | true |
preview-full-image v2.1.5 | 是否在点击预览图后展示全屏图片预览 | boolean | true |
multiple | 是否开启图片多选,部分安卓机型不支持 | boolean | false |
disabled | 是否禁用文件上传 | boolean | false |
deletable v2.2.12 | 是否展示删除按钮 | boolean | true |
capture | 图片选取模式,可选值为camera (直接调起摄像头) | string | - |
after-read | 文件读取完成后的回调函数 | Function | - |
before-read | 文件读取前的回调函数,返回false 可终止文件读取,支持返回 Promise | Function | - |
before-delete | 文件删除前的回调函数,返回false 可终止文件读取,支持返回 Promise | Function | - |
max-size | 文件大小限制,单位为byte | number | string | - |
max-count | 文件上传数量限制 | number | string | - |
result-type v2.2.7 | 文件读取结果类型,可选值为file text | string | dataUrl |
upload-text | 上传区域文字提示 | string | - |
image-fit v2.1.5 | 预览图裁剪模式,可选值见 Image 组件 | string | cover |
事件名 | 说明 | 回调参数 |
---|---|---|
oversize | 文件大小超过限制时触发 | 同after-read |
click-preview | 点击预览图时触发 | 同after-read |
close-preview | 关闭全屏图片预览时触发 | - |
delete | 删除文件预览时触发 | 同after-read |
名称 | 说明 |
---|---|
default | 自定义上传区域 |
before-read、after-read、before-delete 执行时会传递以下回调参数:
参数名 | 说明 | 类型 |
---|---|---|
file | 文件解析后的 file 对象 | object |
detail | 额外信息,包含 name 和 index 字段 | object |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
actions | 菜单选项 | Action[] | [] |
title | 顶部标题 | string | - |
cancel-text | 取消按钮文字 | string | - |
description v2.2.8 | 选项上方的描述信息 | string | - |
close-icon v2.2.13 | 关闭 图标名称 或图片链接 | string | cross |
duration v2.0.3 | 动画时长,单位秒 | number | string | 0.3 |
round v2.0.9 | 是否显示圆角 | boolean | true |
overlay | 是否显示遮罩层 | boolean | true |
lock-scroll | 是否锁定背景滚动 | boolean | true |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
close-on-click-action | 是否在点击选项后关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | true |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
actions属性为一个对象数组,数组中的每个对象配置一列,对象可以包含以下值:
键名 | 说明 | 类型 |
---|---|---|
name | 标题 | string |
subname | 二级标题 | string |
color | 选项文字颜色 | string |
className | 为对应列添加额外的 class | any |
loading | 是否为加载状态 | boolean |
disabled | 是否为禁用状态 | boolean |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 选中选项时触发,禁用或加载状态下不会触发 | item: 选项对应的对象, index: 选择对应的索引 |
cancel | 取消按钮点击时触发 | - |
click-overlay | 点击遮罩层时触发 | - |
open | 打开菜单时触发 | - |
opened | 打开菜单且动画结束后触发 | - |
close | 关闭菜单时触发 | - |
closed | 关闭菜单且动画结束后触发 | - |
在 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 }; }}
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Dialog | 展示弹窗 | options | Promise |
Dialog.alert | 展示消息提示弹窗 | options | Promise |
Dialog.confirm | 展示消息确认弹窗 | options | Promise |
Dialog.setDefaultOptions | 修改默认配置,对所有 Dialog 生效 | options | void |
Dialog.resetDefaultOptions | 重置默认配置,对所有 Dialog 生效 | - | void |
Dialog.close | 关闭弹窗 | - | void |
通过函数调用 Dialog 时,支持传入以下选项:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
width v2.2.7 | 弹窗宽度,默认单位为px | number | string | 320px |
message | 文本内容,支持通过
换行 | string | - |
messageAlign | 内容对齐方式,可选值为left right | string | center |
className | 自定义类名 | any | - |
showConfirmButton | 是否展示确认按钮 | boolean | true |
showCancelButton | 是否展示取消按钮 | boolean | false |
confirmButtonText | 确认按钮文案 | string | 确认 |
confirmButtonColor | 确认按钮颜色 | string | #1989fa |
cancelButtonText | 取消按钮文案 | string | 取消 |
cancelButtonColor | 取消按钮颜色 | string | black |
overlay | 是否展示遮罩层 | boolean | true |
overlayClass v2.2.7 | 自定义遮罩层类名 | string | - |
overlayStyle v2.2.7 | 自定义遮罩层样式 | object | - |
closeOnPopstate v2.0.5 | 是否在页面回退时自动关闭 | boolean | false |
closeOnClickOverlay | 是否在点击遮罩层后关闭弹窗 | boolean | false |
lockScroll | 是否锁定背景滚动 | boolean | true |
beforeClose | 关闭前的回调函数, 调用 done() 后关闭弹窗, 调用 done(false) 阻止弹窗关闭 | (action, done) => void | - |
transition v2.2.6 | 动画类名,等价于 transition 的name 属性 | string | - |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | body |
通过组件调用 Dialog 时,支持以下 Props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示弹窗 | boolean | - |
title | 标题 | string | - |
width v2.2.7 | 弹窗宽度,默认单位为px | number | string | 320px |
message | 文本内容,支持通过
换行 | string | - |
message-align | 内容对齐方式,可选值为left right | string | center |
show-confirm-button | 是否展示确认按钮 | boolean | true |
show-cancel-button | 是否展示取消按钮 | boolean | false |
confirm-button-text | 确认按钮文案 | string | 确认 |
confirm-button-color | 确认按钮颜色 | string | #1989fa |
cancel-button-text | 取消按钮文案 | string | 取消 |
cancel-button-color | 取消按钮颜色 | string | black |
overlay | 是否展示遮罩层 | boolean | true |
overlay-class v2.2.7 | 自定义遮罩层类名 | string | - |
overlay-style v2.2.7 | 自定义遮罩层样式 | object | - |
close-on-popstate v2.0.5 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭弹窗 | boolean | false |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
lock-scroll | 是否锁定背景滚动 | boolean | true |
before-close | 关闭前的回调函数, 调用 done() 后关闭弹窗, 调用 done(false) 阻止弹窗关闭 | (action, done) => void | - |
transition v2.2.6 | 动画类名,等价于 transtion 的name 属性 | string | - |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
通过组件调用 Dialog 时,支持以下事件:
事件 | 说明 | 回调参数 |
---|---|---|
confirm | 点击确认按钮时触发 | - |
cancel | 点击取消按钮时触发 | - |
open | 打开弹窗时触发 | - |
opened | 打开弹窗且动画结束后触发 | - |
close | 关闭弹窗时触发 | - |
closed | 关闭弹窗且动画结束后触发 | - |
通过组件调用 Dialog 时,支持以下插槽:
名称 | 说明 |
---|---|
default | 自定义内容 |
title | 自定义标题 |
app.json
或index.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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
active-color | 菜单标题和选项的选中态颜色 | string | #1989fa |
direction v2.0.1 | 菜单展开方向,可选值为up | string | down |
z-index | 菜单栏 z-index 层级 | number | string | 10 |
duration | 动画时长,单位秒 | number | string | 0.2 |
overlay | 是否显示遮罩层 | boolean | true |
close-on-click-overlay | 是否在点击遮罩层后关闭菜单 | boolean | true |
close-on-click-outside v2.0.7 | 是否在点击外部元素后关闭菜单 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中项对应的 value,可以通过v-model 双向绑定 | number | string | - |
title | 菜单项标题 | string | 当前选中项文字 |
options | 选项数组 | Option[] | [] |
disabled | 是否禁用菜单 | boolean | false |
title-class | 标题额外类名 | string | - |
get-container v2.2.4 | 指定挂载的节点,用法示例 | string | () => Element | - |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 点击选项导致 value 变化时触发 | value |
open | 打开菜单栏时触发 | - |
opened | 打开菜单栏且动画结束后触发 | - |
close | 关闭菜单栏时触发 | - |
opened | 关闭菜单栏且动画结束后触发 | - |
名称 | 说明 |
---|---|
default | 菜单内容 |
title | 自定义标题,不支持动态渲染 |
通过 ref 可以获取到 DropdownItem 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggle | 切换菜单展示状态,传true 为显示,false 为隐藏,不传参为取反 | show?: boolean | - |
键名 | 说明 | 类型 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
color | 颜色 | string | #c9c9c9 |
type | 类型,可选值为 spinner | string | circular |
size | 加载图标大小,默认单位为px | number | string | 30px |
text-size | 文字大小,默认单位为px | number | string | 14px |
vertical | 是否垂直排列图标和文字内容 | boolean | false |
名称 | 说明 |
---|---|
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('提示文案'); }}
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Notify | 展示提示 | options | message | notify 实例 |
Notify.clear | 关闭提示 | - | void |
Notify.setDefaultOptions | 修改默认配置,对所有 Notify 生效 | options | void |
Notify.resetDefaultOptions | 重置默认配置,对所有 Notify 生效 | - | void |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type v2.1.6 | 类型,可选值为 primary success warning | string | danger |
message | 展示文案,支持通过
换行 | string | - |
duration | 展示时长(ms),值为 0 时,notify 不会消失 | number | string | 3000 |
color | 字体颜色 | string | white |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
show | 是否展示遮罩层 | boolean | false |
z-index | z-index 层级 | number | string | 1 |
duration | 动画时长,单位秒 | number | string | 0.3 |
class-name | 自定义类名 | string | - |
custom-style v2.2.5 | 自定义样式 | object | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否处于加载中状态 | boolean | - |
pulling-text | 下拉过程提示文案 | string | 下拉即可刷新... |
loosing-text | 释放过程提示文案 | string | 释放即可刷新... |
loading-text | 加载过程提示文案 | string | 加载中... |
success-text | 刷新成功提示文案 | string | - |
success-duration | 刷新成功提示展示时长(ms) | number | string | 500 |
animation-duration | 动画时长 | number | string | 300 |
head-height v2.4.2 | 顶部内容高度 | number | string | 50 |
disabled | 是否禁用下拉刷新 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
refresh | 下拉刷新时触发 | - |
名称 | 说明 | 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; } } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name v2.0.4 | 标识符,可以在事件参数中获取到 | number | string | - |
left-width | 指定左侧滑动区域宽度,单位为px | number | string | auto |
right-width | 指定右侧滑动区域宽度,单位为px | number | string | auto |
before-close v2.3.0 | 关闭前的回调函数 | Function | - |
disabled | 是否禁用滑动 | boolean | false |
stop-propagation v2.1.0 | 是否阻止滑动事件冒泡 | boolean | false |
名称 | 说明 |
---|---|
default | 自定义显示内容 |
left | 左侧滑动内容 |
right | 右侧滑动内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | 关闭时的点击位置 (left right cell outside ) |
open | 打开时触发 | { position: 'left' | 'right' , name: string } |
close | 关闭时触发 | { position: string , name: string } |
beforeClose 的第一个参数为对象,对象中包含以下属性:
参数名 | 说明 | 类型 |
---|---|---|
name | 标识符 | string |
position | 关闭时的点击位置 (left right cell outside ) | string |
instance | SwipeCell 实例,用于调用实例方法 | 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');
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Toast | 展示提示 | options | message | toast 实例 |
Toast.loading | 展示加载提示 | options | message | toast 实例 |
Toast.success | 展示成功提示 | options | message | toast 实例 |
Toast.fail | 展示失败提示 | options | message | toast 实例 |
Toast.clear | 关闭提示 | clearAll: boolean | void |
Toast.allowMultiple | 允许同时存在多个 Toast | - | void |
Toast.setDefaultOptions | 修改默认配置,对所有 Toast 生效。 传入 type 可以修改指定类型的默认配置 | type | options | void |
Toast.resetDefaultOptions | 重置默认配置,对所有 Toast 生效。 传入 type 可以重置指定类型的默认配置 | type | void |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 提示类型,可选值为 loading success fail html | string | text |
position | 位置,可选值为 top bottom | string | middle |
message | 文本内容,支持通过
换行 | string | '' |
icon v2.0.1 | 自定义图标,支持传入 图标名称 或图片链接 | string | - |
iconPrefix v2.0.9 | 图标类名前缀 | string | van-icon |
overlay v2.2.13 | 是否显示背景遮罩层 | boolean | false |
forbidClick | 是否禁止背景点击 | boolean | false |
closeOnClick v2.1.5 | 是否在点击后关闭 | boolean | false |
closeOnClickOverlay v2.2.13 | 是否在点击遮罩层后关闭 | boolean | false |
loadingType | 加载图标类型, 可选值为 spinner | string | circular |
duration | 展示时长(ms),值为 0 时,toast 不会消失 | number | 2000 |
className | 自定义类名 | any | - |
onOpened | 完全展示后的回调函数 | Function | - |
onClose | 关闭时的回调函数 | Function | - |
transition v2.2.6 | 动画类名,等价于 transtion 的name 属性 | string | van-fade |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | body |
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="大小定制"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前进度 | number | - |
rate | 目标进度 | number | string | 100 |
size | 圆环直径,默认单位为 px | number | string | 100px |
color v2.1.4 | 进度条颜色,传入对象格式可以定义渐变色 | string | object | #1989fa |
layer-color | 轨道颜色 | string | white |
fill | 填充颜色 | string | none |
speed | 动画速度(单位为 rate/s) | number | string | 0 |
text | 文字 | string | - |
stroke-width | 进度条宽度 | number | string | 40 |
stroke-linecap v2.2.15 | 进度条端点的形状,可选值为sqaure butt | string | round |
clockwise | 是否顺时针增加 | boolean | true |
名称 | 说明 |
---|---|
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'] }; }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前展开面板的 name | 手风琴模式:number | string 非手风琴模式:(number | string)[] | - |
accordion | 是否开启手风琴模式 | boolean | false |
border | 是否显示外边框 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换面板时触发 | activeNames: 类型与 v-model 绑定的值一致 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 唯一标识符,默认为索引值 | number | string | index |
icon | 标题栏左侧 图标名称 或图片链接 | string | - |
size | 标题栏大小,可选值为 large | string | - |
title | 标题栏左侧内容 | number | string | - |
value | 标题栏右侧内容 | number | string | - |
label | 标题栏描述信息 | number | string | - |
border | 是否显示内边框 | boolean | true |
is-link | 是否展示标题栏右侧箭头并开启点击反馈 | boolean | true |
disabled | 是否禁用面板 | boolean | false |
title-class | 左侧标题额外类名 | string | - |
value-class | 右侧内容额外类名 | string | - |
label-class | 描述信息额外类名 | string | - |
名称 | 说明 |
---|---|
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('倒计时结束'); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
time | 倒计时时长,单位毫秒 | number | string | 0 |
format | 时间格式 | string | HH:mm:ss |
auto-start | 是否自动开始倒计时 | boolean | true |
millisecond | 是否开启毫秒级渲染 | boolean | false |
格式 | 说明 |
---|---|
DD | 天数 |
HH | 小时 |
mm | 分钟 |
ss | 秒数 |
S | 毫秒(1 位) |
SS | 毫秒(2 位) |
SSS | 毫秒(3 位) |
事件名 | 说明 | 回调参数 |
---|---|---|
finish | 倒计时结束时触发 | - |
change v2.4.4 | 倒计时变化时触发 | timeData |
名称 | 说明 | SlotProps |
---|---|---|
default | 自定义内容 | timeData |
名称 | 说明 | 类型 |
---|---|---|
days | 剩余天数 | number |
hours | 剩余小时 | number |
minutes | 剩余分钟 | number |
seconds | 剩余秒数 | number |
milliseconds | 剩余毫秒 | number |
通过 ref 可以获取到 CountDown 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
start | 开始倒计时 | - | - |
pause | 暂停倒计时 | - | - |
reset | 重设倒计时,若auto-start 为true ,重设后会自动开始倒计时 | - | - |
如果你遇到了在 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
dashed | 是否使用虚线 | boolean | false |
hairline | 是否使用 0.5px 线 | boolean | true |
content-position | 内容位置,可选值为left right | string | center |
名称 | 说明 |
---|---|
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; } }}
通过函数调用 ImagePreview 时,支持传入以下选项:
参数名 | 说明 | 类型 | 默认值 |
---|---|---|---|
images | 需要预览的图片 URL 数组 | string[] | [] |
startPosition | 图片预览起始位置索引 | number | string | 0 |
swipeDuration | 动画时长,单位为ms | number | string | 500 |
showIndex | 是否显示页码 | boolean | true |
showIndicators | 是否显示轮播指示器 | boolean | false |
loop | 是否开启循环播放 | boolean | true |
onClose | 关闭时的回调函数 | Function | - |
onChange v2.0.3 | 切换图片时的回调函数,回调参数为当前索引 | Function | - |
asyncClose | 是否开启异步关闭 | boolean | false |
closeOnPopstate | 是否在页面回退时自动关闭 | boolean | false |
className | 自定义类名 | any | - |
lazyLoad | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
maxZoom | 手势缩放时,最大缩放比例 | number | string | 3 |
minZoom | 手势缩放时,最小缩放比例 | number | string | 1/3 |
通过组件调用 ImagePreview 时,支持以下 Props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
images | 需要预览的图片 URL 数组 | string[] | [] |
start-position | 图片预览起始位置索引 | number | string | 0 |
swipe-duration | 动画时长,单位为 ms | number | string | 500 |
show-index | 是否显示页码 | boolean | true |
show-indicators | 是否显示轮播指示器 | boolean | false |
loop | 是否开启循环播放 | boolean | true |
async-close | 是否开启异步关闭 | boolean | false |
close-on-popstate | 是否在页面回退时自动关闭 | boolean | false |
class-name | 自定义类名 | any | - |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
max-zoom | 手势缩放时,最大缩放比例 | number | string | 3 |
min-zoom | 手势缩放时,最小缩放比例 | number | string | 1/3 |
通过组件调用 ImagePreview 时,支持以下事件:
事件 | 说明 | 回调参数 |
---|---|---|
close | 关闭时触发 | { index: 索引, url: 图片链接 } |
change | 切换当前图片时触发 | index, 当前图片的索引 |
通过组件调用 ImagePreview 时,支持以下插槽:
名称 | 说明 |
---|---|
index | 自定义页码内容 |
cover | 自定义覆盖在图片预览上方的内容 |
参数名 | 说明 | 类型 |
---|---|---|
url | 当前图片 URL | string |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
loading | 加载时的图片 | string | - |
error | 错误时的图片 | string | - |
preload | 预加载高度的比例 | string | - |
attempt | 尝试次数 | number | 3 |
listenEvents | 监听的事件 | string[] | scroll 等 |
adapter | 适配器 | object | - |
filter | 图片 URL 过滤 | object | - |
lazyComponent | 是否能懒加载模块 | boolean | false |
更多内容请参照: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(); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否处于加载状态,加载过程中不触发load 事件 | boolean | false |
finished | 是否已加载完成,加载完成后不再触发load 事件 | boolean | false |
error | 是否加载失败,加载失败后点击错误提示可以重新 触发 load 事件,必须使用sync 修饰符 | boolean | false |
offset | 滚动条与底部距离小于 offset 时触发load 事件 | number | string | 300 |
loading-text | 加载过程中的提示文案 | string | 加载中... |
finished-text | 加载完成后的提示文案 | string | - |
error-text | 加载失败后的提示文案 | string | - |
immediate-check | 是否在初始化时立即执行滚动位置检查 | boolean | true |
direction | 滚动触发加载的方向,可选值为up | string | down |
事件名 | 说明 | 回调参数 |
---|---|---|
load | 滚动条与底部距离小于 offset 时触发 | - |
通过 ref 可以获取到 List 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
check | 检查当前的滚动位置,若已滚动至底部,则会触发 load 事件 | - | - |
名称 | 说明 |
---|---|
default | 列表内容 |
loading | 自定义底部加载中提示 |
finished | 自定义加载完成后的提示文案 |
error | 自定义加载失败后的提示文案 |
List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset时,List 会触发一次 load 事件。
List 初始化后会触发一次 load 事件,用于加载第一屏的数据,这个特性可以通过immediate-check属性关闭。
如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load 事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。
List有以下三种状态,理解这些状态有助于你正确地使用List组件:
在每次请求完毕后,需要手动将loading设置为false,表示加载结束
若 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-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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
mode | 通知栏模式,可选值为 closeable link | string | '' |
text | 通知文本内容 | string | '' |
color | 文本颜色 | string | #f60 |
background | 滚动条背景 | string | #fff7cc |
left-icon | 左侧 图标名称 或图片链接 | string | - |
delay | 动画延迟时间 (s) | number | string | 1 |
speed | 滚动速率 (px/s) | number | string | 50 |
scrollable | 是否在长度溢出时滚动播放 | boolean | true |
wrapable | 是否开启文本换行,只在禁用滚动时生效 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击通知栏时触发 | event: Event |
close | 关闭通知栏时触发 | event: Event |
名称 | 内容 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
desc | 描述 | string | - |
status | 状态 | string | - |
icon | 标题左侧 图标名称 或图片链接 | string | - |
名称 | 说明 |
---|---|
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)"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
percentage | 进度百分比 | number | string | 0 |
stroke-width v2.2.1 | 进度条粗细,默认单位为px | number | string | 4px |
color | 进度条颜色 | string | #1989fa |
track-color v2.2.9 | 轨道颜色 | string | #e5e5e5 |
pivot-text | 进度文字内容 | string | 百分比 |
pivot-color | 进度文字背景色 | string | 同进度条颜色 |
text-color | 进度文字颜色 | string | white |
inactive | 是否置灰 | boolean | false |
show-pivot | 是否显示进度文字 | boolean | true |
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; }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
row | 段落占位图行数 | number | string | 0 |
row-width | 段落占位图宽度,可传数组来设置每一行的宽度 | number | string | (number | string)[] | 100% |
title | 是否显示标题占位图 | boolean | false |
avatar | 是否显示头像占位图 | boolean | false |
loading | 是否显示骨架屏,传false 时会展示子组件内容 | boolean | true |
animate | 是否开启动画 | boolean | true |
title-width | 标题占位图宽度 | number | string | 40% |
avatar-size | 头像占位图大小 | number | string | 32px |
avatar-shape | 头像占位图形状,可选值为square | string | round |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
active | 当前步骤 | number | string | 0 |
direction | 显示方向,可选值为 vertical | string | horizontal |
active-color | 激活状态颜色 | string | #07c160 |
active-icon | 激活状态底部图标,可选值见 Icon 组件 | string | checked |
inactive-icon | 未激活状态底部图标,可选值见 Icon 组件 | string | - |
名称 | 说明 |
---|---|
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; }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
offset-top | 吸顶时与顶部的距离,单位px | number | string | 0 |
z-index | 吸顶时的 z-index | number | string | 99 |
container | 容器对应的 HTML 节点 | Element | - |
事件名 | 说明 | 回调参数 |
---|---|---|
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' ] } }}
<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; } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
autoplay | 自动轮播间隔,单位为 ms | number | string | - |
duration | 动画时长,单位为 ms | number | string | 500 |
initial-swipe | 初始位置索引值 | number | string | 0 |
width | 滑块宽度,单位为px | number | string | auto |
height | 滑块高度,单位为px | number | string | auto |
loop | 是否开启循环播放 | boolean | true |
show-indicators | 是否显示指示器 | boolean | true |
vertical | 是否为纵向滚动 | boolean | false |
touchable | 是否可以通过手势滑动 | boolean | true |
stop-propagation v2.2.13 | 是否阻止滑动事件冒泡 | boolean | true |
indicator-color | 指示器颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 每一页轮播结束后触发 | index, 当前页的索引 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
通过 ref 可以获取到 Swipe 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
prev v2.4.2 | 切换到上一轮播 | - | - |
next v2.4.2 | 切换到下一轮播 | - | - |
swipeTo | 切换到指定位置 | index: number, options: Options | void |
resize v2.2.14 | 外层元素大小变化后,可以调用此方法来触发重绘 | - | void |
名称 | 说明 | 类型 |
---|---|---|
immediate | 是否跳过动画 | boolean |
名称 | 说明 |
---|---|
default | 轮播内容 |
indicator | 自定义指示器 |
这种情况通常是由于项目中引入了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; } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为primary success danger warning | string | default |
size | 大小, 可选值为large medium | string | - |
color | 标签颜色 | string | - |
plain | 是否为空心样式 | boolean | false |
round | 是否为圆角样式 | boolean | false |
mark | 是否为标记样式 | boolean | false |
text-color | 文本颜色,优先级高于color 属性 | string | white |
closeable v2.2.9 | 是否为可关闭标签 | boolean | false |
名称 | 说明 |
---|---|
default | 标签显示内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
column-num v2.0.4 | 列数 | number | string | 4 |
icon-size v2.2.6 | 图标大小,默认单位为px | number | string | 28px |
gutter | 格子之间的间距,默认单位为px | number | string | 0 |
border | 是否显示边框 | boolean | true |
center | 是否将格子内容居中显示 | boolean | true |
square | 是否将格子固定为正方形 | boolean | false |
clickable | 是否开启格子点击反馈 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 文字 | string | - |
icon | 图标名称 或图片链接 | string | - |
dot v2.2.1 | 是否显示图标右上角小红点 | boolean | false |
info v2.2.1 | 图标右上角徽标的内容 | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击格子时触发 | event: Event |
名称 | 说明 |
---|---|
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] } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
index-list | 索引字符列表 | string[] | number[] | A-Z |
z-index | z-index 层级 | number | string | 1 |
sticky | 是否开启锚点自动吸顶 | boolean | true |
sticky-offset-top v2.0.7 | 锚点自动吸顶时与顶部的距离 | number | 0 |
highlight-color | 索引字符高亮颜色 | string | #07c160 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
index | 索引字符 | number | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 选中字符时触发 | index: 索引字符 |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | '' |
left-text | 左侧文案 | string | '' |
right-text | 右侧文案 | string | '' |
left-arrow | 是否显示左侧箭头 | boolean | false |
fixed | 是否固定在顶部 | boolean | false |
border | 是否显示下边框 | boolean | true |
z-index | 元素 z-index | number | string | 1 |
名称 | 说明 |
---|---|
title | 自定义标题 |
left | 自定义左侧区域内容 |
right | 自定义右侧区域内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
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/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前页码 | number | - |
mode | 显示模式,可选值为 simple | string | multi |
prev-text | 上一页按钮文字 | string | 上一页 |
next-text | 下一页按钮文字 | string | 下一页 |
page-count | 总页数 | number | string | 根据页数计算 |
total-items | 总记录数 | number | string | 0 |
items-per-page | 每页记录数 | number | string | 10 |
show-page-size | 显示的页码个数 | number | string | 5 |
force-ellipses | 是否显示省略号 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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 }); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model v2.0.4 | 当前导航项的索引 | number | string | 0 |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换导航项时触发 | index: 当前导航项的索引 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 内容 | string | '' |
dot v2.2.1 | 是否显示右上角小红点 | boolean | false |
info | 右上角徽标的内容 | number | string | - |
disabled v2.2.0 | 是否禁用该项 | boolean | false |
url | 点击后跳转的链接地址 | string | - |
to v2.0.4 | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace v2.0.4 | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
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支持两种样式风格:line
和card
,默认为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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 绑定当前选中标签的标识符 | number | string | 0 |
type | 样式风格类型,可选值为card | string | line |
color | 标签主题色 | string | #ee0a24 |
background | 标签栏背景色 | string | white |
duration | 动画时间,单位秒 | number | string | 0.3 |
line-width | 底部条宽度,默认单位px | number | string | auto |
line-height | 底部条高度,默认单位px | number | string | 3px |
animated | 是否开启切换标签内容时的转场动画 | boolean | false |
border | 是否显示标签栏外边框,仅在type="line" 时有效 | boolean | true |
ellipsis | 是否省略过长的标题文字 | boolean | true |
sticky | 是否使用粘性定位布局 | boolean | false |
swipeable | 是否开启手势滑动切换 | boolean | false |
lazy-render | 是否开启延迟渲染(首次切换到标签时才触发内容渲染) | boolean | true |
scrollspy v2.3.0 | 是否开启滚动导航 | boolean | false |
offset-top | 粘性定位布局下与顶部的最小距离,单位px | number | string | 0 |
swipe-threshold | 滚动阈值,标签数量超过阈值时开始横向滚动 | number | string | 4 |
title-active-color | 标题选中态颜色 | string | - |
title-inactive-color | 标题默认态颜色 | string | - |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
disabled | 是否禁用标签 | boolean | false |
dot v2.3.0 | 是否在标题右上角显示小红点 | boolean | false |
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 | 是否在跳转时替换当前页面历史 | boolean | false |
title-style v2.2.14 | 自定义标题样式 | any | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击标签时触发 | name:标识符,title:标题 |
change | 当前激活的标签改变时触发 | name:标识符,title:标题 |
disabled | 点击被禁用的标签时触发 | name:标识符,title:标题 |
rendered v2.3.0 | 标签内容首次渲染时触发(仅在开启延迟渲染后触发) | name:标识符,title:标题 |
scroll | 滚动时触发,仅在 sticky 模式下生效 | { scrollTop: 距离顶部位置, isFixed: 是否吸顶 } |
通过 ref
可以获取到 Tabs
实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
resize | 外层元素大小变化后,可以调用此方法来触发重绘 | - | void |
名称 | 说明 |
---|---|
nav-left | 标题左侧内容 |
nav-right | 标题右侧内容 |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中标签的名称或索引值 | number | string | 0 |
fixed | 是否固定在底部 | boolean | true |
border | 是否显示外边框 | boolean | true |
z-index | 元素 z-index | number | string | 1 |
active-color | 选中标签的颜色 | string | #1989fa |
inactive-color | 未选中标签的颜色 | string | #7d7e80 |
route | 是否开启路由模式 | boolean | false |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换标签时触发 | active: 当前选中标签的名称或索引值 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标签名称,作为匹配的标识符 | number | string | 当前标签的索引值 |
icon | 图标名称 或图片链接 | string | - |
dot | 是否显示图标右上角小红点 | boolean | false |
info | 图标右上角徽标的内容 | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
名称 | 说明 | 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 } ] } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
items | 分类显示所需的数据 | Item[] | [] |
height | 高度,默认单位为px | number | string | 300 |
main-active-index | 左侧选中项的索引 | number | string | 0 |
active-id | 右侧选中项的 id,支持传入数组 | number | string | (number | string)[] | 0 |
max v2.2.0 | 右侧项最大选中个数 | number | string | Infinity |
事件名 | 说明 | 回调参数 |
---|---|---|
click-nav | 点击左侧导航时触发 | index:被点击的导航的索引 |
click-item | 点击右侧选择项时触发 | data: 该点击项的数据 |
名称 | 说明 |
---|---|
content | 自定义右侧区域内容 |
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 = []; } } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
area-list | 地区列表 | object | - |
area-columns-placeholder v2.2.5 | 地区选择列占位提示文字 | string[] | [] |
address-info | 收货人信息初始值 | AddressInfo | {} |
search-result | 详细地址搜索结果 | SearchResult[] | [] |
show-postal | 是否显示邮政编码 | boolean | false |
show-delete | 是否显示删除按钮 | boolean | false |
show-set-default | 是否显示默认地址栏 | boolean | false |
show-search-result | 是否显示搜索结果 | boolean | false |
save-button-text | 保存按钮文字 | string | 保存 |
delete-button-text | 删除按钮文字 | string | 删除 |
detail-rows | 详细地址输入框行数 | number | string | 1 |
detail-maxlength v2.0.4 | 详细地址最大长度 | number | string | 200 |
is-saving | 是否显示保存按钮加载动画 | boolean | false |
is-deleting | 是否显示删除按钮加载动画 | boolean | false |
tel-validator | 手机号格式校验函数 | string => boolean | - |
postal-validator v2.1.2 | 邮政编码格式校验函数 | string => boolean | - |
validator | 自定义校验函数 | (key, val) => string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
save | 点击保存按钮时触发 | content:表单内容 |
focus | 输入框聚焦时触发 | key: 聚焦的输入框对应的 key |
delete | 确认删除地址时触发 | content:表单内容 |
cancel-delete | 取消删除地址时触发 | content:表单内容 |
select-search | 选中搜索结果时触发 | value: 搜索结果 |
change-area | 修改收件地区时触发 | values: 地区信息 |
change-detail | 修改详细地址时触发 | value: 详细地址内容 |
change-default | 切换是否使用默认地址时触发 | value: 是否选中 |
名称 | 说明 |
---|---|
default | 在邮政编码下方插入内容 |
通过 ref 可以获取到 AddressEdit 实例并调用实例方法,详见 组件实例方法
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
setAddressDetail | 设置详细地址 | addressDetail: string | - |
注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取
key | 说明 | 类型 |
---|---|---|
id | 每条地址的唯一标识 | number | string |
name | 收货人姓名 | string |
tel | 收货人手机号 | string |
province | 省份 | string |
city | 城市 | string |
county | 区县 | string |
addressDetail | 详细地址 | string |
areaCode | 地区编码,通过省市区选择 获取(必填) | string |
postalCode | 邮政编码 | string |
isDefault | 是否为默认地址 | boolean |
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中地址的 id | string | - |
list | 地址列表 | Address[] | [] |
disabled-list | 不可配送地址列表 | Address[] | [] |
disabled-text | 不可配送提示文案 | string | - |
switchable | 是否允许切换地址 | boolean | true |
add-button-text | 底部按钮文字 | string | 新增地址 |
default-tag-text v2.3.0 | 默认地址标签文字 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
add | 点击新增按钮时触发 | - |
edit | 点击编辑按钮时触发 | item: 地址对象,index: 索引 |
select | 切换选中的地址时触发 | item: 地址对象,index: 索引 |
edit-disabled | 编辑不可配送的地址时触发 | item: 地址对象,index: 索引 |
select-disabled | 选中不可配送的地址时触发 | item: 地址对象,index: 索引 |
click-item | 点击任意地址时触发 | item: 地址对象,index: 索引 |
键名 | 说明 | 类型 |
---|---|---|
id | 每条地址的唯一标识 | number | string |
name | 收货人姓名 | string |
tel | 收货人手机号 | number | string |
address | 收货地址 | string |
isDefault | 是否为默认地址 | boolean |
名称 | 说明 |
---|---|
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="标题"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中的省市区code | string | - |
title | 顶部栏标题 | string | - |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
area-list | 省市区数据,格式见下方 | object | - |
columns-placeholder v2.2.5 | 列占位提示文字 | string[] | [] |
loading | 是否显示加载状态 | boolean | false |
item-height | 选项高度 | number | string | 44 |
columns-num | 显示列数,3-省市区,2-省市,1-省 | number | string | 3 |
visible-item-count | 可见的选项个数 | number | string | 5 |
swipe-duration v2.2.13 | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
is-oversea-code v2.1.4 | 根据code 校验海外地址,海外地址会划分至单独的分类 | () => boolean | - |
事件 | 说明 | 回调参数 |
---|---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
thumb | 左侧图片 URL | string | - |
title | 标题 | string | - |
desc | 描述 | string | - |
tag | 图片角标 | string | - |
num | 商品数量 | number | string | - |
price | 商品价格 | number | string | - |
origin-price | 商品划线原价 | number | string | - |
centered | 内容是否垂直居中 | boolean | false |
currency | 货币符号 | string | ¥ |
thumb-link | 点击左侧图片后跳转的链接地址 | string | - |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
click-thumb | 点击自定义图片时触发 | event: Event |
名称 | 说明 |
---|---|
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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 add edit | string | add |
name | 联系人姓名 | string | - |
tel | 联系人手机号 | string | - |
add-text | 添加时的文案提示 | string | 添加订单联系人信息 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中联系人的 id | number | string | - |
list | 联系人列表 | Contact[] | [] |
add-text | 新建按钮文案 | string | 新建联系人 |
default-tag-text v2.3.0 | 默认联系人标签文案 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
add | 点击新增按钮时触发 | - |
edit | 点击编辑按钮时触发 | item: 当前联系人对象,index: 索引 |
select | 切换选中的联系人时触发 | item: 当前联系人对象,index: 索引 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
contact-info | 联系人信息 | object | [] |
is-edit | 是否为编辑联系人 | boolean | false |
is-saving | 是否显示保存按钮加载动画 | boolean | false |
is-deleting | 是否显示删除按钮加载动画 | boolean | false |
tel-validator | 手机号格式校验函数 | (tel: string) => boolean | - |
show-set-default v2.3.0 | 是否显示默认联系人栏 | boolean | false |
set-default-label v2.3.0 | 默认联系人栏文案 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
save | 点击保存按钮时触发 | content:表单内容 |
delete | 点击删除按钮时触发 | content:表单内容 |
键名 | 说明 | 类型 |
---|---|---|
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); } }}
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 单元格标题 | string | 优惠券 |
chosen-coupon | 当前选中优惠券的索引 | number | -1 |
coupons | 可用优惠券列表 | Coupon[] | [] |
editable | 能否切换优惠券 | boolean | true |
border | 是否显示内边框 | boolean | true |
currency | 货币符号 | string | ¥ |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
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 | 是否显示兑换按钮加载动画 | boolean | false |
exchange-button-disabled | 是否禁用兑换按钮 | boolean | false |
exchange-min-length | 兑换码最小长度 | number | 1 |
displayed-coupon-index | 滚动至特定优惠券位置 | number | - |
show-close-button | 是否显示列表底部按钮 | boolean | true |
close-button-text | 列表底部按钮文字 | string | 不使用优惠 |
input-placeholder | 输入框文字提示 | string | 请输入优惠码 |
show-exchange-bar | 是否展示兑换栏 | boolean | true |
currency | 货币符号 | string | ¥ |
empty-image v2.1.0 | 列表为空时的占位图 | string | https://img.yzcdn.cn/vant/coupon-empty.png |
show-count v2.3.0 | 是否展示可用 / 不可用数量 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 优惠券切换回调 | index, 选中优惠券的索引 |
exchange | 兑换优惠券回调 | code, 兑换码 |
键名 | 说明 | 类型 |
---|---|---|
id | 优惠券 id | string |
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
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 | 是否在跳转时替换当前页面历史 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 按钮文字 | string | - |
type | 按钮类型,可选值为 primary info warning danger | string | default |
color v2.1.8 | 按钮颜色,支持传入linear-gradient 渐变色 | string | - |
icon v2.4.4 | 左侧 图标名称 或图片链接 | string | - |
disabled | 是否禁用按钮 | boolean | false |
loading | 是否显示为加载状态 | boolean | false |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
名称 | 说明 |
---|---|
default | 文本内容 |
icon | 自定义图标 |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
price | 价格(单位分) | number | - |
label | 价格左侧文案 | string | 合计: |
suffix-label | 价格右侧文案 | string | - |
text-align v2.3.0 | 价格文案对齐方向,可选值为 left | string | right |
button-text | 按钮文字 | string | - |
button-type | 按钮类型 | string | danger |
tip | 提示文案 | string | - |
tip-icon | 左侧 图标名称 或图片链接 | string | - |
currency | 货币符号 | string | ¥ |
decimal-length | 价格小数点后位数 | number | string | 2 |
disabled | 是否禁用按钮 | boolean | false |
loading | 是否显示加载中的按钮 | boolean | false |
safe-area-inset-bottom | 是否开启 底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
submit | 按钮点击事件回调 | - |
名称 | 说明 |
---|---|
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示sku | boolean | false |
sku | 商品sku数据 | object | - |
goods | 商品信息 | object | - |
goods-id | 商品 id | number | string | - |
price-tag | 显示在价格后面的标签 | string | - |
hide-stock | 是否显示商品剩余库存 | boolean | false |
hide-quota-text | 是否显示限购提示 | boolean | false |
hide-selected-text | 是否隐藏已选提示 | boolean | false |
stock-threshold | 库存阈值。低于这个值会把库存数高亮显示 | boolean | 50 |
show-add-cart-btn | 是否显示加入购物车按钮 | boolean | true |
buy-text | 购买按钮文字 | string | 立即购买 |
add-cart-text | 加入购物车按钮文字 | string | 加入购物车 |
quota | 限购数,0 表示不限购 | number | 0 |
quota-used | 已经购买过的数量 | number | 0 |
reset-stepper-on-hide | 隐藏时重置选择的商品数量 | boolean | false |
reset-selected-sku-on-hide | 隐藏时重置已选择的 sku | boolean | false |
disable-stepper-input | 是否禁用步进器输入 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | false |
stepper-title | 数量选择组件左侧文案 | string | 购买数量 |
custom-stepper-config | 步进器相关自定义配置 | object | {} |
message-config | 留言相关配置 | object | {} |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
initial-sku | 默认选中的 sku,具体参考高级用法 | object | {} |
show-soldout-sku | 是否展示售罄的 sku,默认展示并置灰 | boolean | true |
safe-area-inset-bottom v2.2.1 | 是否开启 底部安全区适配 | boolean | false |
start-sale-num v2.3.0 | 起售数量 | number | 1 |
properties v2.4.2 | 商品属性 | array | - |
事件名 | 说明 | 回调参数 |
---|---|---|
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 | 重置选中规格到初始状态 | - | - |
Sku 组件默认划分好了若干区块,这些区块都定义成了插槽,可以按需进行替换。区块顺序见下表:
名称 | 说明 |
---|---|
sku-header | 商品信息展示区,包含商品图片、名称、价格等信息 |
sku-header-price | 自定义 sku 头部价格展示 |
sku-header-origin-price | 自定义 sku 头部原价展示 |
sku-header-extra | 额外 sku 头部区域 |
sku-body-top | sku 展示区上方的内容,无默认展示内容,按需使用 |
sku-group | 商品 sku 展示区 |
extra-sku-group | 额外商品 sku 展示区,一般用不到 |
sku-stepper | 商品数量选择区 |
sku-messages | 商品留言区 |
sku-actions | 操作按钮区 |
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 // 是否隐藏剩余库存}
[ // 商品属性 { k_id: 123, // 属性id k: '加料', // 属性名 is_multiple: true, // 是否可多选 v: [ { id: 1222, // 属性值id name: '珍珠', // 属性值名 price: 1, // 属性值加价 }, { id: 1223, name: '椰果', price: 1, } ], } ]
{ // 键:skuKeyStr(sku 组合列表中当前类目对应的 key 值) // 值:skuValueId(规格值 id) s1: '30349', s2: '1193', // 初始选中数量 selectedNum: 3, // 初始选中的商品属性 // 键:属性id // 值:属性值id列表 selectedProp: { 123: [1222] }}
goods: { // 商品标题 title: '测试商品', // 默认商品 sku 缩略图 picture: 'https://img.yzcdn.cn/1.jpg'}
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: { // 图片上传回调,需要返回一个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: { // 商品 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 开关状态 | any | false |
title | 左侧标题 | string | '' |
border | 是否展示单元格内边框 | boolean | true |
cell-size | 单元格大小,可选值为 large | string | - |
loading | 是否为加载状态 | boolean | false |
disabled | 是否为禁用状态 | boolean | false |
size | 开关尺寸 | number | string | 24px |
active-color | 开关时的背景色 | string | #1989fa |
inactive-color | 开关时的背景色 | string | white |
active-value | 打开时的值 | any | true |
inactive-value | 关闭时的值 | any | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 开关状态切换回调 | checked: 是否选中开关 |
Vant 采用中文作为默认语言,同时支持多语言切换,请按照下方教程进行国际化设置。
Vant 通过 Locale 组件实现多语言支持,使用 Locale.use 方法可以切换当前使用的语言。
import { Locale } from 'vant';// 引入英文语言包import enUS from 'vant/es/locale/lang/en-US';Locale.use('en-US', enUS);
通过 Locale.add 方法可以实现文案的修改和扩展,示例如下:
import { Locale } from 'vant';const messages = { 'zh-CN': { vanPicker: { confirm: '关闭', // 将'确认'修改为'关闭' }, },};Locale.add(messages);
目前支持的语言:
语言 | 文件名 |
---|---|
简体中文 | zh-CN |
繁體中文(港) | zh-HK |
繁體中文(台) | zh-TW |
英语 | en-US |
德语 | de-DE |
德语 (正式) | de-DE-formal |
土耳其语 | tr-TR |
西班牙语 | es-ES |
日语 | ja-JP |
罗马尼亚语 | ro-RO |
挪威语 | nb-NO |
泰语 | th-TH |
法语 | fr-FR |
越南语 | vi-VN |
在 这里 查看所有的语言包源文件。
如果上方列表中没有你需要的语言,欢迎给我们提 Pull Request 来增加新的语言包,改动内容可以参考增加德语语言包 的 PR。
可以使用 vue-i18n 来实现。
目前没有提供 CDN 形式的语言包,可以手动拷贝语言包的内容来使用。
语言包中默认不包含 Sku 业务组件的语言配置,因此如果有 Sku 组件的国际化需求,请自行配置国际化文案。
在参与 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 的时候,其命名应该始终使用 camelCase,而在模板中应该始终使用 kebab-case。
// badexport default { props: { 'greeting-text': String, },};// goodexport default { props: { greetingText: String, },};
<!-- bad --><welcome-message greetingText="hi" /><!-- good --><welcome-message greeting-text="hi" />
指令缩写,用 : 表示 v-bind: ,用 @ 表示 v-on:
<!-- bad --><input v-bind:value="value" v-on:input="onInput" /><!-- good --><input :value="value" @input="onInput" />
标签的 Props 应该有统一的顺序,依次为指令、属性和事件。
<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 的设计资源下载。
包含 Sketch 格式的色彩规范、字体规范、组件设计规范。
包含 Sketch 格式的图标库资源。
Vant 的所有图标都托管在 iconfont.cn 上,点此查看:Vant 图标库。
Axure 元件库,由社区的 @axure-tczy 同学贡献。
感谢你使用 Vant。
以下是关于向 Vant 提交反馈或代码的指南。在向 Vant 提交 issue 或者 PR 之前,请先花几分钟时间阅读以下文字。
按照下面的步骤操作,即可在本地开发 Vant 组件。
# 克隆仓库# 默认为 dev 分支,包含 Vant 3 的代码# 如果需要在 Vant 2 上进行更改,请基于 2.x 分支进行开发git clone git@github.com:vant-ui/vant.git# 安装依赖cd vant && yarn# 进入开发模式,浏览器访问 http://localhost:8080yarn 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 # 中文文档
提 Pull Request 前,请依照下面的流程同步主仓库的最新代码:
# 添加主仓库到 remote,作为 fork 后仓库的上游仓库git remote add upstream https://github.com/vant-ui/vant.git# 拉取主仓库最新代码git fetch upstream# 切换至 dev 分支git checkout dev# 合并主仓库代码git merge upstream/dev
Vant 提供了一套默认主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。如果你想完全替换主题色或者其他样式,可以按照本文档进行主题定制。
我们提供了一个基于 Vue Cli 3 的示例工程,仓库地址为 Vant Demo,其中包含了定制主题的基本配置,可以作为参考。
Vant 使用了 Less 对样式进行预处理,并内置了一些样式变量,通过替换样式变量即可定制你自己需要的主题。
下面是所有的基础样式变量,组件的颜色变量请参考各个组件的文档或配置文件。
// Color Palette@black: #000;@white: #fff;@gray-1: #f7f8fa;@gray-2: #f2f3f5;@gray-3: #ebedf0;@gray-4: #dcdee0;@gray-5: #c8c9cc;@gray-6: #969799;@gray-7: #646566;@gray-8: #323233;@red: #ee0a24;@blue: #1989fa;@orange: #ff976a;@orange-dark: #ed6a0c;@orange-light: #fffbe8;@green: #07c160;// Gradient Colors@gradient-red: linear-gradient(to right, #ff6034, #ee0a24);@gradient-orange: linear-gradient(to right, #ffd01e, #ff8917);// Component Colors@text-color: @gray-8;@active-color: @gray-2;@active-opacity: 0.7;@disabled-opacity: 0.5;@background-color: @gray-1;@background-color-light: #fafafa;@text-link-color: #576b95;// Padding@padding-base: 4px;@padding-xs: @padding-base * 2;@padding-sm: @padding-base * 3;@padding-md: @padding-base * 4;@padding-lg: @padding-base * 6;@padding-xl: @padding-base * 8;// Font@font-size-xs: 10px;@font-size-sm: 12px;@font-size-md: 14px;@font-size-lg: 16px;@font-weight-bold: 500;@line-height-xs: 14px;@line-height-sm: 18px;@line-height-md: 20px;@line-height-lg: 22px;@base-font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica, Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB', 'Microsoft Yahei', sans-serif;@price-integer-font-family: Avenir-Heavy, PingFang SC, Helvetica Neue, Arial, sans-serif;// Animation@animation-duration-base: 0.3s;@animation-duration-fast: 0.2s;@animation-timing-function-enter: ease-out;@animation-timing-function-leave: ease-in;// Border@border-color: @gray-3;@border-width-base: 1px;@border-radius-sm: 2px;@border-radius-md: 4px;@border-radius-lg: 8px;@border-radius-max: 999px;
定制主题时,需要引入组件对应的 Less 样式文件,支持按需引入和手动引入两种方式。
在 babel.config.js 中配置按需引入样式源文件,注意 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: { // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。 lessOptions: { modifyVars: { // 直接覆盖变量 'text-color': '#111', 'border-color': '#eee', // 或者可以通过 less 文件覆盖(文件路径为绝对路径) hack: `true; @import "your-less-file-path.less";`, }, }, }, }, ], }, ],};
如果 vue-cli 搭建的项目,可以在 vue.config.js 中进行配置。
// vue.config.jsmodule.exports = { css: { loaderOptions: { less: { // 若 less-loader 版本小于 6.0,请移除 lessOptions 这一级,直接配置选项。 lessOptions: { modifyVars: { // 直接覆盖变量 'text-color': '#111', 'border-color': '#eee', // 或者可以通过 less 文件覆盖(文件路径为绝对路径) hack: `true; @import "your-less-file-path.less";`, }, }, }, }, },};
当前文档为 Vant 2 的更新日志,如需查询 Vant 3 的更新内容,请访问 Vant 3 更新日志。
Vant 遵循 Semver 语义化版本规范。
发布节奏
Vant 2 维护提示
目前 Vant 3 / 4 已经发布超过 24 个月。对于 Vant 2,我们会将维护投入降低至最小范围,这意味着:
2023-10-17
Feature
2023-10-10
Feature
2023-09-17
Feature
Bug Fixes
2023-02-11
Bug Fixes
2022-11-17
Feature
2022-11-08
Bug Fixes
2022-10-17
Bug Fixes
2022-09-17
Bug Fixes
2022-09-05
Bug Fixes
2022-06-25
Feature
Bug Fixes
2022-04-07
Feature
2022-03-30
Bug Fixes
2022-03-18
Bug Fixes
Feature
2022-02-14
Bug Fixes
2022-02-10
Feature
Bug Fixes
2022-02-07
Feature
2022-01-15
Bug Fixes
2022-01-10
Feature
Bug Fixes
2021-12-14
Feature
Bug Fixes
2021-12-05
Bug Fixes
2021-11-27
Bug Fixes
2021-11-24
Feature
Bug Fixes
2021-11-16
Bug Fixes
2021-11-15
Feature
Bug Fixes
2021-10-30
Bug Fixes
2021-10-14
Feature
2021-09-22
Bug Fixes
2021-09-20
Feature
Bug Fixes
2021-09-06
Feature
Bug Fixes
2021-08-15
Feature
Bug Fixes
2021-07-25
Feature
2021-07-13
Bug Fixes
2021-07-06
Bug Fixes
2021-06-22
Feature
Bug Fixes
2021-06-03
Feature
Bug Fixes
2021-05-23
Feature
Bug Fixes
2021-05-17
Feature
2021-05-10
Bug Fixes
2021-05-08
Feature
2021-05-03
Feature
Bug Fixes
2021-04-25
Bug Fixes
2021-04-18
Feature
Bug Fixes
2021-04-11
Feature
2021-04-05
Bug Fixes
2021-03-30
Bug Fixes
2021-03-19
Bug Fixes
2021-03-09
Feature
2021-03-07
Feature
Bug Fixes
2021-02-28
Feature
Bug Fixes
2021-01-26
Feature
Bug Fixes
perf
2021-01-24
Feature
style
2021-01-17
Feature
Bug Fixes
2021-01-09
Bug Fixes
2021-01-02
Feature
2020-12-26
Feature
Bug Fixes
2020-12-23
New Component
Feature
Bug Fixes
2020-12-18
Feature
2020-12-10
style
Bug Fixes
2020-11-26
Feature
style
Bug Fixes
2020-11-22
New Component
Feature
Bug Fixes
2020-11-15
Feature
Bug Fixes
2020-11-08
Feature
通过本章节你可以了解到 Vant 的一些进阶用法,比如组件插槽用法、多种浏览器适配方式。
Vant 支持多种组件注册方式,请根据实际业务需要进行选择。
全局注册后,你可以在 app 下的任意子组件中使用注册的 Vant 组件。
import Vue from 'vue';import { Button } from 'vant';// 方式一. 通过 Vue.use 注册// 注册完成后,在模板中通过 <van-button> 或 <VanButton> 标签来使用按钮组件Vue.use(Button);// 方式二. 通过 Vue.component 注册// 注册完成后,在模板中通过 <van-button> 标签来使用按钮组件Vue.component(Button.name, Button);
局部注册后,你可以在当前组件中使用注册的 Vant 组件。
import { Button } from 'vant';export default { components: { [Button.name]: Button, },};
对于组件注册更详细的介绍,请参考 Vue 官方文档 - 组件注册。
Vant 提供了丰富的组件插槽,通过插槽可以对组件的某一部分进行个性化定制。如果你对 Vue 的插槽不太熟悉,可以阅读 Vue 官方文档中的插槽章节。下面是通过插槽来定制 Checkbox 图标的示例:
<van-checkbox v-model="checked"> <!-- 使用组件提供的 icon 插槽 --> <!-- 将默认图标替换为个性化图片 --> <template #icon="props"> <img :src="props.checked ? activeIcon : inactiveIcon" /> </template></van-checkbox>
export default { data() { return { checked: true, activeIcon: 'https://img01.yzcdn.cn/vant/user-active.png', inactiveIcon: 'https://img01.yzcdn.cn/vant/user-inactive.png', }; },};
Vant 中的许多组件提供了实例方法,调用实例方法时,我们需要通过 ref 来注册组件引用信息,引用信息将会注册在父组件的$refs对象上。注册完成后,我们可以通过this.$refs.xxx访问到对应的组件实例,并调用上面的实例方法。
<!-- 通过 ref 属性将组件绑定到 this.$refs.checkbox 上 --><van-checkbox v-model="checked" ref="checkbox"> 复选框 </van-checkbox>
export default { data() { return { checked: false, }; }, // 注意:组件挂载后才能访问到 ref 对象 mounted() { this.$refs.checkbox.toggle(); },};
Vant 默认使用 px 作为样式单位,如果需要使用 viewport 单位 (vw, vh, vmin, vmax),推荐使用 postcss-px-to-viewport 进行转换。
postcss-px-to-viewport 是一款 PostCSS 插件,用于将 px 单位转化为 vw/vh 单位。
下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。
// postcss.config.jsmodule.exports = { plugins: { 'postcss-px-to-viewport': { viewportWidth: 375, }, },};
Tips: 在配置 postcss-loader 时,应避免 ignore node_modules 目录,否则将导致 Vant 样式无法被编译。
如果需要使用 rem 单位进行适配,推荐使用以下两个工具:
下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。
// postcss.config.jsmodule.exports = { plugins: { 'postcss-pxtorem': { rootValue: 37.5, propList: ['*'], }, },};
如果设计稿的尺寸不是 375,而是 750 或其他大小,可以将 rootValue 配置调整为:
// postcss.config.jsmodule.exports = { plugins: { // postcss-pxtorem 插件的版本需要 >= 5.0.0 'postcss-pxtorem': { rootValue({ file }) { return file.indexOf('vant') !== -1 ? 37.5 : 75; }, propList: ['*'], }, },};
Vant 是一个面向移动端的组件库,因此默认只适配了移动端设备,这意味着组件只监听了移动端的 touch 事件,没有监听桌面端的 mouse 事件。
如果你需要在桌面端使用 Vant,可以引入我们提供的 @vant/touch-emulator,这个库会在桌面端自动将 mouse 事件转换成对应的 touch 事件,使得组件能够在桌面端使用。
# 安装模块npm i @vant/touch-emulator -S
// 引入模块后自动生效import '@vant/touch-emulator';
iPhone X 等机型底部存在底部指示条,指示条的操作区域与页面底部存在重合,容易导致用户误操作,因此我们需要针对这些机型进行安全区适配。Vant 中部分组件提供了 safe-area-inset-top 或 safe-area-inset-bottom 属性,设置该属性后,即可在对应的机型上开启适配,如下示例:
<!-- 在 head 标签中添加 meta 标签,并设置 viewport-fit=cover 值 --><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"/><!-- 开启顶部安全区适配 --><van-nav-bar safe-area-inset-top /><!-- 开启底部安全区适配 --><van-number-keyboard safe-area-inset-bottom />
通过本章节你可以了解到 Vant 的安装方法和基本使用姿势。
在现有项目中使用 Vant 时,可以通过 npm 或 yarn 进行安装:
# Vue 3 项目,安装最新版 Vant:npm i vant -S# Vue 2 项目,安装 Vant 2:npm i vant@latest-v2 -S
推荐使用 Rsbuild 来创建一个脚手架项目。
Rsbuild 是基于 Rspack 的构建工具,由 Vant 作者开发,具备一流的构建速度和开发体验,对 Vant 提供第一优先级支持。
你可以通过以下命令创建一个 Rsbuild 项目:
npm create rsbuild@latest
请访问 Rsbuild 仓库 了解更多信息。
使用 Vant 最简单的方法是直接在 html 文件中引入 CDN 链接,之后你可以通过全局变量 vant 访问到所有组件。
<!-- 引入样式文件 --><link rel="stylesheet" href="https://link.w3cschool.cn/?target=https%3A%2F%2Funpkg.com%2Fvant%402.12%2Flib%2Findex.css" rel="external nofollow" target="_blank" /><!-- 引入 Vue 和 Vant 的 JS 文件 --><script src="https://unpkg.com/vue@2.6/dist/vue.min.js" rel="external nofollow" ></script><script src="https://unpkg.com/vant@2.12/lib/vant.min.js" rel="external nofollow" ></script><script> // 在 #app 标签下渲染一个按钮组件 new Vue({ el: '#app', template: `<van-button>按钮</van-button>`, }); // 调用函数组件,弹出一个 Toast vant.Toast('提示'); // 通过 CDN 引入时不会自动注册 Lazyload 组件 // 可以通过下面的方式手动注册 Vue.use(vant.Lazyload);</script>
你可以通过以下免费 CDN 服务来使用 Vant:
注意:免费 CDN 一般用于制作原型或个人小型项目,不推荐在企业生产环境中使用免费 CDN。
对于企业开发者,建议使用以下方式:
在新项目中使用 Vant 时,推荐使用 Vue 官方提供的脚手架 Vue Cli 创建项目并安装 Vant。
# 安装 Vue Clinpm install -g @vue/cli# 创建一个项目vue create hello-world# 创建完成后,可以通过命令打开图形化界面,如下图所示vue ui
在图形化界面中,点击 依赖 -> 安装依赖,然后将 vant 添加到依赖中即可。
我们提供了丰富的示例工程,通过示例工程你可以了解如下内容:
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';
Tips: 如果你在使用 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);
Tips: 配置按需引入后,将不允许直接导入所有组件。
在 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 是一个轻量、可靠的移动端组件库,于 2017 年开源。
目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。
你当前浏览的是 Vant 2.x 版本 的文档,适用于 Vue 2 开发。如果你在使用 Vue 3,请浏览 Vant 3 文档。
按钮用于触发一个操作,如提交表单。
import Vue from 'vue';import { Button } from 'vant';Vue.use(Button);
按钮支持 default、primary、info、warning、danger 五种类型,默认为 default。
<van-button type="primary">主要按钮</van-button><van-button type="info">信息按钮</van-button><van-button type="default">默认按钮</van-button><van-button type="warning">警告按钮</van-button><van-button type="danger">危险按钮</van-button>
通过 plain 属性将按钮设置为朴素按钮,朴素按钮的文字为按钮颜色,背景为白色。
<van-button plain type="primary">朴素按钮</van-button><van-button plain type="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="plus" type="primary" /><van-button icon="plus" type="primary">按钮</van-button><van-button icon="https://img01.yzcdn.cn/vant/user-active.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, #ff6034, #ee0a24)"> 渐变色按钮</van-button>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 primary info warning danger | string | default |
size | 尺寸,可选值为 large small mini | string | normal |
text | 按钮文字 | string | - |
color | 按钮颜色,支持传入 linear-gradient 渐变色 | string | - |
icon | 左侧图标名称或图片链接 | string | - |
icon-prefix v2.6.0 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
icon-position v2.10.7 | 图标展示位置,可选值为 right | string | left |
tag | 按钮根节点的 HTML 标签 | string | button |
native-type | 原生 button 标签的 type 属性 | string | - |
block | 是否为块级元素 | boolean | false |
plain | 是否为朴素按钮 | boolean | false |
square | 是否为方形按钮 | boolean | false |
round | 是否为圆形按钮 | boolean | false |
disabled | 是否禁用按钮 | boolean | false |
hairline | 是否使用 0.5px 边框 | boolean | false |
loading | 是否显示为加载状态 | boolean | false |
loading-text | 加载状态提示文字 | string | - |
loading-type | 加载图标类型,可选值为 spinner | string | circular |
loading-size | 加载图标大小 | string | 20px |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击按钮,且按钮状态不为加载或禁用时触发 | event: Event |
touchstart | 开始触摸按钮时触发 | event: TouchEvent |
名称 | 说明 |
---|---|
default | 按钮内容 |
icon v2.12.21 | 自定义图标 |
loading v2.10.1 | 自定义加载图标 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@button-mini-height | 24px | - |
@button-mini-font-size | @font-size-xs | - |
@button-small-height | 32px | - |
@button-small-font-size | @font-size-sm | - |
@button-normal-font-size | @font-size-md | - |
@button-large-height | 50px | - |
@button-default-height | 44px | - |
@button-default-line-height | 1.2 | - |
@button-default-font-size | @font-size-lg | - |
@button-default-color | @text-color | - |
@button-default-background-color | @white | - |
@button-default-border-color | @border-color | - |
@button-primary-color | @white | - |
@button-primary-background-color | @green | - |
@button-primary-border-color | @green | - |
@button-info-color | @white | - |
@button-info-background-color | @blue | - |
@button-info-border-color | @blue | - |
@button-danger-color | @white | - |
@button-danger-background-color | @red | - |
@button-danger-border-color | @red | - |
@button-warning-color | @white | - |
@button-warning-background-color | @orange | - |
@button-warning-border-color | @orange | - |
@button-border-width | @border-width-base | - |
@button-border-radius | @border-radius-sm | - |
@button-round-border-radius | @border-radius-max | - |
@button-plain-background-color | @white | - |
@button-disabled-opacity | @disabled-opacity | - |
用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图和上传进度。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。
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://img01.yzcdn.cn/vant/leaf.jpg' }, // Uploader 根据文件后缀来判断是否为图片文件 // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明 { url: 'https://cloud-image', isImage: true }, ], }; },};
通过 status
属性可以标识上传状态,uploading
表示上传中,failed
表示上传失败,done
表示上传完成。
<van-uploader v-model="fileList" :after-read="afterRead" />
export default { data() { return { fileList: [ { url: 'https://img01.yzcdn.cn/vant/leaf.jpg', status: 'uploading', message: '上传中...', }, { url: 'https://img01.yzcdn.cn/vant/tree.jpg', status: 'failed', message: '上传失败', }, ], }; }, methods: { afterRead(file) { file.status = 'uploading'; file.message = '上传中...'; setTimeout(() => { file.status = 'failed'; file.message = '上传失败'; }, 1000); }, },};
通过 max-count
属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。
<van-uploader v-model="fileList" multiple :max-count="2" />
export default { data() { return { fileList: [], }; },};
通过 max-size
属性可以限制上传文件的大小,超过大小的文件会被自动过滤,这些文件信息可以通过 oversize
事件获取。
<van-uploader multiple :max-size="500 * 1024" @oversize="onOversize" />
import { Toast } from 'vant';export default { methods: { onOversize(file) { console.log(file); Toast('文件大小不能超过 500kb'); }, },};
如果需要针对不同类型的文件来作出不同的大小限制,可以在 max-size
属性中传入一个函数,在函数中通过 file.type
区分文件类型,返回 true
表示超出限制,false
表示未超出限制。
<van-uploader multiple :max-size="isOverSize" />
import { Toast } from 'vant';export default { methods: { isOverSize(file) { const maxSize = file.type === 'image/jpeg' ? 500 * 1024 : 1000 * 1024; return file.size >= maxSize; }, },};
通过默认插槽可以自定义上传区域的样式。
<van-uploader> <van-button icon="plus" type="primary">上传文件</van-button></van-uploader>
通过 preview-cover
插槽可以自定义覆盖在预览区域上方的内容。
<van-uploader v-model="fileList"> <template #preview-cover="{ file }"> <div class="preview-cover van-ellipsis">{{ file.name }}</div> </template></van-uploader><style> .preview-cover { position: absolute; bottom: 0; box-sizing: border-box; width: 100%; padding: 4px; color: #fff; font-size: 12px; text-align: center; background: rgba(0, 0, 0, 0.3); }</style>
通过传入 beforeRead
函数可以在上传前进行校验和处理,返回 true
表示校验通过,返回 false
表示校验失败。支持返回 Promise
对 file 对象进行自定义处理,例如压缩图片。
<van-uploader :before-read="beforeRead" />
import { Toast } from 'vant';export default { 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 { let img = new File(['foo'], 'bar.jpg', { type: 'image/jpeg', }); resolve(img); } }); }, },};
通过 disabled
属性禁用文件上传。
<van-uploader disabled />
在 v-model
数组中设置单个预览图片属性,支持 imageFit
deletable
previewSize
beforeDelete
,从 2.12 版本开始支持。
<van-uploader v-model="fileList" :deletable="false" />
import { Toast } from 'vant';export default { data() { return { fileList = [ { url: 'https://img01.yzcdn.cn/vant/leaf.jpg' }, { url: 'https://img01.yzcdn.cn/vant/sand.jpg', deletable: true, beforeDelete: () => { Toast('自定义单个预览图片的事件和样式'); }, }, { url: 'https://img01.yzcdn.cn/vant/tree.jpg', deletable: true, imageFit: 'contain', previewSize: 120, }, ]; } }};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (fileList) | 已上传的文件列表 | FileListItem[] | - |
accept | 允许上传的文件类型,详细说明 | string | image/* |
name | 标识符,可以在回调函数的第二项参数中获取 | number | string | - |
preview-size | 预览图和上传区域的尺寸,默认单位为 px | number | string | 80px |
preview-image | 是否在上传完成后展示预览图 | boolean | true |
preview-full-image | 是否在点击预览图后展示全屏图片预览 | boolean | true |
preview-options v2.9.3 | 全屏图片预览的配置项,可选值见 ImagePreview | object | - |
multiple | 是否开启图片多选,部分安卓机型不支持 | boolean | false |
disabled | 是否禁用文件上传 | boolean | false |
readonly v2.12.26 | 是否将上传区域设置为只读状态 | boolean | false |
deletable | 是否展示删除按钮 | boolean | true |
show-upload v2.5.6 | 是否展示上传区域 | boolean | true |
lazy-load v2.6.2 | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
capture | 图片选取模式,可选值为 camera (直接调起摄像头) | string | - |
after-read | 文件读取完成后的回调函数 | Function | - |
before-read | 文件读取前的回调函数,返回 false 可终止文件读取, 支持返回 Promise | Function | - |
before-delete | 文件删除前的回调函数,返回 false 可终止文件读取, 支持返回 Promise | Function | - |
max-size v2.12.20 | 文件大小限制,单位为 byte | number | string | (file: File) => boolean | - |
max-count | 文件上传数量限制 | number | string | - |
result-type | 文件读取结果类型,可选值为 file text | string | dataUrl |
upload-text | 上传区域文字提示 | string | - |
image-fit | 预览图裁剪模式,可选值见 Image 组件 | string | cover |
upload-icon v2.5.4 | 上传区域图标名称或图片链接 | string | photograph |
注意:accept、capture 和 multiple 为浏览器 input 标签的原生属性,移动端各种机型对这些属性的支持程度有所差异,因此在不同机型和 WebView 下可能出现一些兼容性问题。
事件名 | 说明 | 回调参数 |
---|---|---|
oversize | 文件大小超过限制时触发 | 同 after-read |
click-upload v2.12.26 | 点击上传区域时触发 | event: MouseEvent |
click-preview | 点击预览图时触发 | 同 after-read |
close-preview | 关闭全屏图片预览时触发 | - |
delete | 删除文件预览时触发 | 同 after-read |
名称 | 说明 | 参数 |
---|---|---|
default | 自定义上传区域 | - |
preview-cover v2.9.1 | 自定义覆盖在预览区域上方的内容 | item: FileListItem |
before-read、after-read、before-delete 执行时会传递以下回调参数:
参数名 | 说明 | 类型 |
---|---|---|
file | file 对象 | object |
detail | 额外信息,包含 name 和 index 字段 | object |
result-type
字段表示文件读取结果的类型,上传大文件时,建议使用 file 类型,避免卡顿。
值 | 描述 |
---|---|
file | 结果仅包含 File 对象 |
text | 结果包含 File 对象,以及文件的文本内容 |
dataUrl | 结果包含 File 对象,以及文件对应的 base64 编码 |
通过 ref 可以获取到 Uploader 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
closeImagePreview | 关闭全屏的图片预览 | - | - |
chooseFile v2.5.6 | 主动调起文件选择,由于浏览器安全限制,只有在用户触发操作的上下文中调用才有效 | - | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@uploader-size | 80px | - |
@uploader-icon-size | 24px | - |
@uploader-icon-color | @gray-4 | - |
@uploader-text-color | @gray-6 | - |
@uploader-text-font-size | @font-size-sm | - |
@uploader-upload-background-color | @gray-1 | - |
@uploader-upload-active-color | @active-color | - |
@uploader-delete-color | @white | - |
@uploader-delete-icon-size | 14px | - |
@uploader-delete-background-color | rgba(0, 0, 0, 0.7) | - |
@uploader-file-background-color | @background-color | - |
@uploader-file-icon-size | 20px | - |
@uploader-file-icon-color | @gray-7 | - |
@uploader-file-name-padding | 0 @padding-base | - |
@uploader-file-name-margin-top | @padding-xs | - |
@uploader-file-name-font-size | @font-size-sm | - |
@uploader-file-name-text-color | @gray-7 | - |
@uploader-mask-background-color | fade(@gray-8, 88%) | - |
@uploader-mask-icon-size | 22px | - |
@uploader-mask-message-font-size | @font-size-sm | - |
@uploader-mask-message-line-height | @line-height-xs | - |
@uploader-loading-icon-size | 22px | - |
@uploader-loading-icon-color | @white | - |
@uploader-disabled-opacity | @disabled-opacity | - |
Uploader 采用了 HTML 原生的 <input type="file />
标签进行上传,能否上传取决于当前系统和浏览器的兼容性。当遇到无法上传的问题时,一般有以下几种情况:
webp
或 heic
格式。部分手机在拍照上传时会出现图片被旋转 90 度的问题,这个问题可以通过 compressorjs 或其他开源库进行处理。
compressorjs 是一个开源的图片处理库,提供了图片压缩、图片旋转等能力。
使用 compressorjs 进行处理的示例代码如下:
<van-uploader :before-read="beforeRead" />
import Compressor from 'compressorjs';export default { methods: { beforeRead(file) { return new Promise((resolve) => { // compressorjs 默认开启 checkOrientation 选项 // 会将图片修正为正确方向 new Compressor(file, { success: resolve, error(err) { console.log(err.message); }, }); }); }, },};
这种现象一般是内存不足导致的,通常发生在旧机型上;上传一张较大的图片引起也引起此现象。
为了减少这种情况的出现,可以在上传图片前对图片进行压缩,压缩方法请参考上文中的提到的 compressorjs
库。
目前 Chrome、Safari 等浏览器不支持展示 HEIC/HEIF 格式的图片,因此上传后无法在 Uploader 组件中进行预览。
[HEIF] 格式的兼容性请参考 caniuse。
用于在打开和关闭状态之间进行切换。
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="#ee0a24" inactive-color="#dcdee0" />
需要异步控制开关时,可以使用 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="标题"> <template #right-icon> <van-switch v-model="checked" size="24" /> </template></van-cell>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 开关选中状态 | any | false |
loading | 是否为加载状态 | boolean | false |
disabled | 是否为禁用状态 | boolean | false |
size | 开关尺寸,默认单位为px | number | string | 30px |
active-color | 打开时的背景色 | string | #1989fa |
inactive-color | 关闭时的背景色 | string | white |
active-value | 打开时对应的值 | any | true |
inactive-value | 关闭时对应的值 | any | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 开关状态切换时触发 | value: any |
click | 点击时触发 | event: Event |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@switch-size | 30px | - |
@switch-width | 2em | - |
@switch-height | 1em | - |
@switch-node-size | 1em | - |
@switch-node-background-color | @white | - |
@switch-node-box-shadow | 0 3px 1px 0 rgba(0, 0, 0, 0.05) | - |
@switch-background-color | @white | - |
@switch-on-background-color | @blue | - |
@switch-transition-duration | @animation-duration-base | - |
@switch-disabled-opacity | @disabled-opacity | - |
@switch-border | @border-width-base solid rgba(0, 0, 0, 0.1) | - |
步进器由增加按钮、减少按钮和输入框组成,用于在一定范围内输入、调整数字。
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 />
通过设置 disable-input
属性来禁用输入框,此时按钮仍然可以点击。
<van-stepper v-model="value" disable-input />
通过设置 decimal-length
属性可以保留固定的小数位数。
<van-stepper v-model="value" step="0.2" :decimal-length="1" />
通过 input-width
属性设置输入框宽度,通过 button-size
属性设置按钮大小和输入框高度。
<van-stepper v-model="value" input-width="40px" button-size="32px" />
如果需要异步地修改输入框的值,可以设置 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 }); clearTimeout(this.timer); this.timer = setTimeout(() => { Toast.clear(); // 注意此时修改 value 后会再次触发 change 事件 this.value = value; }, 500); }, },};
将 theme
设置为 round
来展示圆角风格的步进器。
<van-stepper v-model="value" theme="round" button-size="22" disable-input />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前输入的值 | number | string | - |
min | 最小值 | number | string | 1 |
max | 最大值 | number | string | - |
default-value | 初始值,当 v-model 为空时生效 | number | string | 1 |
step | 步长,每次点击时改变的值 | number | string | 1 |
name | 标识符,可以在change 事件回调参数中获取 | number | string | - |
input-width | 输入框宽度,默认单位为px | number | string | 32px |
button-size | 按钮大小以及输入框高度,默认单位为px | number | string | 28px |
decimal-length | 固定显示的小数位数 | number | string | - |
theme v2.8.2 | 样式风格,可选值为 round | string | - |
placeholder v2.8.6 | 输入框占位提示文字 | string | - |
integer | 是否只允许输入整数 | boolean | false |
disabled | 是否禁用步进器 | boolean | false |
disable-plus | 是否禁用增加按钮 | boolean | false |
disable-minus | 是否禁用减少按钮 | boolean | false |
disable-input | 是否禁用输入框 | boolean | false |
async-change | 是否开启异步变更,开启后需要手动控制输入值 | boolean | false |
show-plus | 是否显示增加按钮 | boolean | true |
show-minus | 是否显示减少按钮 | boolean | true |
show-input v2.12.1 | 是否显示输入框 | boolean | true |
long-press | 是否开启长按手势 | boolean | true |
allow-empty v2.9.1 | 是否允许输入的值为空 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | value: string, detail: { name: string } |
overlimit | 点击不可用的按钮时触发 | - |
plus | 点击增加按钮时触发 | - |
minus | 点击减少按钮时触发 | - |
focus | 输入框聚焦时触发 | event: Event |
blur | 输入框失焦时触发 | event: Event |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@stepper-active-color | #e8e8e8 | - |
@stepper-background-color | @active-color | - |
@stepper-button-icon-color | @text-color | - |
@stepper-button-disabled-color | @background-color | - |
@stepper-button-disabled-icon-color | @gray-5 | - |
@stepper-button-round-theme-color | @red | - |
@stepper-input-width | 32px | - |
@stepper-input-height | 28px | - |
@stepper-input-font-size | @font-size-md | - |
@stepper-input-line-height | normal | - |
@stepper-input-text-color | @text-color | - |
@stepper-input-disabled-text-color | @gray-5 | - |
@stepper-input-disabled-background-color | @active-color | - |
@stepper-border-radius | @border-radius-md | - |
这是因为用户输入过程中可能出现小数点或空值,比如 1.
,这种情况下组件会抛出字符串类型。
如果希望 value 保持 number 类型,可以在 v-model 上添加 number
修饰符:
<van-stepper v-model.number="value" />
滑动输入条,用于在给定的范围内选择一个值。
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); }, },};
添加 range
属性就可以开启双滑块模式,确保 value
的值是一个数组。
<van-slider v-model="value" range @change="onChange" />
import { Toast } from 'vant';export default { data() { return { // 双滑块模式时,值必须是数组 value: [10, 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"> <template #button> <div class="custom-button">{{ value }}</div> </template></van-slider><style> .custom-button { width: 26px; color: #fff; font-size: 10px; line-height: 18px; text-align: center; background-color: #ee0a24; border-radius: 100px; }</style>
设置 vertical
属性后,滑块会垂直展示,且高度为 100% 父元素高度。
<div :style="{ height: '150px' }"> <van-slider v-model="value" vertical @change="onChange" /> <van-slider v-model="value2" range vertical style="margin-left: 100px;" @change="onChange" /></div>
import { Toast } from 'vant';export default { data() { return { value: 50, value2: [10, 50], }; }, methods: { onChange(value) { Toast('当前值:' + value); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前进度百分比 | number | array | 0 |
max | 最大值 | number | string | 100 |
min | 最小值 | number | string | 0 |
step | 步长 | number | string | 1 |
bar-height | 进度条高度,默认单位为px | number | string | 2px |
button-size | 滑块按钮大小,默认单位为px | number | string | 24px |
active-color | 进度条激活态颜色 | string | #1989fa |
inactive-color | 进度条非激活态颜色 | string | #e5e5e5 |
range v2.10.7 | 是否开启双滑块模式 | boolean | false |
disabled | 是否禁用滑块 | boolean | false |
vertical | 是否垂直展示 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
input | 进度变化时实时触发 | value: 当前进度 |
change | 进度变化且结束拖动后触发 | value: 当前进度 |
drag-start | 开始拖动时触发 | - |
drag-end | 结束拖动时触发 | - |
名称 | 说明 | 参数 |
---|---|---|
button | 自定义滑动按钮 | - |
left-button v2.12.38 | 自定义左侧滑块按钮(双滑块模式下) | { value: number } |
right-button v2.12.38 | 自定义右侧滑块按钮(双滑块模式下) | { value: number } |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@slider-active-background-color | @blue | - |
@slider-inactive-background-color | @gray-3 | - |
@slider-disabled-opacity | @disabled-opacity | - |
@slider-bar-height | 2px | - |
@slider-button-width | 24px | - |
@slider-button-height | 24px | - |
@slider-button-border-radius | 50% | - |
@slider-button-background-color | @white | - |
@slider-button-box-shadow | 0 1px 2px rgba(0, 0, 0, 0.5) | - |
用于搜索场景的输入框组件。
import Vue from 'vue';import { Search } from 'vant';Vue.use(Search);
v-model
用于控制搜索框中的文字,background
可以自定义搜索框外部背景色。
<van-search v-model="value" placeholder="请输入搜索关键词" />
export default { data() { return { value: '', }; },};
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 label="地址" placeholder="请输入搜索关键词" @search="onSearch"> <template #action> <div @click="onSearch">搜索</div> </template></van-search>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 搜索框左侧文本 | string | - |
shape | 搜索框形状,可选值为 round | string | square |
background | 搜索框外部背景色 | string | #f2f2f2 |
maxlength | 输入的最大字符数 | number | string | - |
placeholder | 占位提示文字 | string | - |
clearable | 是否启用清除图标,点击清除图标后会清空输入框 | boolean | true |
clear-trigger v2.9.1 | 显示清除图标的时机,always 表示输入框不为空时展示, focus 表示输入框聚焦且不为空时展示 | string | focus |
autofocus | 是否自动聚焦,iOS 系统不支持该属性 | boolean | false |
show-action | 是否在搜索框右侧显示取消按钮 | boolean | false |
action-text | 取消按钮文字 | boolean | 取消 |
disabled | 是否禁用输入框 | boolean | false |
readonly | 是否将输入框设为只读 | boolean | false |
error | 是否将输入内容标红 | boolean | false |
input-align | 输入框内容对齐方式,可选值为 center right | string | left |
left-icon | 输入框左侧图标名称或图片链接 | string | search |
right-icon | 输入框右侧图标名称或图片链接 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
search | 确定搜索时触发 | value: string (当前输入的值) |
input | 输入框内容变化时触发 | value: string (当前输入的值) |
focus | 输入框获得焦点时触发 | event: Event |
blur | 输入框失去焦点时触发 | event: Event |
clear | 点击清除按钮后触发 | event: Event |
cancel | 点击取消按钮时触发 | - |
名称 | 说明 |
---|---|
left | 自定义左侧内容(搜索框外) |
action | 自定义右侧内容(搜索框外),设置show-action 属性后展示 |
label | 自定义左侧文本(搜索框内) |
left-icon | 自定义左侧图标(搜索框内) |
right-icon | 自定义右侧图标(搜索框内) |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@search-padding | 10px @padding-sm | - |
@search-background-color | @white | - |
@search-content-background-color | @gray-1 | - |
@search-input-height | 34px | - |
@search-label-padding | 0 5px | - |
@search-label-color | @text-color | - |
@search-label-font-size | @font-size-md | - |
@search-left-icon-color | @gray-6 | - |
@search-action-padding | 0 @padding-xs | - |
@search-action-text-color | @text-color | - |
@search-action-font-size | @font-size-md | - |
清除按钮监听是的移动端 Touch 事件,参见桌面端适配。
用于对事物进行评级操作。
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="#ffd21e" 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 />
<van-rate v-model="value" @change="onChange" />
export default { method: { onChange(value) { Toast('当前值:' + value); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前分值 | number | - |
count | 图标总数 | number | string | 5 |
size | 图标大小,默认单位为px | number | string | 20px |
gutter | 图标间距,默认单位为px | number | string | 4px |
color | 选中时的颜色 | string | #ee0a24 |
void-color | 未选中时的颜色 | string | #c8c9cc |
disabled-color | 禁用时的颜色 | string | #c8c9cc |
icon | 选中时的图标名称或图片链接 | string | star |
void-icon | 未选中时的图标名称或图片链接 | string | star-o |
icon-prefix v2.5.3 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
allow-half | 是否允许半选 | boolean | false |
readonly | 是否为只读状态 | boolean | false |
disabled | 是否禁用评分 | boolean | false |
touchable | 是否可以通过滑动手势选择评分 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当前分值变化时触发的事件 | 当前分值 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@rate-icon-size | 20px | - |
@rate-icon-gutter | @padding-base | - |
@rate-icon-void-color | @gray-5 | - |
@rate-icon-full-color | @red | - |
@rate-icon-disabled-color | @gray-5 | - |
用于在多个选项中选择单个结果。
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>
将 shape
属性设置为 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="#ee0a24">单选框 1</van-radio> <van-radio name="2" checked-color="#ee0a24">单选框 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://img01.yzcdn.cn/vant/user-active.png', inactiveIcon: 'https://img01.yzcdn.cn/vant/user-inactive.png', }; },};
设置 label-disabled
属性后,点击图标以外的内容不会触发单选框切换。
<van-radio-group v-model="radio"> <van-radio name="1" label-disabled>单选框 1</van-radio> <van-radio name="2" label-disabled>单选框 2</van-radio></van-radio-group>
此时你需要再引入 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标识符 | any | - |
shape | 形状,可选值为 square | string | round |
disabled | 是否为禁用状态 | boolean | false |
label-disabled | 是否禁用文本内容点击 | boolean | false |
label-position | 文本位置,可选值为 left | string | right |
icon-size | 图标大小,默认单位为px | number | string | 20px |
checked-color | 选中状态颜色 | string | #1989fa |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 当前选中项的标识符 | any | - |
disabled | 是否禁用所有单选框 | boolean | false |
direction v2.5.0 | 排列方向,可选值为horizontal | string | vertical |
icon-size | 所有单选框的图标大小,默认单位为px | number | string | 20px |
checked-color | 所有单选框的选中状态颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击单选框时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | name: string |
名称 | 说明 | 参数 |
---|---|---|
default | 自定义文本 | - |
icon | 自定义图标 | checked: boolean |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@radio-size | 20px | - |
@radio-border-color | @gray-5 | - |
@radio-transition-duration | @animation-duration-fast | - |
@radio-label-margin | @padding-xs | - |
@radio-label-color | @text-color | - |
@radio-checked-icon-color | @blue | - |
@radio-disabled-icon-color | @gray-5 | - |
@radio-disabled-label-color | @gray-5 | - |
@radio-disabled-background-color | @border-color | - |
提供多个选项集合供用户选择,支持单列选择和多列级联,通常与弹出层组件配合使用。
import Vue from 'vue';import { Picker } from 'vant';Vue.use(Picker);
Picker 组件通过 columns
属性配置选项数据,columns
是一个包含字符串或对象的数组。
设置 show-toolbar
属性后会展示顶部操作栏,顶部栏包含标题、确认按钮和取消按钮,点击确认按钮触发 confirm
事件,点击取消按钮触发 cancel
事件。
<van-picker title="标题" show-toolbar :columns="columns" @confirm="onConfirm" @cancel="onCancel" @change="onChange"/>
import { Toast } from 'vant';export default { data() { return { columns: ['杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '金华', '衢州'], }; }, methods: { onConfirm(value, index) { Toast(`当前值:${value}, 当前索引:${index}`); }, onChange(picker, value, index) { Toast(`当前值:${value}, 当前索引:${index}`); }, onCancel() { Toast('取消'); }, },};
单列选择时,可以通过 default-index
属性设置初始选中项的索引。
<van-picker show-toolbar title="标题" :columns="columns" :default-index="2" />
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 show-toolbar :columns="columns" />
export default { data() { return { columns: [ { text: '杭州', disabled: true }, { text: '宁波' }, { text: '温州' }, ], }; },};
通过 Picker 上的实例方法可以更灵活地控制选择器,比如使用 setColumnValues
方法实现多列联动。
<van-picker show-toolbar :columns="columns" @change="onChange" />
const cities = { 浙江: ['杭州', '宁波', '温州', '嘉兴', '湖州'], 福建: ['福州', '厦门', '莆田', '三明', '泉州'],};export default { data() { return { columns: [{ values: Object.keys(cities) }, { values: cities['浙江'] }], }; }, methods: { onChange(picker, values) { picker.setColumnValues(1, cities[values[0]]); }, },};
若选择器数据是异步获取的,可以通过 loading
属性显示加载提示。
<van-picker show-toolbar :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" round 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; }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
columns | 对象数组,配置每一列显示的数据 | Column[] | [] |
title | 顶部栏标题 | string | - |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
value-key | 选项对象中,选项文字对应的键名 | string | text |
toolbar-position | 顶部栏位置,可选值为bottom | string | top |
loading | 是否显示加载状态 | boolean | false |
readonly v2.10.5 | 是否为只读状态,只读状态下无法切换选项 | boolean | false |
show-toolbar | 是否显示顶部栏 | boolean | false |
allow-html | 是否允许选项内容中渲染 HTML | boolean | true |
default-index | 单列选择时,默认选中项的索引 | number | string | 0 |
item-height v2.8.6 | 选项高度,支持 px vw vh rem 单位,默认 px | number | string | 44 |
visible-item-count | 可见的选项个数 | number | string | 6 |
swipe-duration | 快速滑动时惯性滚动的时长,单位 ms | number | string | 1000 |
当选择器有多列时,事件回调参数会返回数组
事件名 | 说明 | 回调参数 |
---|---|---|
confirm | 点击完成按钮时触发 | 单列:选中值,选中值对应的索引 多列:所有列选中值,所有列选中值对应的索引 |
cancel | 点击取消按钮时触发 | 单列:选中值,选中值对应的索引 多列:所有列选中值,所有列选中值对应的索引 |
change | 选项改变时触发 | 单列:Picker 实例,选中值,选中值对应的索引 多列:Picker 实例,所有列选中值,当前列对应的索引 |
名称 | 说明 | 参数 |
---|---|---|
default | 自定义整个顶部栏的内容 | - |
title | 自定义标题内容 | - |
confirm v2.10.11 | 自定义确认按钮内容 | - |
cancel v2.10.11 | 自定义取消按钮内容 | - |
option v2.10.11 | 自定义选项内容 | option: string | object |
columns-top | 自定义选项上方内容 | - |
columns-bottom | 自定义选项下方内容 | - |
当传入多列数据时,columns
为一个对象数组,数组中的每一个对象配置每一列,每一列有以下 key
:
键名 | 说明 | 类型 |
---|---|---|
values | 列中对应的备选值 | string[] |
defaultIndex | 初始选中项的索引,默认为 0 | number |
className | 为对应列添加额外的类名 | any |
children | 级联选项 | Column |
通过 ref 可以获取到 Picker 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
getValues | 获取所有列选中的值 | - | values |
setValues | 设置所有列选中的值 | values | - |
getIndexes | 获取所有列选中值对应的索引 | - | indexes |
setIndexes | 设置所有列选中值对应的索引 | indexes | - |
getColumnValue | 获取对应列选中的值 | columnIndex | value |
setColumnValue | 设置对应列选中的值 | columnIndex, value | - |
getColumnIndex | 获取对应列选中项的索引 | columnIndex | optionIndex |
setColumnIndex | 设置对应列选中项的索引 | columnIndex, optionIndex | - |
getColumnValues | 获取对应列中所有选项 | columnIndex | values |
setColumnValues | 设置对应列中所有选项 | columnIndex, values | - |
confirm | 停止惯性滚动并触发 confirm 事件 | - | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@picker-background-color | @white | - |
@picker-toolbar-height | 44px | - |
@picker-title-font-size | @font-size-lg | - |
@picker-title-line-height | @line-height-md | - |
@picker-action-padding | 0 @padding-md | - |
@picker-action-font-size | @font-size-md | - |
@picker-confirm-action-color | @text-link-color | - |
@picker-cancel-action-color | @gray-6 | - |
@picker-option-font-size | @font-size-lg | - |
@picker-option-text-color | @black | - |
@picker-option-disabled-opacity | 0.3 | - |
@picker-loading-icon-color | @blue | - |
@picker-loading-mask-color | rgba(255, 255, 255, 0.9) | - |
参见桌面端适配。
带网格的输入框组件,可以用于输入密码、短信验证码等场景,通常与数字键盘组件配合使用。
import Vue from 'vue';import { PasswordInput, NumberKeyboard } from 'vant';Vue.use(PasswordInput);Vue.use(NumberKeyboard);
搭配数字键盘组件来实现密码输入功能。
<!-- 密码输入框 --><van-password-input :value="value" :focused="showKeyboard" @focus="showKeyboard = true"/><!-- 数字键盘 --><van-number-keyboard v-model="value" :show="showKeyboard" @blur="showKeyboard = false"/>
export default { data() { return { value: '123', showKeyboard: true, }; },};
通过 length 属性来设置密码长度。
<van-password-input :value="value" :length="4" :focused="showKeyboard" @focus="showKeyboard = true"/>
通过 gutter 属性来设置格子之间的间距。
<van-password-input :value="value" :gutter="10" :focused="showKeyboard" @focus="showKeyboard = true"/>
将 mask 设置为 false 可以明文展示输入的内容,适用于短信验证码等场景。
<van-password-input :value="value" :mask="false" :focused="showKeyboard" @focus="showKeyboard = true"/>
通过 info 属性设置提示信息,通过 error-info 属性设置错误提示,例如当输入六位时提示密码错误。
<van-password-input :value="value" info="密码为 6 位数字" :error-info="errorInfo" :focused="showKeyboard" @focus="showKeyboard = true"/><van-number-keyboard v-model="value" :show="showKeyboard" @blur="showKeyboard = false"/>
export default { data() { return { value: '123', errorInfo: '', showKeyboard: true, }; }, watch: { value(value) { if (value.length === 6 && value !== '123456') { this.errorInfo = '密码错误'; } else { this.errorInfo = ''; } }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 密码值 | string | '' |
info | 输入框下方文字提示 | string | - |
error-info | 输入框下方错误提示 | string | - |
length | 密码最大长度 | number | string | 6 |
gutter | 输入框格子之间的间距,如 20px 2em ,默认单位为px | number | string | 0 |
mask | 是否隐藏密码内容 | boolean | true |
focused | 是否已聚焦,聚焦时会显示光标 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
focus | 输入框聚焦时触发 | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@password-input-height | 50px | - |
@password-input-margin | 0 @padding-md | - |
@password-input-font-size | 20px | - |
@password-input-border-radius | 6px | - |
@password-input-background-color | @white | - |
@password-input-info-color | @gray-6 | - |
@password-input-info-font-size | @font-size-md | - |
@password-input-error-info-color | @red | - |
@password-input-dot-size | 10px | - |
@password-input-dot-color | @black | - |
虚拟数字键盘,可以配合密码输入框组件或自定义的输入框组件使用。
import Vue from 'vue';import { NumberKeyboard } from 'vant';Vue.use(NumberKeyboard);
数字键盘提供了 input、delete、blur 事件,分别对应输入内容、删除内容和失去焦点的动作。
<van-cell @touchstart.native.stop="show = true">弹出默认键盘</van-cell><van-number-keyboard :show="show" @blur="show = false" @input="onInput" @delete="onDelete"/>
import { Toast } from 'vant';export default { data() { return { show: true, }; }, methods: { onInput(value) { Toast(value); }, onDelete() { Toast('删除'); }, },};
点击键盘以外的区域时,键盘会自动收起,通过阻止元素上的 touchstart 事件冒泡可以避免键盘收起。
将 theme 属性设置为 custom 来展示键盘的右侧栏,常用于输入金额的场景。
<van-number-keyboard :show="show" theme="custom" extra-key="." close-button-text="完成" @blur="show = false" @input="onInput" @delete="onDelete"/>
通过 extra-key 属性可以设置左下角按键内容,比如需要输入身份证号时,可以将 extra-key 设置为 X。
<van-cell plain type="primary" @touchstart.native.stop="show = true"> 弹出身份证号键盘</van-cell><van-number-keyboard :show="show" extra-key="X" close-button-text="完成" @blur="show = false" @input="onInput" @delete="onDelete"/>
通过 title 属性可以设置键盘标题。
<van-cell plain type="info" @touchstart.native.stop="show = true"> 弹出带标题的键盘</van-cell><van-number-keyboard :show="show" title="键盘标题" extra-key="." close-button-text="完成" @blur="show = false" @input="onInput" @delete="onDelete"/>
当 theme 为 custom 时,支持以数组的形式配置两个 extra-key。
<van-cell plain type="primary" @touchstart.native.stop="show = true"> 弹出配置多个按键的键盘</van-cell><van-number-keyboard :show="show" theme="custom" :extra-key="['00', '.']" close-button-text="完成" @blur="show = false" @input="onInput" @delete="onDelete"/>
通过 random-key-order 属性可以随机排序数字键盘,常用于安全等级较高的场景。
<van-cell @touchstart.native.stop="show = true"> 弹出配置随机数字的键盘</van-cell><van-number-keyboard :show="show" random-key-order @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: '', }; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 当前输入值 | string | - |
show | 是否显示键盘 | boolean | - |
title | 键盘标题 | string | - |
theme | 样式风格,可选值为 custom | string | default |
maxlength | 输入值最大长度 | number | string | - |
transition | 是否开启过场动画 | boolean | true |
z-index | 键盘 z-index 层级 | number | string | 100 |
extra-key v2.8.2 | 底部额外按键的内容 | string | string[] | '' |
close-button-text | 关闭按钮文字,空则不展示 | string | - |
delete-button-text | 删除按钮文字,空则展示删除图标 | string | - |
close-button-loading v2.7.0 | 是否将关闭按钮设置为加载中状态,仅在 theme="custom" 时有效 | boolean | false |
show-delete-key v2.5.9 | 是否展示删除图标 | boolean | true |
hide-on-click-outside | 点击外部时是否收起键盘 | boolean | true |
get-container v2.10.0 | 指定挂载的节点,用法示例 | string | () => Element | - |
safe-area-inset-bottom | 是否开启底部安全区适配 | boolean | true |
random-key-order v2.12.2 | 是否将通过随机顺序展示按键 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
input | 点击按键时触发 | key: 按键内容 |
delete | 点击删除键时触发 | - |
close | 点击关闭按钮时触发 | - |
blur | 点击关闭按钮或非键盘区域时触发 | - |
show | 键盘完全弹出时触发 | - |
hide | 键盘完全收起时触发 | - |
名称 | 说明 |
---|---|
delete | 自定义删除按键内容 |
extra-key | 自定义左下角按键内容 |
title-left | 自定义标题栏左侧内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@number-keyboard-background-color | @gray-2 | - |
@number-keyboard-key-height | 48px | - |
@number-keyboard-key-font-size | 28px | - |
@number-keyboard-key-active-color | @gray-3 | - |
@number-keyboard-delete-font-size | @font-size-lg | - |
@number-keyboard-title-color | @gray-7 | - |
@number-keyboard-title-height | 34px | - |
@number-keyboard-title-font-size | @font-size-lg | - |
@number-keyboard-close-padding | 0 @padding-md | - |
@number-keyboard-close-color | @text-link-color | - |
@number-keyboard-close-font-size | @font-size-md | - |
@number-keyboard-button-text-color | @white | - |
@number-keyboard-button-background-color | @blue | - |
@number-keyboard-cursor-color | @text-color | - |
@number-keyboard-cursor-width | 1px | - |
@number-keyboard-cursor-height | 40% | - |
@number-keyboard-cursor-animation-duration | 1s | - |
@number-keyboard-z-index | 100 | - |
参见桌面端适配。
用于数据录入、校验,支持输入框、单选框、复选框、文件上传等类型,需要与 Field 输入框 组件搭配使用。2.5 版本开始支持此组件。
import Vue from 'vue';import { Form } from 'vant';import { Field } from 'vant';Vue.use(Form);Vue.use(Field);
在表单中,每个 Field 组件 代表一个表单项,使用 Field 的 rules 属性定义校验规则。
<van-form @submit="onSubmit"> <van-field v-model="username" name="用户名" label="用户名" placeholder="用户名" :rules="[{ required: true, message: '请填写用户名' }]" /> <van-field v-model="password" type="password" name="密码" label="密码" placeholder="密码" :rules="[{ required: true, message: '请填写密码' }]" /> <div style="margin: 16px;"> <van-button round block type="info" native-type="submit">提交</van-button> </div></van-form>
export default { data() { return { username: '', password: '', }; }, methods: { onSubmit(values) { console.log('submit', values); }, },};
通过 rules 定义表单校验规则,可用字段见下方表格。
<van-form validate-first @failed="onFailed"> <!-- 通过 pattern 进行正则校验 --> <van-field v-model="value1" name="pattern" placeholder="正则校验" :rules="[{ pattern, message: '请输入正确内容' }]" /> <!-- 通过 validator 进行函数校验 --> <van-field v-model="value2" name="validator" placeholder="函数校验" :rules="[{ validator, message: '请输入正确内容' }]" /> <!-- 通过 validator 进行异步函数校验 --> <van-field v-model="value3" name="asyncValidator" placeholder="异步函数校验" :rules="[{ validator: asyncValidator, message: '请输入正确内容' }]" /> <div style="margin: 16px;"> <van-button round block type="info" native-type="submit">提交</van-button> </div></van-form>
import { Toast } from 'vant';export default { data() { return { value1: '', value2: '', value3: '', pattern: /d{6}/, }; }, methods: { // 校验函数返回 true 表示校验通过,false 表示不通过 validator(val) { return /1d{10}/.test(val); }, // 异步校验函数返回 Promise asyncValidator(val) { return new Promise((resolve) => { Toast.loading('验证中...'); setTimeout(() => { Toast.clear(); resolve(/d{6}/.test(val)); }, 1000); }); }, onFailed(errorInfo) { console.log('failed', errorInfo); }, },};
在表单中使用 Switch 组件。
<van-field name="switch" label="开关"> <template #input> <van-switch v-model="switchChecked" size="20" /> </template></van-field>
export default { data() { return { switchChecked: false, }; },};
在表单中使用 Checkbox 组件。
<van-field name="checkbox" label="复选框"> <template #input> <van-checkbox v-model="checkbox" shape="square" /> </template></van-field><van-field name="checkboxGroup" label="复选框组"> <template #input> <van-checkbox-group v-model="checkboxGroup" direction="horizontal"> <van-checkbox name="1" shape="square">复选框 1</van-checkbox> <van-checkbox name="2" shape="square">复选框 2</van-checkbox> </van-checkbox-group> </template></van-field>
export default { data() { return { checkbox: false, checkboxGroup: [], }; },};
在表单中使用 Radio 组件。
<van-field name="radio" label="单选框"> <template #input> <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> </template></van-field>
export default { data() { return { radio: '1', }; },};
在表单中使用 Stepper 组件。
<van-field name="stepper" label="步进器"> <template #input> <van-stepper v-model="stepper" /> </template></van-field>
export default { data() { return { stepper: 1, }; },};
在表单中使用 Rate 组件。
<van-field name="rate" label="评分"> <template #input> <van-rate v-model="rate" /> </template></van-field>
export default { data() { return { rate: 3, }; },};
在表单中使用 Slider 组件。
<van-field name="slider" label="滑块"> <template #input> <van-slider v-model="slider" /> </template></van-field>
export default { data() { return { slider: 50, }; },};
在表单中使用 Uploader 组件。
<van-field name="uploader" label="文件上传"> <template #input> <van-uploader v-model="uploader" /> </template></van-field>
export default { data() { return { uploader: [{ url: 'https://img01.yzcdn.cn/vant/leaf.jpg' }], }; },};
在表单中使用 Picker 组件。
<van-field readonly clickable name="picker" :value="value" label="选择器" placeholder="点击选择城市" @click="showPicker = true"/><van-popup v-model="showPicker" position="bottom"> <van-picker show-toolbar :columns="columns" @confirm="onConfirm" @cancel="showPicker = false" /></van-popup>
export default { data() { return { value: '', columns: ['杭州', '宁波', '温州', '嘉兴', '湖州'], showPicker: false, }; }, methods: { onConfirm(value) { this.value = value; this.showPicker = false; }, },};
在表单中使用 DatetimePicker 组件。
<van-field readonly clickable name="datetimePicker" :value="value" label="时间选择" placeholder="点击选择时间" @click="showPicker = true"/><van-popup v-model="showPicker" position="bottom"> <van-datetime-picker type="time" @confirm="onConfirm" @cancel="showPicker = false" /></van-popup>
export default { data() { return { value: '', showPicker: false, }; }, methods: { onConfirm(time) { this.value = time; this.showPicker = false; }, },};
在表单中使用 Area 组件。
<van-field readonly clickable name="area" :value="value" label="地区选择" placeholder="点击选择省市区" @click="showArea = true"/><van-popup v-model="showArea" position="bottom"> <van-area :area-list="areaList" @confirm="onConfirm" @cancel="showArea = false" /></van-popup>
export default { data() { return { value: '', showArea: false, areaList: {}, // 数据格式见 Area 组件文档 }; }, methods: { onConfirm(values) { this.value = values .filter((item) => !!item) .map((item) => item.name) .join('/'); this.showArea = false; }, },};
在表单中使用 Calendar 组件。
<van-field readonly clickable name="calendar" :value="value" label="日历" placeholder="点击选择日期" @click="showCalendar = true"/><van-calendar v-model="showCalendar" @confirm="onConfirm" />
export default { data() { return { value: '', showCalendar: false, }; }, methods: { onConfirm(date) { this.value = `${date.getMonth() + 1}/${date.getDate()}`; this.showCalendar = false; }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label-width | 表单项 label 宽度,默认单位为px | number | string | 6.2em |
label-align | 表单项 label 对齐方式,可选值为 center right | string | left |
input-align | 输入框对齐方式,可选值为 center right | string | left |
error-message-align | 错误提示文案对齐方式,可选值为 center right | string | left |
validate-trigger v2.5.2 | 表单校验触发时机,可选值为 onChange 、onSubmit ,详见下表 | string | onBlur |
colon | 是否在 label 后面添加冒号 | boolean | false |
disabled v2.12.2 | 是否禁用表单中的所有输入框 | boolean | false |
readonly v2.12.2 | 是否将表单中的所有输入框设置为只读 | boolean | false |
validate-first | 是否在某一项校验不通过时停止校验 | boolean | false |
scroll-to-error v2.5.2 | 是否在提交表单且校验不通过时滚动至错误的表单项 | boolean | false |
show-error v2.6.0 | 是否在校验不通过时标红输入框 | boolean | true |
show-error-message v2.5.8 | 是否在校验不通过时在输入框下方展示错误提示 | boolean | true |
submit-on-enter v2.8.3 | 是否在按下回车键时提交表单 | boolean | true |
表单项的 API 参见:Field 组件
使用 Field 的 rules 属性可以定义校验规则,可选属性如下:
键名 | 说明 | 类型 |
---|---|---|
required | 是否为必选字段,当值为空字符串、空数组、undefined 、null 时,校验不通过 | boolean |
message v2.5.3 | 错误提示文案 | string | (value, rule) => string |
validator v2.5.3 | 通过函数进行校验 | (value, rule) => boolean | Promise |
pattern v2.5.3 | 通过正则表达式进行校验 | RegExp |
trigger v2.5.2 | 本项规则的触发时机,可选值为 onChange 、onBlur | string |
formatter v2.5.3 | 格式化函数,将表单项的值转换后进行校验 | (value, rule) => any |
通过 validate-trigger 属性可以自定义表单校验的触发时机。
值 | 描述 |
---|---|
onSubmit | 仅在提交表单时触发校验 |
onBlur | 在提交表单和输入框失焦时触发校验 |
onChange | 在提交表单和输入框内容变化时触发校验 |
事件名 | 说明 | 回调参数 |
---|---|---|
submit | 提交表单且验证通过后触发 | values: object |
failed | 提交表单且验证不通过后触发 | errorInfo: { values: object, errors: object[] } |
通过 ref 可以获取到 Form 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
submit | 提交表单,与点击提交按钮的效果等价 | - | - |
validate | 验证表单,支持传入 name 来验证单个或部分表单项 | name?: string | string[] | Promise |
resetValidation | 重置表单项的验证提示,支持传入 name 来重置单个或部分表单项 | name?: string | string[] | - |
scrollToField v2.8.3 | 滚动到对应表单项的位置,默认滚动到顶部,第二个参数传 false 可滚动至底部 | name: string, alignToTop: boolean | - |
名称 | 说明 |
---|---|
default | 表单内容 |
在表单中,除了提交按钮外,可能还有一些其他的功能性按钮,如发送验证码按钮。在使用这些按钮时,要注意将native-type设置为button,否则会触发表单提交。
<van-button native-type="button">发送验证码</van-button>
这个问题的原因是浏览器中 button 标签 type 属性的默认值为submit,导致触发表单提交。我们会在下个大版本中将 type 的默认值调整为button来避免这个问题。
表单中的输入框组件。
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" label="文本" 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="请输入短信验证码"> <template #button> <van-button size="small" type="primary">发送验证码</van-button> </template></van-field>
通过 formatter 属性可以对输入的内容进行格式化,通过 format-trigger 属性可以指定执行格式化的时机,默认在输入时进行格式化。
<van-field v-model="value1" label="文本" :formatter="formatter" placeholder="在输入时执行格式化"/><van-field v-model="value2" label="文本" :formatter="formatter" format-trigger="onBlur" placeholder="在失焦时执行格式化"/>
export default { data() { return { value1: '', value2: '', }; }, 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"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 当前输入的值 | number | string | - |
label | 输入框左侧文本 | string | - |
name v2.5.0 | 名称,提交表单的标识符 | string | - |
type | 输入框类型, 可选值为 tel digit number textarea password 等 | string | text |
size | 大小,可选值为 large | string | - |
maxlength | 输入的最大字符数 | number | string | - |
placeholder | 输入框占位提示文字 | string | - |
border | 是否显示内边框 | boolean | true |
disabled | 是否禁用输入框 | boolean | false |
readonly | 是否只读 | boolean | false |
colon v2.7.2 | 是否在 label 后面添加冒号 | boolean | false |
required | 是否显示表单必填星号 | boolean | false |
center | 是否使内容垂直居中 | boolean | false |
clearable | 是否启用清除图标,点击清除图标后会清空输入框 | boolean | false |
clear-trigger v2.9.1 | 显示清除图标的时机,always 表示输入框不为空时展示, focus 表示输入框聚焦且不为空时展示 | string | focus |
clickable | 是否开启点击反馈 | boolean | false |
is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false |
autofocus | 是否自动聚焦,iOS 系统不支持该属性 | boolean | false |
show-word-limit | 是否显示字数统计,需要设置maxlength 属性 | boolean | false |
error | 是否将输入内容标红 | boolean | false |
error-message | 底部错误提示文案,为空时不展示 | string | - |
formatter | 输入内容格式化函数 | Function | - |
format-trigger v2.8.7 | 格式化函数触发的时机,可选值为 onBlur | string | onChange |
arrow-direction | 箭头方向,可选值为 left up down | string | right |
label-class | 左侧文本额外类名 | any | - |
label-width | 左侧文本宽度,默认单位为px | number | string | 6.2em |
label-align | 左侧文本对齐方式,可选值为 center right | string | left |
input-align | 输入框对齐方式,可选值为 center right | string | left |
error-message-align | 错误提示文案对齐方式,可选值为 center right | string | left |
autosize | 是否自适应内容高度,只对 textarea 有效, 可传入对象,如 { maxHeight: 100, minHeight: 50 }, 单位为 px | boolean | object | false |
left-icon | 左侧图标名称或图片链接 | string | - |
right-icon | 右侧图标名称或图片链接 | string | - |
icon-prefix v2.5.3 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
rules v2.5.0 | 表单校验规则,详见 Form 组件 | Rule[] | - |
autocomplete | input 标签原生的自动完成属性 | string | - |
除下列事件外,Field 默认支持 Input 标签所有的原生事件
事件 | 说明 | 回调参数 |
---|---|---|
input | 输入框内容变化时触发 | value: string (当前输入的值) |
focus | 输入框获得焦点时触发 | event: Event |
blur | 输入框失去焦点时触发 | event: Event |
clear | 点击清除按钮时触发 | event: Event |
click | 点击 Field 时触发 | event: Event |
click-input v2.8.1 | 点击输入区域时触发 | event: Event |
click-left-icon | 点击左侧图标时触发 | event: Event |
click-right-icon | 点击右侧图标时触发 | event: Event |
通过 ref 可以获取到 Field 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
focus | 获取输入框焦点 | - | - |
blur | 取消输入框焦点 | - | - |
名称 | 说明 |
---|---|
label | 自定义输入框 label 标签 |
input | 自定义输入框,使用此插槽后,与输入框相关的属性和事件将失效。 在 Form 组件进行表单校验时,会使用 input 插槽中子组件的 value ,而不是 Field 组件的 value 。 |
left-icon | 自定义输入框头部图标 |
right-icon | 自定义输入框尾部图标 |
button | 自定义输入框尾部按钮 |
extra v2.8.2 | 自定义输入框最右侧的额外内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@field-label-width | 6.2em | - |
@field-label-color | @gray-7 | - |
@field-label-margin-right | @padding-sm | - |
@field-input-text-color | @text-color | - |
@field-input-error-text-color | @red | - |
@field-input-disabled-text-color | @gray-5 | - |
@field-placeholder-text-color | @gray-5 | - |
@field-icon-size | 16px | - |
@field-clear-icon-size | 16px | - |
@field-clear-icon-color | @gray-5 | - |
@field-right-icon-color | @gray-6 | - |
@field-error-message-color | @red | - |
@field-error-message-font-size | 12px | - |
@field-text-area-min-height | 60px | - |
@field-word-limit-color | @gray-7 | - |
@field-word-limit-font-size | @font-size-sm | - |
@field-word-limit-line-height | 16px | - |
@field-disabled-text-color | @gray-5 | - |
HTML 原生的 type="number" 属性在 iOS 和 Android 系统上都存在一定问题,比如 maxlength 属性不生效、无法获取到完整的输入内容等。因此设置 type 为 number 时,Field 不会使用原生的 type="number" 属性,而是用现代浏览器支持的 inputmode 属性来控制输入键盘的类型。
清除按钮监听是的移动端 Touch 事件,参见桌面端适配。
时间选择器,支持日期、年月、时分等维度,通常与弹出层组件配合使用。
import Vue from 'vue';import { DatetimePicker } from 'vant';Vue.use(DatetimePicker);
DatetimePicker 通过 type 属性来定义需要选择的时间类型,type 为 date 表示选择年月日。通过 min-date 和 max-date 属性可以确定可选的时间范围。
<van-datetime-picker v-model="currentDate" type="date" title="选择年月日" :min-date="minDate" :max-date="maxDate"/>
export default { data() { return { minDate: new Date(2020, 0, 1), maxDate: new Date(2025, 10, 1), currentDate: new Date(2021, 0, 17), }; },};
将 type 设置为 year-month 即可选择年份和月份。通过传入 formatter 函数,可以对选项文字进行格式化处理。
<van-datetime-picker v-model="currentDate" type="year-month" title="选择年月" :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; }, },};
将 type 设置为 month-day 即可选择月份和日期(从 2.8.4 版本开始支持)。
<van-datetime-picker v-model="currentDate" type="month-day" title="选择月日" :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 === 'month') { return `${val}月`; } else if (type === 'day') { return `${val}日`; } return val; }, },};
将 type 设置为 time 即可选择时间(小时和分钟)。
<van-datetime-picker v-model="currentTime" type="time" title="选择时间" :min-hour="10" :max-hour="20"/>
export default { data() { return { currentTime: '12:00', }; },};
将 type 设置为 datetime 即可选择完整时间,包括年月日和小时、分钟。
<van-datetime-picker v-model="currentDate" type="datetime" title="选择完整时间" :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(), }; },};
将 type 设置为 datehour 即可选择日期和小时,包括年月日和小时(从 2.9.1 版本开始支持)。
<van-datetime-picker v-model="currentDate" type="datehour" title="选择年月日小时" :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(), }; },};
通过传入 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; }, },};
<van-datetime-picker v-model="currentDate" type="date" title="自定义列排序" :columns-order="['month', 'day', 'year']" :formatter="formatter"/>
export default { data() { return { currentDate: new Date(), }; }, methods: { formatter(type, val) { if (type === 'year') { return val + '年'; } if (type === 'month') { return val + '月'; } if (type === 'day') { return val + '日'; } return val; }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 时间类型,可选值为 date time year-month month-day datehour | string | datetime |
title | 顶部栏标题 | string | '' |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
show-toolbar | 是否显示顶部栏 | boolean | true |
loading | 是否显示加载状态 | boolean | false |
readonly v2.10.5 | 是否为只读状态,只读状态下无法切换选项 | boolean | false |
filter | 选项过滤函数 | (type, vals) => vals | - |
formatter | 选项格式化函数 | (type, val) => val | - |
columns-order v2.9.2 | 自定义列排序数组, 子项可选值为 year 、month 、day 、hour 、minute | string[] | - |
item-height v2.8.6 | 选项高度,支持 px vw vh rem 单位,默认 px | number | string | 44 |
visible-item-count | 可见的选项个数 | number | string | 6 |
swipe-duration | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
当时间选择器类型为 date 或 datetime 时,支持以下 props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
min-date | 可选的最小时间,精确到分钟 | Date | 十年前 |
max-date | 可选的最大时间,精确到分钟 | Date | 十年后 |
当时间选择器类型为 time 时,支持以下 props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
min-hour | 可选的最小小时 | number | string | 0 |
max-hour | 可选的最大小时 | number | string | 23 |
min-minute | 可选的最小分钟 | number | string | 0 |
max-minute | 可选的最大分钟 | number | string | 59 |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当值变化时触发的事件 | picker: Picker 实例 |
confirm | 点击完成按钮时触发的事件 | value: 当前选中的时间 |
cancel | 点击取消按钮时触发的事件 | - |
名称 | 说明 | 参数 |
---|---|---|
default v2.11.1 | 自定义整个顶部栏的内容 | - |
title v2.11.1 | 自定义标题内容 | - |
confirm v2.11.1 | 自定义确认按钮内容 | - |
cancel v2.11.1 | 自定义取消按钮内容 | - |
option v2.11.1 | 自定义选项内容 | option: string | object |
columns-top v2.11.1 | 自定义选项上方内容 | - |
columns-bottom v2.11.1 | 自定义选项下方内容 | - |
通过 ref 可以获取到 DatetimePicker 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
getPicker v2.5.3 | 获取 Picker 实例,用于调用 Picker 的实例方法 | - | - |
请注意不要在模板中直接使用类似min-date="new Date()"的写法,这样会导致每次渲染组件时传入一个新的 Date 对象,而传入新的数据会触发下一次渲染,从而陷入死循环。
正确的做法是将min-date作为一个数据定义在data函数中。
如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。
对此问题的详细解释:stackoverflow。
参见桌面端适配。
如果仅需要选择年份或者月份,建议直接使用 Picker 组件。
用于在选中和非选中状态之间进行切换。
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>
将 shape 属性设置为 square,复选框的形状会变成方形。
<van-checkbox v-model="checked" shape="square">复选框</van-checkbox>
通过 checked-color 属性设置选中状态的图标颜色。
<van-checkbox v-model="checked" checked-color="#ee0a24">复选框</van-checkbox>
通过 icon-size 属性可以自定义图标的大小。
<van-checkbox v-model="checked" icon-size="24px">复选框</van-checkbox>
通过 icon 插槽自定义图标,可以通过 slotProps 判断是否为选中状态.
<van-checkbox v-model="checked"> 自定义图标 <template #icon="props"> <img class="img-icon" :src="props.checked ? activeIcon : inactiveIcon" /> </template></van-checkbox><style> .img-icon { height: 20px; }</style>
export default { data() { return { checked: true, activeIcon: 'https://img01.yzcdn.cn/vant/user-active.png', inactiveIcon: 'https://img01.yzcdn.cn/vant/user-inactive.png', }; },};
设置 label-disabled 属性后,点击图标以外的内容不会触发复选框切换。
<van-checkbox v-model="checked" label-disabled>复选框</van-checkbox>
复选框可以与复选框组一起使用,复选框组通过 v-model 数组绑定复选框的勾选状态。
<van-checkbox-group v-model="result"> <van-checkbox name="a">复选框 a</van-checkbox> <van-checkbox name="b">复选框 b</van-checkbox></van-checkbox-group>
export default { data() { return { result: ['a', 'b'], }; },};
将 direction 属性设置为 horizontal 后,复选框组会变成水平排列。
<van-checkbox-group v-model="result" direction="horizontal"> <van-checkbox name="a">复选框 a</van-checkbox> <van-checkbox name="b">复选框 b</van-checkbox></van-checkbox-group>
export default { data() { return { result: [], }; },};
通过 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)" > <template #right-icon> <van-checkbox :name="item" ref="checkboxes" /> </template> </van-cell> </van-cell-group></van-checkbox-group>
export default { data() { return { list: ['a', 'b'], result: [], }; }, methods: { toggle(index) { this.$refs.checkboxes[index].toggle(); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 是否为选中状态 | boolean | false |
name | 标识符 | any | - |
shape | 形状,可选值为 square | string | round |
disabled | 是否禁用复选框 | boolean | false |
label-disabled | 是否禁用复选框文本点击 | boolean | false |
label-position | 文本位置,可选值为 left | string | right |
icon-size | 图标大小,默认单位为 px | number | string | 20px |
checked-color | 选中状态颜色 | string | #1989fa |
bind-group | 是否与复选框组绑定 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 所有选中项的标识符 | any[] | - |
disabled | 是否禁用所有复选框 | boolean | false |
max | 最大可选数,0 为无限制 | number | string | 0 |
direction v2.5.0 | 排列方向,可选值为 horizontal | string | vertical |
icon-size | 所有复选框的图标大小,默认单位为 px | number | string | 20px |
checked-color | 所有复选框的选中状态颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | checked: boolean |
click | 点击复选框时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 当绑定值变化时触发的事件 | names: any[] |
名称 | 说明 | 参数 |
---|---|---|
default | 自定义文本 | - |
icon | 自定义图标 | checked: boolean |
通过 ref 可以获取到 CheckboxGroup 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggleAll | 切换所有复选框,传 true 为选中,false 为取消选中,不传参为取反 | options?: boolean | object | - |
const { checkboxGroup } = this.$refs;// 全部反选checkboxGroup.toggleAll();// 全部选中checkboxGroup.toggleAll(true);// 全部取消checkboxGroup.toggleAll(false);// 全部反选,并跳过禁用的复选框checkboxGroup.toggleAll({ skipDisabled: true,});// 全部选中,并跳过禁用的复选框checkboxGroup.toggleAll({ checked: true, skipDisabled: true,});
通过 ref 可以获取到 Checkbox 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggle | 切换选中状态,传 true 为选中,false 为取消选中,不传参为取反 | checked?: boolean | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@checkbox-size | 20px | - |
@checkbox-border-color | @gray-5 | - |
@checkbox-transition-duration | @animation-duration-fast | - |
@checkbox-label-margin | @padding-xs | - |
@checkbox-label-color | @text-color | - |
@checkbox-checked-icon-color | @blue | - |
@checkbox-disabled-icon-color | @gray-5 | - |
@checkbox-disabled-label-color | @gray-5 | - |
@checkbox-disabled-background-color | @border-color | - |
级联选择框,用于多层级数据的选择,典型场景为省市区选择,2.12 版本开始支持此组件。
import Vue from 'vue';import { Cascader } from 'vant';Vue.use(Cascader);
级联选择组件可以搭配 Field 和 Popup 组件使用,示例如下:
<van-field v-model="fieldValue" is-link readonly label="地区" placeholder="请选择所在地区" @click="show = true"/><van-popup v-model="show" round position="bottom"> <van-cascader v-model="cascaderValue" title="请选择所在地区" :options="options" @close="show = false" @finish="onFinish" /></van-popup>
export default { data() { return { show: false, fieldValue: '', cascaderValue: '', // 选项列表,children 代表子选项,支持多级嵌套 options: [ { text: '浙江省', value: '330000', children: [{ text: '杭州市', value: '330100' }], }, { text: '江苏省', value: '320000', children: [{ text: '南京市', value: '320100' }], }, ], }; }, methods: { // 全部选项选择完毕后,会触发 finish 事件 onFinish({ selectedOptions }) { this.show = false; this.fieldValue = selectedOptions.map((option) => option.text).join('/'); }, },};
通过 active-color 属性来设置选中状态的高亮颜色。
<van-cascader v-model="cascaderValue" title="请选择所在地区" :options="options" active-color="#1989fa" @close="show = false" @finish="onFinish"/>
可以监听 change 事件并动态设置 options,实现异步加载选项。
<van-field v-model="fieldValue" is-link readonly label="地区" placeholder="请选择所在地区" @click="show = true"/><van-popup v-model="show" round position="bottom"> <van-cascader v-model="cascaderValue" title="请选择所在地区" :options="options" @close="show = false" @change="onChange" @finish="onFinish" /></van-popup>
export default { data() { return { show: false, fieldValue: '', cascaderValue: '', options: [ { text: '浙江省', value: '330000', children: [], }, ], }; }, methods: { onChange({ value }) { if (value === this.options[0].value) { setTimeout(() => { this.options[0].children = [ { text: '杭州市', value: '330100' }, { text: '宁波市', value: '330200' }, ]; }, 500); } }, onFinish({ selectedOptions }) { this.show = false; this.fieldValue = selectedOptions.map((option) => option.text).join('/'); }, },};
通过 field-names 属性可以自定义 options 里的字段名称。
<van-cascader v-model="cascaderValue" title="请选择所在地区" :options="options" :field-names="fieldNames"/>
export default { data() { return { cascaderValue: '', fieldNames: { text: 'name', value: 'code', children: 'items', }, options: [ { name: '浙江省', code: '330000', items: [{ name: '杭州市', code: '330100' }], }, { name: '江苏省', code: '320000', items: [{ name: '南京市', code: '320100' }], }, ], }; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 顶部标题 | string | - |
value | 选中项的值 | string | number | - |
options | 可选项数据源 | Option[] | [] |
placeholder | 未选中时的提示文案 | string | 请选择 |
active-color | 选中状态的高亮颜色 | string | #ee0a24 |
closeable | 是否显示关闭图标 | boolean | true |
show-header v2.12.40 | 是否展示标题栏 | boolean | true |
field-names v2.12.4 | 自定义 options 结构中的字段 | object | { text: 'text', value: 'value', children: 'children' } |
事件 | 说明 | 回调参数 |
---|---|---|
change | 选中项变化时触发 | { value, selectedOptions, tabIndex } |
finish | 全部选项选择完成后触发 | { value, selectedOptions, tabIndex } |
close | 点击关闭图标时触发 | - |
名称 | 说明 | 参数 |
---|---|---|
title | 自定义顶部标题 | - |
option v2.12.25 | 自定义选项文字 | { option: Option, selected: boolean } |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@cascader-header-height | 48px | - |
@cascader-title-font-size | @font-size-lg | - |
@cascader-title-line-height | 20px | - |
@cascader-close-icon-size | 22px | - |
@cascader-close-icon-color | @gray-5 | - |
@cascader-close-icon-active-color | @gray-6 | - |
@cascader-selected-icon-size | 18px | - |
@cascader-tabs-height | 48px | - |
@cascader-active-color | @red | - |
@cascader-options-height | 384px | - |
@cascader-tab-color | @text-color | - |
@cascader-unselected-tab-color | @gray-6 | - |
日历组件用于选择日期或日期区间,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 为 multiple 后可以选择多个日期,此时 confirm 事件返回的 date 为数组结构,数组包含若干个选中的日期。
<van-cell title="选择多个日期" :value="text" @click="show = true" /><van-calendar v-model="show" type="multiple" @confirm="onConfirm" />
export default { data() { return { text: '', show: false, }; }, methods: { onConfirm(date) { this.show = false; this.text = `选择了 ${date.length} 个日期`; }, },};
设置 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)}`; }, },};
Tips: 默认情况下,日期区间的起止时间不能为同一天,可以通过设置 allow-same-day 属性来允许选择同一天。
将 show-confirm 设置为 false 可以隐藏确认按钮,这种情况下选择完成后会立即触发 confirm 事件。
<van-calendar v-model="show" :show-confirm="false" />
通过 color 属性可以自定义日历的颜色,对选中日期和底部按钮生效。
<van-calendar v-model="show" color="#1989fa" />
通过 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' }" />
通过 first-day-of-week 属性设置一周从哪天开始。
<van-calendar first-day-of-week="1" />
将 poppable 设置为 false,日历会直接展示在页面内,而不是以弹层的形式出现。
<van-calendar title="日历" :poppable="false" :show-confirm="false" :style="{ height: '500px' }"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type v2.5.4 | 选择类型: single 表示选择单个日期, multiple 表示选择多个日期, range 表示选择日期区间 | string | single |
title | 日历标题 | string | 日期选择 |
color | 主题色,对底部按钮和选中日期生效 | string | #ee0a24 |
min-date | 可选择的最小日期 | Date | 当前日期 |
max-date | 可选择的最大日期 | Date | 当前日期的六个月后 |
default-date | 默认选中的日期,type 为 multiple 或 range 时为数组,传入 null 表示默认不选择 | Date | Date[] | null | 今天 |
row-height | 日期行高 | number | string | 64 |
formatter | 日期格式化函数 | (day: Day) => Day | - |
poppable | 是否以弹层的形式展示日历 | boolean | true |
lazy-render v2.8.1 | 是否只渲染可视区域的内容 | boolean | true |
show-mark | 是否显示月份背景水印 | boolean | true |
show-title v2.5.5 | 是否展示日历标题 | boolean | true |
show-subtitle v2.5.5 | 是否展示日历副标题(年月) | boolean | true |
show-confirm | 是否展示确认按钮 | boolean | true |
readonly v2.10.5 | 是否为只读状态,只读状态下不能选择日期 | boolean | false |
confirm-text | 确认按钮的文字 | string | 确定 |
confirm-disabled-text | 确认按钮处于禁用状态时的文字 | string | 确定 |
first-day-of-week v2.9.2 | 设置周起始日 | 0-6 | 0 |
当 Calendar 的 poppable 为 true 时,支持以下 props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示日历弹窗 | boolean | false |
position | 弹出位置,可选值为 top right left | string | bottom |
round | 是否显示圆角弹窗 | boolean | true |
close-on-popstate | 是否在页面回退时自动关闭 | boolean | true |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
safe-area-inset-bottom | 是否开启底部安全区适配 | boolean | true |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
当 Calendar 的 type 为 range 时,支持以下 props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
max-range | 日期区间最多可选天数 | number | string | 无限制 |
range-prompt | 范围选择超过最多可选天数时的提示文案 | string | 选择天数不能超过 xx 天 |
allow-same-day v2.5.6 | 是否允许日期范围的起止时间为同一天 | boolean | false |
当 Calendar 的 type 为 multiple 时,支持以下 props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
max-range v2.7.2 | 日期最多可选天数 | number | string | 无限制 |
range-prompt | 选择超过最多可选天数时的提示文案 | string | 选择天数不能超过 xx 天 |
日历中的每个日期都对应一个 Day 对象,通过formatter属性可以自定义 Day 对象的内容
键名 | 说明 | 类型 |
---|---|---|
date | 日期对应的 Date 对象 | Date |
type | 日期类型,可选值为selected 、start 、middle 、end 、disabled | string |
text | 中间显示的文字 | string |
topInfo | 上方的提示信息 | string |
bottomInfo | 下方的提示信息 | string |
className | 额外类名 | string |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 点击并选中任意日期时触发 | value: Date | Date[] |
confirm | 日期选择完成后触发,若show-confirm 为true ,则点击确认按钮后触发 | value: Date | Date[] |
open v2.5.2 | 打开弹出层时触发 | - |
close v2.5.2 | 关闭弹出层时触发 | - |
opened v2.5.2 | 打开弹出层且动画结束后触发 | - |
closed v2.5.2 | 关闭弹出层且动画结束后触发 | - |
unselect v2.7.2 | 当日历组件的 type 为 multiple 时,取消选中日期时触发 | value: Date |
month-show v2.8.2 | 当某个月份进入可视区域时触发 | { date: Date, title: string } |
名称 | 说明 | 参数 |
---|---|---|
title | 自定义标题 | - |
footer | 自定义底部区域内容 | - |
top-info v2.12.22 | 自定义日期上方的提示信息 | day: Day |
bottom-info v2.12.22 | 自定义日期下方的提示信息 | day: Day |
通过 ref 可以获取到 Calendar 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
reset | 将选中的日期重置到指定日期,未传参时会重置到默认日期 | date?: Date | Date[] | - |
scrollToDate v2.12.2 | 滚动到某个日期 | date: Date | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@calendar-background-color | @white | - |
@calendar-popup-height | 80% | - |
@calendar-header-box-shadow | 0 2px 10px rgba(125, 126, 128, 0.16) | - |
@calendar-header-title-height | 44px | - |
@calendar-header-title-font-size | @font-size-lg | - |
@calendar-header-subtitle-font-size | @font-size-md | - |
@calendar-weekdays-height | 30px | - |
@calendar-weekdays-font-size | @font-size-sm | - |
@calendar-month-title-font-size | @font-size-md | - |
@calendar-month-mark-color | fade(@gray-2, 80%) | - |
@calendar-month-mark-font-size | 160px | - |
@calendar-day-height | 64px | - |
@calendar-day-font-size | @font-size-lg | - |
@calendar-range-edge-color | @white | - |
@calendar-range-edge-background-color | @red | - |
@calendar-range-middle-color | @red | - |
@calendar-range-middle-background-opacity | 0.1 | - |
@calendar-selected-day-size | 54px | - |
@calendar-selected-day-color | @white | - |
@calendar-info-font-size | @font-size-xs | - |
@calendar-info-line-height | @line-height-xs | - |
@calendar-selected-day-background-color | @red | - |
@calendar-day-disabled-color | @gray-5 | - |
@calendar-confirm-button-height | 36px | - |
@calendar-confirm-button-margin | 7px 0 | - |
如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')。
对此问题的详细解释:stackoverflow。
在页面中间弹出黑色半透明提示,用于消息通知、加载提示、操作结果提示等场景。
import Vue from 'vue';import { Toast } from 'vant';Vue.use(Toast);
Toast('提示内容');
使用 Toast.loading 方法展示加载提示,通过 forbidClick 属性可以禁用背景点击。
Toast.loading({ message: '加载中...', forbidClick: true,});
使用 Toast.success 方法展示成功提示,使用 Toast.fail 方法展示失败提示。
Toast.success('成功文案');Toast.fail('失败文案');
通过 icon 选项可以自定义图标,支持传入图标名称或图片链接,通过loadingType 属性可以自定义加载图标类型。
Toast({ message: '自定义图标', icon: 'like-o',});Toast({ message: '自定义图片', icon: 'https://img01.yzcdn.cn/vant/logo.png',});// 自定义加载图标Toast.loading({ message: '加载中...', forbidClick: true, loadingType: 'spinner',});
Toast 默认渲染在屏幕正中位置,通过 position 属性可以控制 Toast 展示的位置。
Toast({ message: '顶部展示', position: 'top',});Toast({ message: '底部展示', position: 'bottom',});
执行 Toast 方法时会返回对应的 Toast 实例,通过修改实例上的 message 属性可以实现动态更新提示的效果。
const toast = Toast.loading({ duration: 0, // 持续展示 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 设置为背景不可点击Toast.setDefaultOptions('loading', { forbidClick: true });// 重置所有 Toast 的默认配置Toast.resetDefaultOptions();// 重置 loading Toast 的默认配置Toast.resetDefaultOptions('loading');
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Toast | 展示提示 | options | message | toast 实例 |
Toast.loading | 展示加载提示 | options | message | toast 实例 |
Toast.success | 展示成功提示 | options | message | toast 实例 |
Toast.fail | 展示失败提示 | options | message | toast 实例 |
Toast.clear | 关闭提示 | clearAll: boolean | void |
Toast.allowMultiple | 允许同时存在多个 Toast | - | void |
Toast.setDefaultOptions | 修改默认配置,对所有 Toast 生效。 传入 type 可以修改指定类型的默认配置 | type | options | void |
Toast.resetDefaultOptions | 重置默认配置,对所有 Toast 生效。 传入 type 可以重置指定类型的默认配置 | type | void |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 提示类型,可选值为 loading success fail html | string | text |
position | 位置,可选值为 top bottom | string | middle |
message | 文本内容,支持通过
换行 | string | '' |
icon | 自定义图标,支持传入图标名称或图片链接 | string | - |
iconPrefix | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
overlay | 是否显示背景遮罩层 | boolean | false |
forbidClick | 是否禁止背景点击 | boolean | false |
closeOnClick | 是否在点击后关闭 | boolean | false |
closeOnClickOverlay | 是否在点击遮罩层后关闭 | boolean | false |
loadingType | 加载图标类型, 可选值为 spinner | string | circular |
duration | 展示时长(ms),值为 0 时,toast 不会消失 | number | 2000 |
className | 自定义类名 | any | - |
onOpened | 完全展示后的回调函数 | Function | - |
onClose | 关闭时的回调函数 | Function | - |
transition | 动画类名,等价于 transition 的name 属性 | string | van-fade |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | body |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@toast-max-width | 70% | - |
@toast-font-size | @font-size-md | - |
@toast-text-color | @white | - |
@toast-loading-icon-color | @white | - |
@toast-line-height | @line-height-md | - |
@toast-border-radius | @border-radius-lg | - |
@toast-background-color | fade(@black, 70%) | - |
@toast-icon-size | 36px | - |
@toast-text-min-width | 96px | - |
@toast-text-padding | @padding-xs @padding-sm | - |
@toast-default-padding | @padding-md | - |
@toast-default-width | 88px | - |
@toast-default-min-height | 88px | - |
@toast-position-top-distance | 20% | - |
@toast-position-bottom-distance | 20% | - |
Vant 中默认包含了一些常用样式,可以直接通过 className 的方式使用。
当文本内容长度超过容器最大宽度时,自动省略多余的文本。
<!-- 最多显示一行 --><div class="van-ellipsis">这是一段最多显示一行的文字,多余的内容会被省略</div><!-- 最多显示两行 --><div class="van-multi-ellipsis--l2"> 这是一段最多显示两行的文字,多余的内容会被省略</div><!-- 最多显示三行 --><div class="van-multi-ellipsis--l3"> 这是一段最多显示三行的文字,多余的内容会被省略</div>
为元素添加 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>
弹出层容器,用于展示弹窗、信息提示等内容,支持多个弹出层叠加展示。
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: '30%' }" />
设置 closeable 属性后,会在弹出层的右上角显示关闭图标,并且可以通过 close-icon 属性自定义图标,使用 close-icon-position 属性可以自定义图标位置。
<van-popup v-model="show" closeable position="bottom" :style="{ height: '30%' }"/><!-- 自定义图标 --><van-popup v-model="show" closeable close-icon="close" position="bottom" :style="{ height: '30%' }"/><!-- 图标位置 --><van-popup v-model="show" closeable close-icon-position="top-left" position="bottom" :style="{ height: '30%' }"/>
设置 round 属性后,弹窗会根据弹出位置添加不同的圆角样式。
<van-popup v-model="show" round position="bottom" :style="{ height: '30%' }" />
弹出层默认挂载到组件所在位置,可以通过 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 属性的组件不能为根节点
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 是否显示弹出层 | boolean | false |
overlay | 是否显示遮罩层 | boolean | true |
position | 弹出位置,可选值为 top bottom right left | string | center |
overlay-class | 自定义遮罩层类名 | string | - |
overlay-style | 自定义遮罩层样式 | object | - |
duration | 动画时长,单位秒 | number | string | 0.3 |
round | 是否显示圆角 | boolean | false |
lock-scroll | 是否锁定背景滚动 | boolean | true |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
close-on-popstate | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
closeable | 是否显示关闭图标 | boolean | false |
close-icon | 关闭图标名称或图片链接 | string | cross |
close-icon-position | 关闭图标位置,可选值为top-left bottom-left bottom-right | string | top-right |
transition | 动画类名,等价于 transition 的name 属性 | string | - |
transition-appear v2.10.14 | 是否在初始渲染时启用过渡动画 | boolean | false |
get-container | 指定挂载的节点 | string | () => Element | - |
safe-area-inset-bottom | 是否开启底部安全区适配 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击弹出层时触发 | event: Event |
click-overlay | 点击遮罩层时触发 | - |
click-close-icon v2.11.0 | 点击关闭图标时触发 | event: Event |
open | 打开弹出层时触发 | - |
close | 关闭弹出层时触发 | - |
opened | 打开弹出层且动画结束后触发 | - |
closed | 关闭弹出层且动画结束后触发 | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@popup-background-color | @white | - |
@popup-transition | transform @animation-duration-base | - |
@popup-round-border-radius | 16px | - |
@popup-close-icon-size | 22px | - |
@popup-close-icon-color | @gray-5 | - |
@popup-close-icon-active-color | @gray-6 | - |
@popup-close-icon-margin | 16px | - |
@popup-close-icon-z-index | 1 | - |
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>
将 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 布局方式,可选值为flex | string | - |
gutter | 列元素之间的间距(单位为 px) | number | string | - |
tag | 自定义元素标签 | string | div |
justify | Flex 主轴对齐方式,可选值为 end center space-around space-between | string | start |
align | Flex 交叉轴对齐方式,可选值为 center bottom | string | top |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
span | 列元素宽度 | number | string | - |
offset | 列元素偏移距离 | number | string | - |
tag | 自定义元素标签 | string | div |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
增强版的 img 标签,提供多种图片填充模式,支持图片懒加载、加载中提示、加载失败提示。
import Vue from 'vue';import { Image as VanImage } from 'vant';Vue.use(VanImage);
基础用法与原生 img
标签一致,可以设置 src
、width
、height
、alt
等原生属性。
<van-image width="100" height="100" src="https://img01.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://img01.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://img01.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://img01.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://img01.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://img01.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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
src | 图片链接 | string | - |
fit | 图片填充模式 | string | fill |
alt | 替代文本 | string | - |
width | 宽度,默认单位为px | number | string | - |
height | 高度,默认单位为px | number | string | - |
radius | 圆角大小,默认单位为px | number | string | 0 |
round | 是否显示为圆形 | boolean | false |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
show-error | 是否展示图片加载失败提示 | boolean | true |
show-loading | 是否展示图片加载中提示 | boolean | true |
error-icon | 失败时提示的图标名称或图片链接 | string | photo-fail |
loading-icon | 加载时提示的图标名称或图片链接 | string | photo |
icon-prefix v2.10.12 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
名称 | 含义 |
---|---|
contain | 保持宽高缩放图片,使图片的长边能完全显示出来 |
cover | 保持宽高缩放图片,使图片的短边能完全显示出来,裁剪长边 |
fill | 拉伸图片,使图片填满元素 |
none | 保持图片原有尺寸 |
scale-down | 取none 或contain 中较小的一个 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击图片时触发 | event: Event |
load | 图片加载完毕时触发 | - |
error | 图片加载失败时触发 | - |
名称 | 说明 |
---|---|
default v2.9.0 | 自定义图片下方的内容 |
loading | 自定义加载中的提示内容 |
error | 自定义加载失败时的提示内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@image-placeholder-text-color | @gray-6 | - |
@image-placeholder-font-size | @font-size-md | - |
@image-placeholder-background-color | @background-color | - |
@image-loading-icon-size | 32px | - |
@image-loading-icon-color | @gray-4 | - |
@image-error-icon-size | 32px | - |
@image-error-icon-color | @gray-4 | - |
在 .vue 文件中通过相对路径引用本地图片时,需要在图片的链接外包上一层 require()
,将图片 URL 转换为 webpack 模块请求,并结合 file-loader 或者 url-loader 进行处理。
<!-- 错误写法 --><van-image src="./image.png" /><!-- 正确写法 --><van-image :src="require('./image.png')" />
对此更详细的解释可以参考 vue-loader 的处理资源路径章节。
使用 Image 组件时,可能会遇到将 <image> 作为标签名时无法渲染的问题,比如下面的写法:
<template> <image src="xxx" /></template><script>import { Image } from 'vant';export default { components: { Image, },};<script>
这是因为 <image> 标签是原生的 SVG 标签,Vue 不允许将原生标签名注册为组件名,使用 <van-image> 即可规避这个问题。
基于字体的图标集,可以通过 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
属性后,会在图标右上角展示一个小红点;设置 badge
属性后,会在图标右上角展示相应的徽标。
<van-icon name="chat-o" dot /><van-icon name="chat-o" badge="9" /><van-icon name="chat-o" badge="99+" />
Icon
的 color
属性用来设置图标的颜色。
<van-icon name="cart-o" color="#1989fa" /><van-icon name="fire-o" color="#ee0a24" />
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';
Tips: 从 2.10.13 版本开始,Vant 会默认使用 woff2 格式的本地字体文件,只有在不支持 woff2 字体的低端浏览器上才会加载 CDN 的网络图标。
如果需要在现有 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" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 图标名称或图片链接 | string | - |
dot | 是否显示图标右上角小红点 | boolean | false |
badge v2.5.6 | 图标右上角徽标的内容 | number | string | - |
info | 图标右上角徽标的内容(已废弃,请使用 badge 属性) | number | string | - |
color | 图标颜色 | string | inherit |
size | 图标大小,如 20px 2em ,默认单位为px | number | string | inherit |
class-prefix | 类名前缀,用于使用自定义图标 | string | van-icon |
tag | HTML 标签 | string | i |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击图标时触发 | event: Event |
单元格为列表中的单个展示项。
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>
通过 CellGroup 的 inset 属性,可以将单元格转换为圆角卡片风格(从 2.12.25 版本开始支持)。
<van-cell-group inset> <van-cell title="单元格" value="内容" /> <van-cell title="单元格" value="内容" label="描述信息" /></van-cell-group>
通过 size 属性可以控制单元格的大小。
<van-cell title="单元格" value="内容" size="large" /><van-cell title="单元格" value="内容" size="large" label="描述信息" />
通过 icon 属性在标题左侧展示图标。
<van-cell title="单元格" icon="location-o" />
只设置 value 时,内容会靠左对齐。
<van-cell value="内容" />
设置 is-link 属性后会在单元格右侧显示箭头,并且可以通过 arrow-direction 属性控制箭头方向。
<van-cell title="单元格" is-link /><van-cell title="单元格" is-link value="内容" /><van-cell title="单元格" is-link arrow-direction="down" value="内容" />
可以通过 url 属性进行 URL 跳转,或通过 to 属性进行路由跳转。
<van-cell title="URL 跳转" is-link url="/vant/mobile.html" /><van-cell title="路由跳转" is-link to="index" />
通过 CellGroup 的 title 属性可以指定分组标题。
<van-cell-group title="分组1"> <van-cell title="单元格" value="内容" /></van-cell-group><van-cell-group title="分组2"> <van-cell title="单元格" value="内容" /></van-cell-group>
如以上用法不能满足你的需求,可以使用插槽来自定义内容。
<van-cell value="内容" is-link> <!-- 使用 title 插槽来自定义标题 --> <template #title> <span class="custom-title">单元格</span> <van-tag type="danger">标签</van-tag> </template></van-cell><van-cell title="单元格" icon="shop-o"> <!-- 使用 right-icon 插槽来自定义右侧图标 --> <template #right-icon> <van-icon name="search" class="search-icon" /> </template></van-cell><style> .custom-title { margin-right: 4px; vertical-align: middle; } .search-icon { font-size: 16px; line-height: inherit; }</style>
通过 center 属性可以让 Cell 的左右内容都垂直居中。
<van-cell center title="单元格" value="内容" label="描述信息" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 分组标题 | string | - |
border | 是否显示外边框 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 左侧标题 | number | string | - |
value | 右侧内容 | number | string | - |
label | 标题下方的描述信息 | string | - |
size | 单元格大小,可选值为 large | string | - |
icon | 左侧图标名称或图片链接 | string | - |
icon-prefix v2.5.3 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
border | 是否显示内边框 | boolean | true |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
clickable | 是否开启点击反馈 | boolean | null |
is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false |
required | 是否显示表单必填星号 | boolean | false |
center | 是否使内容垂直居中 | boolean | false |
arrow-direction | 箭头方向,可选值为 left up down | string | right |
title-style | 左侧标题额外样式 | any | - |
title-class | 左侧标题额外类名 | any | - |
value-class | 右侧内容额外类名 | any | - |
label-class | 描述信息额外类名 | any | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击单元格时触发 | event: Event |
名称 | 说明 |
---|---|
default | 默认插槽 |
title | 自定义分组标题 |
名称 | 说明 |
---|---|
default | 自定义右侧 value 的内容 |
title | 自定义左侧 title 的内容 |
label | 自定义标题下方 label 的内容 |
icon | 自定义左侧图标 |
right-icon | 自定义右侧按钮,默认为arrow |
extra | 自定义单元格最右侧的额外内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@cell-font-size | @font-size-md | - |
@cell-line-height | 24px | - |
@cell-vertical-padding | 10px | - |
@cell-horizontal-padding | @padding-md | - |
@cell-text-color | @text-color | - |
@cell-background-color | @white | - |
@cell-border-color | @border-color | - |
@cell-active-color | @active-color | - |
@cell-required-color | @red | - |
@cell-label-color | @gray-6 | - |
@cell-label-font-size | @font-size-sm | - |
@cell-label-line-height | @line-height-sm | - |
@cell-label-margin-top | @padding-base | - |
@cell-value-color | @gray-6 | - |
@cell-icon-size | 16px | - |
@cell-right-icon-color | @gray-6 | - |
@cell-large-vertical-padding | @padding-sm | - |
@cell-large-title-font-size | @font-size-lg | - |
@cell-large-label-font-size | @font-size-md | - |
@cell-group-background-color | @white | - |
@cell-group-title-color | @gray-6 | - |
@cell-group-title-padding | @padding-md @padding-md @padding-xs | - |
@cell-group-title-font-size | @font-size-md | - |
@cell-group-title-line-height | 16px | - |
图片放大预览,支持函数调用和组件调用两种方式。
ImagePreview 是一个函数,调用函数后会直接在页面中展示图片预览界面。
import { ImagePreview } from 'vant';ImagePreview(['https://img01.yzcdn.cn/vant/apple-1.jpg']);
通过组件调用 ImagePreview 时,可以通过下面的方式进行注册。
import Vue from 'vue';import { ImagePreview } from 'vant';// 全局注册Vue.use(ImagePreview);// 局部注册export default { components: { [ImagePreview.Component.name]: ImagePreview.Component, },};
直接传入图片数组,即可展示图片预览。
ImagePreview([ 'https://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg',]);
ImagePreview 支持传入配置对象,并通过 startPosition
选项指定图片的初始位置(索引值)。
ImagePreview({ images: [ 'https://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg', ], startPosition: 1,});
设置 closeable
属性后,会在弹出层的右上角显示关闭图标,并且可以通过 close-icon
属性自定义图标,使用close-icon-position
属性可以自定义图标位置。
ImagePreview({ images: [ 'https://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg', ], closeable: true,});
通过 onClose
选项监听图片预览的关闭事件。
import { Toast } from 'vant';ImagePreview({ images: [ 'https://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg', ], onClose() { Toast('关闭'); },});
通过 asyncClose
属性可以开启异步关闭,开启后异步关闭后,只能通过实例上的 close 方法关闭图片预览。
const instance = ImagePreview({ images: [ 'https://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg', ], asyncClose: true,});setTimeout(() => { instance.close();}, 2000);
如果需要在图片预览内嵌入组件或其他自定义内容,可以使用组件调用的方式,调用前需要通过 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://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg', ], }; }, methods: { onChange(index) { this.index = index; }, },};
通过函数调用 ImagePreview
时,支持传入以下选项:
参数名 | 说明 | 类型 | 默认值 |
---|---|---|---|
images | 需要预览的图片 URL 数组 | string[] | [] |
startPosition | 图片预览起始位置索引 | number | string | 0 |
swipeDuration | 动画时长,单位为ms | number | string | 300 |
showIndex | 是否显示页码 | boolean | true |
showIndicators | 是否显示轮播指示器 | boolean | false |
loop | 是否开启循环播放 | boolean | true |
onClose | 关闭时的回调函数 | Function | - |
onChange | 切换图片时的回调函数,回调参数为当前索引 | Function | - |
onScale | 缩放图片时的回调函数,回调参数为当前索引和当前缩放值组成的对象 | Function | - |
asyncClose | 是否开启异步关闭 | boolean | false |
closeOnPopstate | 是否在页面回退时自动关闭 | boolean | true |
className | 自定义类名 | any | - |
maxZoom | 手势缩放时,最大缩放比例 | number | string | 3 |
minZoom | 手势缩放时,最小缩放比例 | number | string | 1/3 |
closeable v2.5.0 | 是否显示关闭图标 | boolean | false |
closeIcon v2.5.0 | 关闭图标名称或图片链接 | string | clear |
closeIconPosition v2.5.0 | 关闭图标位置,可选值为top-left bottom-left bottom-right | string | top-right |
transition v2.12.8 | 动画类名,等价于 transition 的 name 属性 | string | van-fade |
overlayStyle v2.12.37 | 自定义遮罩层样式 | object | - |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | - |
通过组件调用 ImagePreview
时,支持以下 Props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
images | 需要预览的图片 URL 数组 | string[] | [] |
start-position | 图片预览起始位置索引 | number | string | 0 |
swipe-duration | 动画时长,单位为 ms | number | string | 300 |
show-index | 是否显示页码 | boolean | true |
show-indicators | 是否显示轮播指示器 | boolean | false |
loop | 是否开启循环播放 | boolean | true |
async-close | 是否开启异步关闭 | boolean | false |
close-on-popstate | 是否在页面回退时自动关闭 | boolean | true |
class-name | 自定义类名 | any | - |
max-zoom | 手势缩放时,最大缩放比例 | number | string | 3 |
min-zoom | 手势缩放时,最小缩放比例 | number | string | 1/3 |
closeable v2.5.0 | 是否显示关闭图标 | boolean | false |
close-icon v2.5.0 | 关闭图标名称或图片链接 | string | clear |
close-icon-position v2.5.0 | 关闭图标位置,可选值为top-left bottom-left bottom-right | string | top-right |
transition v2.12.8 | 动画类名,等价于 transition 的 name 属性 | string | van-fade |
overlay-style v2.12.37 | 自定义遮罩层样式 | object | - |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
通过组件调用 ImagePreview
时,支持以下事件:
事件 | 说明 | 回调参数 |
---|---|---|
close | 关闭时触发 | { index: 索引, url: 图片链接 } |
closed v2.5.6 | 关闭且且动画结束后触发 | - |
change | 切换当前图片时触发 | index: 当前图片的索引 |
scale v2.5.0 | 缩放当前图片时触发 | { index: 当前图片的索引, scale: 当前缩放的值 } |
通过组件调用 ImagePreview
时,通过 ref 可以获取到 ImagePreview 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
swipeTo 2.9.0 | 切换到指定位置 | index: number, options: Options | - |
通过组件调用 ImagePreview
时,支持以下插槽:
名称 | 说明 | 参数 |
---|---|---|
index | 自定义页码内容 | { index: 当前图片的索引 } |
cover | 自定义覆盖在图片预览上方的内容 | - |
参数名 | 说明 | 类型 |
---|---|---|
url | 当前图片 URL | string |
index | 当前图片的索引值 | number |
参数名 | 说明 | 类型 |
---|---|---|
index | 当前图片的索引值 | number |
scale | 当前图片的缩放值 | number |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@image-preview-index-text-color | @white | - |
@image-preview-index-font-size | @font-size-md | - |
@image-preview-index-line-height | @line-height-md | - |
@image-preview-index-text-shadow | 0 1px 1px @gray-8 | - |
@image-preview-overlay-background-color | rgba(0, 0, 0, 0.9) | - |
@image-preview-close-icon-size | 22px | - |
@image-preview-close-icon-color | @gray-5 | - |
@image-preview-close-icon-active-color | @gray-6 | - |
@image-preview-close-icon-margin | @padding-md | - |
@image-preview-close-icon-z-index | 1 | - |
参见桌面端适配。
空状态时的占位提示,2.6 版本开始支持此组件。
import Vue from 'vue';import { Empty } from 'vant';Vue.use(Empty);
<van-empty description="描述文字" />
Empty 组件内置了多种占位图片类型,可以在不同业务场景下使用。
<!-- 通用错误 --><van-empty image="error" description="描述文字" /><!-- 网络错误 --><van-empty image="network" description="描述文字" /><!-- 搜索提示 --><van-empty image="search" description="描述文字" />
需要自定义图片时,可以在 image 属性中传入任意图片 URL。
<van-empty class="custom-image" image="https://img01.yzcdn.cn/vant/custom-empty-image.png" description="描述文字"/><style> .custom-image .van-empty__image { width: 90px; height: 90px; }</style>
通过默认插槽可以在 Empty 组件的下方插入内容。
<van-empty description="描述文字"> <van-button round type="danger" class="bottom-button">按钮</van-button></van-empty><style> .bottom-button { width: 160px; height: 40px; }</style>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
image | 图片类型,可选值为 error network search ,支持传入图片 URL | string | default |
image-size v2.10.11 | 图片大小,默认单位为 px | number | string | - |
description | 图片下方的描述文字 | string | - |
名称 | 说明 |
---|---|
default | 自定义底部内容 |
image | 自定义图标 |
description | 自定义描述文字 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@empty-padding | @padding-xl 0 | - |
@empty-image-size | 160px | - |
@empty-description-margin-top | @padding-md | - |
@empty-description-padding | 0 60px | - |
@empty-description-color | @gray-6 | - |
@empty-description-font-size | @font-size-md | - |
@empty-description-line-height | @line-height-md | - |
@empty-bottom-margin-top | 24px | - |
用于将内容分隔为多个区域。
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
dashed | 是否使用虚线 | boolean | false |
hairline | 是否使用 0.5px 线 | boolean | true |
content-position | 内容位置,可选值为left right | string | center |
名称 | 说明 |
---|---|
default | 内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@divider-margin | @padding-md 0 | - |
@divider-text-color | @gray-6 | - |
@divider-font-size | @font-size-md | - |
@divider-line-height | 24px | - |
@divider-border-color | @border-color | - |
@divider-content-padding | @padding-md | - |
@divider-content-left-width | 10% | - |
@divider-content-right-width | 10% | - |
用于实时展示倒计时数值,支持毫秒精度。
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 #default="timeData"> <span class="block">{{ timeData.hours }}</span> <span class="colon">:</span> <span class="block">{{ timeData.minutes }}</span> <span class="colon">:</span> <span class="block">{{ timeData.seconds }}</span> </template></van-count-down><style> .colon { display: inline-block; margin: 0 4px; color: #ee0a24; } .block { display: inline-block; width: 22px; color: #fff; font-size: 12px; text-align: center; background-color: #ee0a24; }</style>
通过 ref 获取到组件实例后,可以调用 start
、pause
、reset
方法。
<van-count-down ref="countDown" millisecond :time="3000" :auto-start="false" format="ss:SSS" @finish="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('倒计时结束'); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
time | 倒计时时长,单位毫秒 | number | string | 0 |
format | 时间格式 | string | HH:mm:ss |
auto-start | 是否自动开始倒计时 | boolean | true |
millisecond | 是否开启毫秒级渲染 | boolean | false |
格式 | 说明 |
---|---|
DD | 天数 |
HH | 小时 |
mm | 分钟 |
ss | 秒数 |
S | 毫秒(1 位) |
SS | 毫秒(2 位) |
SSS | 毫秒(3 位) |
事件名 | 说明 | 回调参数 |
---|---|---|
finish | 倒计时结束时触发 | - |
change | 倒计时变化时触发 | timeData: TimeData |
名称 | 说明 | 参数 |
---|---|---|
default | 自定义内容 | timeData: TimeData |
名称 | 说明 | 类型 |
---|---|---|
days | 剩余天数 | number |
hours | 剩余小时 | number |
minutes | 剩余分钟 | number |
seconds | 剩余秒数 | number |
milliseconds | 剩余毫秒 | number |
通过 ref 可以获取到 CountDown 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
start | 开始倒计时 | - | - |
pause | 暂停倒计时 | - | - |
reset | 重设倒计时,若 auto-start 为 true ,重设后会自动开始倒计时 | - | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@count-down-text-color | @text-color | - |
@count-down-font-size | @font-size-md | - |
@count-down-line-height | @line-height-md | - |
如果你遇到了在 iOS 上倒计时不生效的问题,请确认在创建 Date 对象时没有使用new Date('2020-01-01')
这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是new Date('2020/01/01')
。
对此问题的详细解释:stackoverflow。
将一组内容放置在多个折叠面板中,点击面板的标题可以展开或收缩其内容。
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">内容</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', }; },};
通过 disabled
属性来禁用单个面板。
<van-collapse v-model="activeNames"> <van-collapse-item title="标题1" name="1">内容</van-collapse-item> <van-collapse-item title="标题2" name="2" disabled>内容</van-collapse-item> <van-collapse-item title="标题3" name="3" disabled>内容</van-collapse-item></van-collapse>
通过 title
插槽可以自定义标题栏的内容。
<van-collapse v-model="activeNames"> <van-collapse-item name="1"> <template #title> <div>标题1 <van-icon name="question-o" /></div> </template> 内容 </van-collapse-item> <van-collapse-item title="标题2" name="2" icon="shop-o"> 内容 </van-collapse-item></van-collapse>
export default { data() { return { activeNames: ['1'], }; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前展开面板的 name | 手风琴模式:number | string 非手风琴模式:(number | string)[] | - |
accordion | 是否开启手风琴模式 | boolean | false |
border | 是否显示外边框 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换面板时触发 | activeNames: 类型与 v-model 绑定的值一致 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 唯一标识符,默认为索引值 | number | string | index |
icon | 标题栏左侧图标名称或图片链接 | string | - |
size | 标题栏大小,可选值为 large | string | - |
title | 标题栏左侧内容 | number | string | - |
value | 标题栏右侧内容 | number | string | - |
label | 标题栏描述信息 | number | string | - |
border | 是否显示内边框 | boolean | true |
is-link | 是否展示标题栏右侧箭头并开启点击反馈 | boolean | true |
disabled | 是否禁用面板 | boolean | false |
lazy-render v2.12.43 | 是否在首次展开时才渲染面板内容 | boolean | true |
title-class | 左侧标题额外类名 | string | - |
value-class | 右侧内容额外类名 | string | - |
label-class | 描述信息额外类名 | string | - |
名称 | 说明 |
---|---|
default | 面板内容 |
value | 自定义显示内容 |
icon | 自定义 icon |
title | 自定义 title |
right-icon | 自定义右侧按钮,默认是 arrow |
通过 ref 可以获取到 CollapseItem 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggle v2.10.9 | 切换面试展开状态,传 true 为展开,false 为收起,不传参为切换 | expand?: boolean | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@collapse-item-transition-duration | @animation-duration-base | - |
@collapse-item-content-padding | @padding-sm @padding-md | - |
@collapse-item-content-font-size | @font-size-md | - |
@collapse-item-content-line-height | 1.5 | - |
@collapse-item-content-text-color | @gray-6 | - |
@collapse-item-content-background-color | @white | - |
@collapse-item-title-disabled-color | @gray-5 | - |
圆环形的进度条组件,支持进度渐变动画。
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="大小定制" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前进度 | number | - |
rate | 目标进度 | number | string | 100 |
size | 圆环直径,默认单位为 px | number | string | 100px |
color | 进度条颜色,传入对象格式可以定义渐变色 | string | object | #1989fa |
layer-color | 轨道颜色 | string | white |
fill | 填充颜色 | string | none |
speed | 动画速度(单位为 rate/s) | number | string | 0 |
text | 文字 | string | - |
stroke-width | 进度条宽度 | number | string | 40 |
stroke-linecap | 进度条端点的形状,可选值为square butt | string | round |
clockwise | 是否顺时针增加 | boolean | true |
名称 | 说明 |
---|---|
default | 自定义文字内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@circle-size | 100px | - |
@circle-color | @blue | - |
@circle-layer-color | @white | - |
@circle-text-color | @text-color | - |
@circle-text-font-weight | @font-weight-bold | - |
@circle-text-font-size | @font-size-md | - |
@circle-text-line-height | @line-height-md | - |
在右上角展示徽标数字或小红点。
import Vue from 'vue';import { Badge } from 'vant';Vue.use(Badge);
设置 content
属性后,Badge 会在子元素的右上角显示对应的徽标,也可以通过 dot
来显示小红点。
<van-badge :content="5"> <div class="child" /></van-badge><van-badge :content="10"> <div class="child" /></van-badge><van-badge content="Hot"> <div class="child" /></van-badge><van-badge dot> <div class="child" /></van-badge><style> .child { width: 40px; height: 40px; background: #f2f3f5; border-radius: 4px; }</style>
设置 max
属性后,当 content
的数值超过最大值时,会自动显示为 {max}+
。
<van-badge :content="20" max="9"> <div class="child" /></van-badge><van-badge :content="50" max="20"> <div class="child" /></van-badge><van-badge :content="200" max="99"> <div class="child" /></van-badge>
通过 color
属性来设置徽标的颜色。
<van-badge :content="5" color="#1989fa"> <div class="child" /></van-badge><van-badge :content="10" color="#1989fa"> <div class="child" /></van-badge><van-badge dot color="#1989fa"> <div class="child" /></van-badge>
通过 content
插槽可以自定义徽标的内容,比如插入一个图标。
<van-badge> <div class="child" /> <template #content> <van-icon name="success" class="badge-icon" /> </template></van-badge><van-badge> <div class="child" /> <template #content> <van-icon name="cross" class="badge-icon" /> </template></van-badge><van-badge> <div class="child" /> <template #content> <van-icon name="down" class="badge-icon" /> </template></van-badge>
.badge-icon { display: block; font-size: 10px; line-height: 16px;}
当 Badge 没有子元素时,会作为一个独立的元素进行展示。
<van-badge :content="20" /><van-badge :content="200" max="99" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
content | 徽标内容 | number | string | - |
color | 徽标背景颜色 | string | #ee0a24 |
dot | 是否展示为小红点 | boolean | false |
max | 最大值,超过最大值会显示 {max}+ ,仅当 content 为数字时有效 | number | string | - |
名称 | 说明 |
---|---|
default | 徽标包裹的子元素 |
content | 自定义徽标内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@badge-size | 16px | - |
@badge-color | @white | - |
@badge-padding | 0 3px | - |
@badge-font-size | @font-size-sm | - |
@badge-font-weight | @font-weight-bold | - |
@badge-border-width | @border-width-base | - |
@badge-background-color | @red | - |
@badge-dot-color | @red | - |
@badge-dot-size | 8px | - |
@badge-font-family | -apple-system-font, Helvetica Neue, Arial, sans-serif | - |
可以左右滑动来展示操作按钮的单元格组件。
import Vue from 'vue';import { SwipeCell } from 'vant';Vue.use(SwipeCell);
SwipeCell
组件提供了 left
和 right
两个插槽,用于定义两侧滑动区域的内容。
<van-swipe-cell> <template #left> <van-button square type="primary" text="选择" /> </template> <van-cell :border="false" title="单元格" value="内容" /> <template #right> <van-button square type="danger" text="删除" /> <van-button square type="primary" text="收藏" /> </template></van-swipe-cell>
SwipeCell
可以嵌套任意内容,比如嵌套一个商品卡片。
<van-swipe-cell> <van-card num="2" price="2.00" desc="描述信息" title="商品标题" class="goods-card" thumb="https://img01.yzcdn.cn/vant/cat.jpeg" /> <template #right> <van-button square text="删除" type="danger" class="delete-button" /> </template></van-swipe-cell><style> .goods-card { margin: 0; background-color: @white; } .delete-button { height: 100%; }</style>
通过传入 before-close
回调函数,可以自定义两侧滑动内容关闭时的行为。
<van-swipe-cell :before-close="beforeClose"> <template #left> <van-button square type="primary" text="选择" /> </template> <van-cell :border="false" title="单元格" value="内容" /> <template #right> <van-button square type="danger" text="删除" /> </template></van-swipe-cell>
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; } }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标识符,可以在事件参数中获取到 | number | string | - |
left-width | 指定左侧滑动区域宽度,单位为px | number | string | auto |
right-width | 指定右侧滑动区域宽度,单位为px | number | string | auto |
before-close | 关闭前的回调函数 | Function | - |
disabled | 是否禁用滑动 | boolean | false |
stop-propagation | 是否阻止滑动事件冒泡 | boolean | false |
名称 | 说明 |
---|---|
default | 自定义显示内容 |
left | 左侧滑动内容 |
right | 右侧滑动内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | 关闭时的点击位置 (left right cell outside ) |
open | 打开时触发 | { position: 'left' | 'right' , name: string } |
close | 关闭时触发 | { position: string , name: string } |
beforeClose 的第一个参数为对象,对象中包含以下属性:
参数名 | 说明 | 类型 |
---|---|---|
name | 标识符 | string |
position | 关闭时的点击位置 (left right cell outside ) | string |
instance | SwipeCell 实例,用于调用实例方法 | SwipeCell |
通过 ref 可以获取到 SwipeCell 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
open | 打开单元格侧边栏 | position: left | right | - |
close | 收起单元格侧边栏 | - | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@switch-cell-padding-top | @cell-vertical-padding - 1px | - |
@switch-cell-padding-bottom | @cell-vertical-padding - 1px | - |
@switch-cell-large-padding-top | @cell-large-vertical-padding - 1px | - |
@switch-cell-large-padding-bottom | @cell-large-vertical-padding - 1px | - |
参见桌面端适配。
用于提供下拉刷新的交互操作。
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 实现一个缩放效果 --> <template #pulling="props"> <img class="doge" src="https://img01.yzcdn.cn/vant/doge.png" rel="external nofollow" rel="external nofollow" :style="{ transform: `scale(${props.distance / 80})` }" /> </template> <!-- 释放提示 --> <template #loosing> <img class="doge" src="https://img01.yzcdn.cn/vant/doge.png" rel="external nofollow" rel="external nofollow" /> </template> <!-- 加载提示 --> <template #loading> <img class="doge" src="https://img01.yzcdn.cn/vant/doge-fire.jpg" rel="external nofollow" /> </template> <p>刷新次数: {{ count }}</p></van-pull-refresh><style> .doge { width: 140px; height: 72px; margin-top: 8px; border-radius: 4px; }</style>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否处于加载中状态 | boolean | - |
pulling-text | 下拉过程提示文案 | string | 下拉即可刷新... |
loosing-text | 释放过程提示文案 | string | 释放即可刷新... |
loading-text | 加载过程提示文案 | string | 加载中... |
success-text | 刷新成功提示文案 | string | - |
success-duration | 刷新成功提示展示时长(ms) | number | string | 500 |
animation-duration | 动画时长 | number | string | 300 |
head-height | 顶部内容高度 | number | string | 50 |
pull-distance v2.12.8 | 触发下拉刷新的距离 | number | string | 与 head-height 一致 |
disabled | 是否禁用下拉刷新 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
refresh | 下拉刷新时触发 | - |
名称 | 说明 | 参数 |
---|---|---|
default | 自定义内容 | - |
normal | 非下拉状态时顶部内容 | - |
pulling | 下拉过程中顶部内容 | { distance: 当前下拉距离 } |
loosing | 释放过程中顶部内容 | { distance: 当前下拉距离 } |
loading | 加载过程中顶部内容 | { distance: 当前下拉距离 } |
success | 刷新成功提示内容 | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@pull-refresh-head-height | 50px | - |
@pull-refresh-head-font-size | @font-size-md | - |
@pull-refresh-head-text-color | @gray-6 | - |
默认情况下,下拉区域的高度是和内容高度保持一致的,如果需要让下拉区域始终为全屏,可以给 PullRefresh 设置一个与屏幕大小相等的最小高度:
<van-pull-refresh style="min-height: 100vh;" />
PullRefresh 的触发条件是「父级滚动元素的滚动条在顶部位置」。
window
,则要求 window.pageYOffset === 0
。Element
,则要求 Element.scrollTop === 0
。参见桌面端适配。
创建一个遮罩层,用于强调特定的页面元素,并阻止用户进行其他操作。
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
show | 是否展示遮罩层 | boolean | false |
z-index | z-index 层级 | number | string | 1 |
duration | 动画时长,单位秒 | number | string | 0.3 |
class-name | 自定义类名 | string | - |
custom-style | 自定义样式 | object | - |
lock-scroll v2.6.2 | 是否锁定背景滚动,锁定时蒙层里的内容也将无法滚动 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
名称 | 说明 |
---|---|
default | 默认插槽,用于在遮罩层上方嵌入内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@overlay-z-index | 1 | - |
@overlay-background-color | rgba(0, 0, 0, 0.7) | - |
在页面顶部展示消息提示,支持函数调用和组件调用两种方式。
Notify 是一个函数,调用后会直接在页面中弹出相应的消息提示。
import { Notify } from 'vant';Notify('通知内容');
通过组件调用 Notify 时,可以通过下面的方式进行注册(从 2.8.5 版本开始支持):
import Vue from 'vue';import { Notify } from 'vant';// 全局注册Vue.use(Notify);// 局部注册export default { components: { [Notify.Component.name]: Notify.Component, },};
Notify('通知内容');
支持 primary
、success
、warning
、danger
四种通知类型,默认为 danger
。
// 主要通知Notify({ type: 'primary', message: '通知内容' });// 成功通知Notify({ type: 'success', message: '通知内容' });// 危险通知Notify({ type: 'danger', message: '通知内容' });// 警告通知Notify({ type: 'warning', message: '通知内容' });
自定义消息通知的颜色和展示时长。
Notify({ message: '自定义颜色', color: '#ad0000', background: '#ffe1e1',});Notify({ message: '自定义时长', duration: 1000,});
引入 Notify 组件后,会自动在 Vue 的 prototype 上挂载 $notify
方法,便于在组件内调用。
export default { mounted() { this.$notify('提示文案'); },};
如果需要在 Notify 内嵌入组件或其他自定义内容,可以使用组件调用的方式。
<van-button type="primary" text="组件调用" @click="showNotify" /><van-notify v-model="show" type="success"> <van-icon name="bell" style="margin-right: 4px;" /> <span>通知内容</span></van-notify>
export default { data() { return { show: false, }; }, methods: { showNotify() { this.show = true; setTimeout(() => { this.show = false; }, 2000); }, },};
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Notify | 展示提示 | options | message | notify 实例 |
Notify.clear | 关闭提示 | - | void |
Notify.setDefaultOptions | 修改默认配置,对所有 Notify 生效 | options | void |
Notify.resetDefaultOptions | 重置默认配置,对所有 Notify 生效 | - | void |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为 primary success warning | string | danger |
message | 展示文案,支持通过
换行 | string | - |
duration | 展示时长(ms),值为 0 时,notify 不会消失 | number | string | 3000 |
color | 字体颜色 | string | white |
background | 背景颜色 | string | - |
className | 自定义类名 | any | - |
onClick | 点击时的回调函数 | Function | - |
onOpened | 完全展示后的回调函数 | Function | - |
onClose | 关闭时的回调函数 | Function | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@notify-text-color | @white | - |
@notify-padding | @padding-xs @padding-md | - |
@notify-font-size | @font-size-md | - |
@notify-line-height | @line-height-md | - |
@notify-primary-background-color | @blue | - |
@notify-success-background-color | @green | - |
@notify-danger-background-color | @red | - |
@notify-warning-background-color | @orange | - |
加载图标,用于表示加载中的过渡状态。
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>
通过 color
或者 text-color
属性设置加载文案的颜色。
<!-- 可修改文案和加载图标的颜色 --><van-loading color="#0094ff" /><!-- 只修改文案颜色 --><van-loading text-color="#0094ff" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
color | 颜色 | string | #c9c9c9 |
type | 类型,可选值为 spinner | string | circular |
size | 加载图标大小,默认单位为 px | number | string | 30px |
text-size | 文字大小,默认单位为 px | number | string | 14px |
text-color v2.12.2 | 文字颜色 | string | #c9c9c9 |
vertical | 是否垂直排列图标和文字内容 | boolean | false |
名称 | 说明 |
---|---|
default | 加载文案 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@loading-text-color | @gray-6 | - |
@loading-text-font-size | @font-size-md | - |
@loading-spinner-color | @gray-5 | - |
@loading-spinner-size | 30px | - |
@loading-spinner-animation-duration | 0.8s | - |
向下弹出的菜单列表。
import Vue from 'vue';import { DropdownMenu, DropdownItem } from 'vant';Vue.use(DropdownMenu);Vue.use(DropdownItem);
<van-dropdown-menu> <van-dropdown-item v-model="value1" :options="option1" /> <van-dropdown-item v-model="value2" :options="option2" /></van-dropdown-menu>
export default { data() { return { value1: 0, value2: 'a', option1: [ { text: '全部商品', value: 0 }, { text: '新款商品', value: 1 }, { text: '活动商品', value: 2 }, ], option2: [ { text: '默认排序', value: 'a' }, { text: '好评排序', value: 'b' }, { text: '销量排序', value: 'c' }, ], }; },};
通过插槽可以自定义 DropdownItem
的内容,此时需要使用实例上的 toggle
方法手动控制菜单的显示。
<van-dropdown-menu> <van-dropdown-item v-model="value" :options="option" /> <van-dropdown-item title="筛选" ref="item"> <van-cell center title="包邮"> <template #right-icon> <van-switch v-model="switch1" size="24" active-color="#ee0a24" /> </template> </van-cell> <van-cell center title="团购"> <template #right-icon> <van-switch v-model="switch2" size="24" active-color="#ee0a24" /> </template> </van-cell> <div style="padding: 5px 16px;"> <van-button type="danger" block round @click="onConfirm"> 确认 </van-button> </div> </van-dropdown-item></van-dropdown-menu>
export default { data() { return { value: 0, switch1: false, switch2: false, option: [ { text: '全部商品', value: 0 }, { text: '新款商品', value: 1 }, { text: '活动商品', value: 2 }, ], }; }, methods: { onConfirm() { this.$refs.item.toggle(); }, },};
通过 active-color
属性可以自定义菜单标题和选项的选中态颜色。
<van-dropdown-menu active-color="#1989fa"> <van-dropdown-item v-model="value1" :options="option1" /> <van-dropdown-item v-model="value2" :options="option2" /></van-dropdown-menu>
将 direction
属性值设置为 up
,菜单即可向上展开。
<van-dropdown-menu direction="up"> <van-dropdown-item v-model="value1" :options="option1" /> <van-dropdown-item v-model="value2" :options="option2" /></van-dropdown-menu>
<van-dropdown-menu> <van-dropdown-item v-model="value1" disabled :options="option1" /> <van-dropdown-item v-model="value2" disabled :options="option2" /></van-dropdown-menu>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
active-color | 菜单标题和选项的选中态颜色 | string | #ee0a24 |
direction | 菜单展开方向,可选值为up | string | down |
z-index | 菜单栏 z-index 层级 | number | string | 10 |
duration | 动画时长,单位秒 | number | string | 0.2 |
overlay | 是否显示遮罩层 | boolean | true |
close-on-click-overlay | 是否在点击遮罩层后关闭菜单 | boolean | true |
close-on-click-outside | 是否在点击外部元素后关闭菜单 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中项对应的 value,可以通过v-model 双向绑定 | number | string | - |
title | 菜单项标题 | string | 当前选中项文字 |
options | 选项数组 | Option[] | [] |
disabled | 是否禁用菜单 | boolean | false |
lazy-render v2.8.5 | 是否在首次展开时才渲染菜单内容 | boolean | true |
title-class | 标题额外类名 | string | - |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 点击选项导致 value 变化时触发 | value |
open | 打开菜单栏时触发 | - |
close | 关闭菜单栏时触发 | - |
opened | 打开菜单栏且动画结束后触发 | - |
closed | 关闭菜单栏且动画结束后触发 | - |
名称 | 说明 |
---|---|
default | 菜单内容 |
title | 自定义菜单项标题 |
通过 ref 可以获取到 DropdownItem 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
toggle | 切换菜单展示状态,传 true 为显示,false 为隐藏,不传参为取反 | show?: boolean | - |
键名 | 说明 | 类型 |
---|---|---|
text | 文字 | string |
value | 标识符 | number | string |
icon | 左侧图标名称或图片链接 | string |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@dropdown-menu-height | 48px | - |
@dropdown-menu-background-color | @white | - |
@dropdown-menu-box-shadow | 0 2px 12px fade(@gray-7, 12) | - |
@dropdown-menu-title-font-size | 15px | - |
@dropdown-menu-title-text-color | @text-color | - |
@dropdown-menu-title-active-text-color | @red | - |
@dropdown-menu-title-disabled-text-color | @gray-6 | - |
@dropdown-menu-title-padding | 0 @padding-xs | - |
@dropdown-menu-title-line-height | @line-height-lg | - |
@dropdown-menu-option-active-color | @red | - |
@dropdown-menu-content-max-height | 80% | - |
@dropdown-item-z-index | 10 | - |
把 DropdownMenu
嵌套在 Tabs
等组件内部使用时,可能会遇到下拉菜单位置错误的问题。这是因为在 Chrome 浏览器中,transform 元素内部的 fixed 布局会降级成 absolute 布局,导致下拉菜单的布局异常。
将 DropdownItem
的 get-container
属性设置为 body
即可避免此问题:
<van-dropdown-menu> <van-dropdown-item get-container="body" /> <van-dropdown-item get-container="body" /></van-dropdown-menu>
弹出模态框,常用于消息提示、消息确认,或在当前页面内完成特定的交互操作。
弹出框组件支持函数调用和组件调用两种方式。
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 });
将 theme 选项设置为 round-button
可以展示圆角按钮风格的弹窗,该选项从 2.10.0 版本开始支持。
Dialog.alert({ title: '标题', message: '弹窗内容', theme: 'round-button',}).then(() => { // on close});Dialog.alert({ message: '弹窗内容', theme: 'round-button',}).then(() => { // on close});
通过 beforeClose
属性可以传入一个回调函数,在弹窗关闭前进行特定操作。
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://img01.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow" /></van-dialog>
export default { data() { return { show: false, }; },};
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
Dialog | 展示弹窗 | options | Promise |
Dialog.alert | 展示消息提示弹窗 | options | Promise |
Dialog.confirm | 展示消息确认弹窗 | options | Promise |
Dialog.setDefaultOptions | 修改默认配置,对所有 Dialog 生效 | options | void |
Dialog.resetDefaultOptions | 重置默认配置,对所有 Dialog 生效 | - | void |
Dialog.close | 关闭弹窗 | - | void |
通过函数调用 Dialog
时,支持传入以下选项:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
width | 弹窗宽度,默认单位为px | number | string | 320px |
message | 文本内容,支持通过
换行 | string | - |
messageAlign | 内容对齐方式,可选值为left right | string | center |
theme | 样式风格,可选值为round | string | default |
className | 自定义类名 | any | - |
showConfirmButton | 是否展示确认按钮 | boolean | true |
showCancelButton | 是否展示取消按钮 | boolean | false |
confirmButtonText | 确认按钮文案 | string | 确认 |
confirmButtonColor | 确认按钮颜色 | string | #ee0a24 |
cancelButtonText | 取消按钮文案 | string | 取消 |
cancelButtonColor | 取消按钮颜色 | string | black |
overlay | 是否展示遮罩层 | boolean | true |
overlayClass | 自定义遮罩层类名 | string | - |
overlayStyle | 自定义遮罩层样式 | object | - |
closeOnPopstate | 是否在页面回退时自动关闭 | boolean | true |
closeOnClickOverlay | 是否在点击遮罩层后关闭弹窗 | boolean | false |
lockScroll | 是否锁定背景滚动 | boolean | true |
allowHtml v2.8.7 | 是否允许 message 内容中渲染 HTML | boolean | true |
beforeClose | 关闭前的回调函数, 调用 done() 后关闭弹窗, 调用 done(false) 阻止弹窗关闭 | (action, done) => void | - |
transition | 动画类名,等价于 transition 的name 属性 | string | - |
getContainer | 指定挂载的节点,用法示例 | string | () => Element | body |
通过组件调用 Dialog
时,支持以下 Props:
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否显示弹窗 | boolean | - |
title | 标题 | string | - |
width | 弹窗宽度,默认单位为 px | number | string | 320px |
message | 文本内容,支持通过
换行 | string | - |
message-align | 内容对齐方式,可选值为 left right | string | center |
theme | 样式风格,可选值为 round-button | string | default |
show-confirm-button | 是否展示确认按钮 | boolean | true |
show-cancel-button | 是否展示取消按钮 | boolean | false |
confirm-button-text | 确认按钮文案 | string | 确认 |
confirm-button-color | 确认按钮颜色 | string | #ee0a24 |
cancel-button-text | 取消按钮文案 | string | 取消 |
cancel-button-color | 取消按钮颜色 | string | black |
overlay | 是否展示遮罩层 | boolean | true |
overlay-class | 自定义遮罩层类名 | string | - |
overlay-style | 自定义遮罩层样式 | object | - |
close-on-popstate | 是否在页面回退时自动关闭 | boolean | true |
close-on-click-overlay | 是否在点击遮罩层后关闭弹窗 | boolean | false |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
lock-scroll | 是否锁定背景滚动 | boolean | true |
allow-html v2.8.7 | 是否允许 message 内容中渲染 HTML | boolean | true |
before-close | 关闭前的回调函数, 调用 done() 后关闭弹窗, 调用 done(false) 阻止弹窗关闭 | (action, done) => void | - |
transition | 动画类名,等价于 transition 的 name 属性 | string | - |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
通过组件调用 Dialog
时,支持以下事件:
事件 | 说明 | 回调参数 |
---|---|---|
confirm | 点击确认按钮时触发 | - |
cancel | 点击取消按钮时触发 | - |
open | 打开弹窗时触发 | - |
close | 关闭弹窗时触发 | - |
opened | 打开弹窗且动画结束后触发 | - |
closed | 关闭弹窗且动画结束后触发 | - |
通过组件调用 Dialog
时,支持以下插槽:
名称 | 说明 |
---|---|
default | 自定义内容 |
title | 自定义标题 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@dialog-width | 320px | - |
@dialog-small-screen-width | 90% | - |
@dialog-font-size | @font-size-lg | - |
@dialog-transition | @animation-duration-base | - |
@dialog-border-radius | 16px | - |
@dialog-background-color | @white | - |
@dialog-header-font-weight | @font-weight-bold | - |
@dialog-header-line-height | 24px | - |
@dialog-header-padding-top | 26px | - |
@dialog-header-isolated-padding | @padding-lg 0 | - |
@dialog-message-padding | @padding-lg | - |
@dialog-message-font-size | @font-size-md | - |
@dialog-message-line-height | @line-height-md | - |
@dialog-message-max-height | 60vh | - |
@dialog-has-title-message-text-color | @gray-7 | - |
@dialog-has-title-message-padding-top | @padding-xs | - |
@dialog-button-height | 48px | - |
@dialog-round-button-height | 36px | - |
@dialog-confirm-button-text-color | @red | - |
将 closeOnPopstate
属性设置为 false 即可。
Dialog.alert({ title: '标题', message: '弹窗内容', closeOnPopstate: false,}).then(() => { // on close});
底部弹起的模态面板,包含与当前情境相关的多个选项。
import Vue from 'vue';import { ActionSheet } from 'vant';Vue.use(ActionSheet);
动作面板通过 actions
属性来定义选项,actions
属性是一个由对象构成的数组,数组中的每个对象配置一列,对象格式见文档下方表格。
<van-cell is-link title="基础用法" @click="show = true" /><van-action-sheet v-model="show" :actions="actions" @select="onSelect" />
import { Toast } from 'vant';export default { data() { return { show: false, actions: [{ name: '选项一' }, { name: '选项二' }, { name: '选项三' }], }; }, methods: { onSelect(item) { // 默认情况下点击选项时不会自动收起 // 可以通过 close-on-click-action 属性开启自动收起 this.show = false; Toast(item.name); }, },};
设置 cancel-text
属性后,会在底部展示取消按钮,点击后关闭当前面板并触发 cancel
事件。
<van-action-sheet v-model="show" :actions="actions" cancel-text="取消" close-on-click-action @cancel="onCancel"/>
import { Toast } from 'vant';export default { data() { return { show: false, actions: [{ name: '选项一' }, { name: '选项二' }, { name: '选项三' }], }; }, methods: { onCancel() { Toast('取消'); }, },};
通过 description
可以在菜单顶部显示描述信息,通过选项的 subname
属性可以在选项文字的右侧展示描述信息。
<van-action-sheet v-model="show" :actions="actions" cancel-text="取消" description="这是一段描述信息" close-on-click-action/>
export default { data() { return { show: false, actions: [ { name: '选项一' }, { name: '选项二' }, { name: '选项三', subname: '描述信息' }, ], }; },};
可以通过 loading
和 disabled
将选项设置为加载状态或禁用状态,或者通过color
设置选项的颜色
<van-action-sheet v-model="show" :actions="actions" cancel-text="取消" close-on-click-action/>
export default { data() { return { show: false, actions: [ { name: '着色选项', color: '#ee0a24' }, { name: '禁用选项', disabled: true }, { name: '加载选项', loading: true }, ], }; },};
通过插槽可以自定义面板的展示内容,同时可以使用title
属性展示标题栏
<van-action-sheet v-model="show" title="标题"> <div class="content">内容</div></van-action-sheet><style> .content { padding: 16px 16px 160px; }</style>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model (value) | 是否显示动作面板 | boolean | false |
actions | 面板选项列表 | Action[] | [] |
title | 顶部标题 | string | - |
cancel-text | 取消按钮文字 | string | - |
description | 选项上方的描述信息 | string | - |
closeable v2.10.5 | 是否显示关闭图标 | boolean | true |
close-icon | 关闭图标名称或图片链接 | string | cross |
duration | 动画时长,单位秒 | number | string | 0.3 |
round | 是否显示圆角 | boolean | true |
overlay | 是否显示遮罩层 | boolean | true |
lock-scroll | 是否锁定背景滚动 | boolean | true |
lazy-render | 是否在显示弹层时才渲染节点 | boolean | true |
close-on-popstate v2.5.3 | 是否在页面回退时自动关闭 | boolean | false |
close-on-click-action | 是否在点击选项后关闭 | boolean | false |
close-on-click-overlay | 是否在点击遮罩层后关闭 | boolean | true |
safe-area-inset-bottom | 是否开启底部安全区适配 | boolean | true |
get-container | 指定挂载的节点,用法示例 | string | () => Element | - |
actions
属性是一个由对象构成的数组,数组中的每个对象配置一列,对象可以包含以下值:
键名 | 说明 | 类型 |
---|---|---|
name | 标题 | string |
subname | 二级标题 | string |
color | 选项文字颜色 | string |
className | 为对应列添加额外的 class | any |
loading | 是否为加载状态 | boolean |
disabled | 是否为禁用状态 | boolean |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 点击选项时触发,禁用或加载状态下不会触发 | action: Action, index: number |
cancel | 点击取消按钮时触发 | - |
open | 打开面板时触发 | - |
close | 关闭面板时触发 | - |
opened | 打开面板且动画结束后触发 | - |
closed | 关闭面板且动画结束后触发 | - |
click-overlay | 点击遮罩层时触发 | - |
名称 | 说明 |
---|---|
default | 自定义面板的展示内容 |
description v2.10.4 | 自定义描述文案 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@action-sheet-max-height | 80% | - |
@action-sheet-header-height | 48px | - |
@action-sheet-header-font-size | @font-size-lg | - |
@action-sheet-description-color | @gray-6 | - |
@action-sheet-description-font-size | @font-size-md | - |
@action-sheet-description-line-height | @line-height-md | - |
@action-sheet-item-background | @white | - |
@action-sheet-item-font-size | @font-size-lg | - |
@action-sheet-item-line-height | @line-height-lg | - |
@action-sheet-item-text-color | @text-color | - |
@action-sheet-item-disabled-text-color | @gray-5 | - |
@action-sheet-subname-color | @gray-6 | - |
@action-sheet-subname-font-size | @font-size-sm | - |
@action-sheet-subname-line-height | @line-height-sm | - |
@action-sheet-close-icon-size | 22px | - |
@action-sheet-close-icon-color | @gray-5 | - |
@action-sheet-close-icon-active-color | @gray-6 | - |
@action-sheet-close-icon-padding | 0 @padding-md | - |
@action-sheet-cancel-text-color | @gray-7 | - |
@action-sheet-cancel-padding-top | @padding-xs | - |
@action-sheet-cancel-padding-color | @background-color | - |
@action-sheet-loading-icon-size | 22px | - |
在 v1 版本中,动作面板的组件名为Actionsheet
,从 2.0 版本开始更名为ActionSheet
,请注意区分。
用于展示操作流程的各个环节,让用户了解当前的操作在整体流程中的位置。
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
active | 当前步骤 | number | string | 0 |
direction | 显示方向,可选值为 vertical | string | horizontal |
active-color | 激活状态颜色 | string | #07c160 |
inactive-color v2.9.1 | 未激活状态颜色 | string | #969799 |
active-icon | 激活状态底部图标,可选值见 Icon 组件 | string | checked |
inactive-icon | 未激活状态底部图标,可选值见 Icon 组件 | string | - |
finish-icon v2.12.7 | 已完成步骤对应的底部图标,优先级高于 inactive-icon ,可选值见 Icon 组件 | string | - |
icon-prefix v2.12.15 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
center | 是否进行居中对齐,仅在竖向展示时有效 | boolean | false |
名称 | 说明 |
---|---|
active-icon | 自定义激活状态图标 |
inactive-icon | 自定义未激活状态图标 |
finish-icon v2.12.7 | 自定义已完成步骤对应的底部图标,优先级高于 inactive-icon |
事件名 | 说明 | 回调参数 |
---|---|---|
click-step v2.5.9 | 点击步骤的标题或图标时触发 | index: number |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@step-text-color | @gray-6 | - |
@step-active-color | @green | - |
@step-process-text-color | @text-color | - |
@step-font-size | @font-size-md | - |
@step-line-color | @border-color | - |
@step-finish-line-color | @green | - |
@step-finish-text-color | @text-color | - |
@step-icon-size | 12px | - |
@step-circle-size | 5px | - |
@step-circle-color | @gray-6 | - |
@step-horizontal-title-font-size | @font-size-sm | - |
@steps-background-color | @white | - |
用于在内容加载过程中展示一组占位图形。
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; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
row | 段落占位图行数 | number | string | 0 |
row-width | 段落占位图宽度,可传数组来设置每一行的宽度 | number | string | (number | string)[] | 100% |
title | 是否显示标题占位图 | boolean | false |
avatar | 是否显示头像占位图 | boolean | false |
loading | 是否显示骨架屏,传 false 时会展示子组件内容 | boolean | true |
animate | 是否开启动画 | boolean | true |
round v2.8.5 | 是否将标题和段落显示为圆角风格 | boolean | false |
title-width | 标题占位图宽度 | number | string | 40% |
avatar-size | 头像占位图大小 | number | string | 32px |
avatar-shape | 头像占位图形状,可选值为square | string | round |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@skeleton-row-height | 16px | - |
@skeleton-row-background-color | @active-color | - |
@skeleton-row-margin-top | @padding-sm | - |
@skeleton-title-width | 40% | - |
@skeleton-avatar-size | 32px | - |
@skeleton-avatar-background-color | @active-color | - |
@skeleton-animation-duration | 1.2s | - |
用于展示操作的当前进度。
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)"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
percentage | 进度百分比 | number | string | 0 |
stroke-width | 进度条粗细,默认单位为px | number | string | 4px |
color | 进度条颜色 | string | #1989fa |
track-color | 轨道颜色 | string | #e5e5e5 |
pivot-text | 进度文字内容 | string | 百分比 |
pivot-color | 进度文字背景色 | string | 同进度条颜色 |
text-color | 进度文字颜色 | string | white |
inactive | 是否置灰 | boolean | false |
show-pivot | 是否显示进度文字 | boolean | true |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@progress-height | 4px | - |
@progress-color | @blue | - |
@progress-background-color | @gray-3 | - |
@progress-pivot-padding | 0 5px | - |
@progress-pivot-text-color | @white | - |
@progress-pivot-font-size | @font-size-xs | - |
@progress-pivot-line-height | 1.6 | - |
@progress-pivot-background-color | @blue | - |
Progress 组件在挂载时,会获取自身的宽度,并计算出进度条的样式。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示正确的进度。
方法一,如果是使用 v-show
来控制组件展示的,则替换为 v-if
即可解决此问题:
<!-- Before --><van-progress v-show="show" /><!-- After --><van-progress v-if="show" />
方法二,调用组件的 resize 方法来主动触发重绘:
<van-progress v-show="show" ref="progress" />
this.$refs.progress.resize();
弹出式的气泡菜单,2.11 版本开始支持此组件。
import Vue from 'vue';import { Popover } from 'vant';Vue.use(Popover);
当 Popover 弹出时,会基于 reference
插槽的内容进行定位。
<van-popover v-model="showPopover" trigger="click" :actions="actions" @select="onSelect"> <template #reference> <van-button type="primary">浅色风格</van-button> </template></van-popover>
import { Toast } from 'vant';export default { data() { return { showPopover: false, // 通过 actions 属性来定义菜单选项 actions: [{ text: '选项一' }, { text: '选项二' }, { text: '选项三' }], }; }, methods: { onSelect(action) { Toast(action.text); }, },};
Popover 支持浅色和深色两种风格,默认为浅色风格,将 theme
属性设置为 dark
可切换为深色风格。
<van-popover v-model="showPopover" theme="dark" trigger="click" :actions="actions"> <template #reference> <van-button type="primary">深色风格</van-button> </template></van-popover>
export default { data() { return { showPopover: false, actions: [{ text: '选项一' }, { text: '选项二' }, { text: '选项三' }], }; },};
通过 placement
属性来控制气泡的弹出位置。
<van-popover placement="top" />
placement
支持以下值:
top # 顶部中间位置top-start # 顶部左侧位置top-end # 顶部右侧位置left # 左侧中间位置left-start # 左侧上方位置left-end # 左侧下方位置right # 右侧中间位置right-start # 右侧上方位置right-end # 右侧下方位置bottom # 底部中间位置bottom-start # 底部左侧位置bottom-end # 底部右侧位置
在 actions
数组中,可以通过 icon
字段来定义选项的图标,支持传入图标名称或图片链接。
<van-popover v-model="showPopover" trigger="click" :actions="actions"> <template #reference> <van-button type="primary">展示图标</van-button> </template></van-popover>
export default { data() { return { showPopover: false, actions: [ { text: '选项一', icon: 'add-o' }, { text: '选项二', icon: 'music-o' }, { text: '选项三', icon: 'more-o' }, ], }; },};
在 actions
数组中,可以通过 disabled
字段来禁用某个选项。
<van-popover v-model="showPopover" trigger="click" :actions="actions"> <template #reference> <van-button type="primary">禁用选项</van-button> </template></van-popover>
export default { data() { return { showPopover: false, actions: [ { text: '选项一', disabled: true }, { text: '选项二', disabled: true }, { text: '选项三' }, ], }; },};
通过默认插槽,可以在 Popover 内部放置任意内容。
<van-popover v-model="showPopover" trigger="click"> <van-grid square clickable :border="false" column-num="3" style="width: 240px;" > <van-grid-item v-for="i in 6" :key="i" text="选项" icon="photo-o" @click="showPopover = false" /> </van-grid> <template #reference> <van-button type="primary">自定义内容</van-button> </template></van-popover>
export default { data() { return { showPopover: false, }; },};
注意:使用 get-container 时,挂载的父节点不可以是 popover 的 reference slot 节点
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否展示气泡弹出层 | boolean | false |
actions | 选项列表 | Action[] | [] |
placement | 弹出位置 | string | bottom |
theme | 主题风格,可选值为 dark | string | light |
trigger v2.11.1 | 触发方式,可选值为 click | - | |
offset | 出现位置的偏移量 | [number, number] | [0, 8] |
overlay | 是否显示遮罩层 | boolean | false |
close-on-click-action | 是否在点击选项后关闭 | boolean | true |
close-on-click-outside | 是否在点击外部元素后关闭菜单 | boolean | true |
get-container | 指定挂载的节点,用法示例 | string | () => Element | body |
actions
属性是一个由对象构成的数组,数组中的每个对象配置一列,对象可以包含以下值:
键名 | 说明 | 类型 |
---|---|---|
text | 选项文字 | string |
icon | 文字左侧的图标,支持传入图标名称或图片链接 | string |
disabled | 是否为禁用状态 | boolean |
className | 为对应选项添加额外的类名 | any |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 点击选项时触发 | action: Action, index: number |
open | 打开菜单时触发 | - |
close | 关闭菜单时触发 | - |
opened | 打开菜单且动画结束后触发 | - |
closed | 关闭菜单且动画结束后触发 | - |
名称 | 说明 |
---|---|
default | 自定义菜单内容 |
reference | 触发 Popover 显示的元素内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@popover-arrow-size | 6px | - |
@popover-border-radius | @border-radius-lg | - |
@popover-action-width | 128px | - |
@popover-action-height | 44px | - |
@popover-action-font-size | @font-size-md | - |
@popover-action-line-height | @line-height-md | - |
@popover-action-icon-size | 20px | - |
@popover-light-text-color | @text-color | - |
@popover-light-background-color | @white | - |
@popover-light-action-disabled-text-color | @gray-5 | - |
@popover-dark-text-color | @white | - |
@popover-dark-background-color | #4a4a4a | - |
@popover-dark-action-disabled-text-color | @gray-6 | - |
这种情况通常是由于项目中引入了 fastclick
库导致的。建议移除 fastclick
,或者配置 fastclick
的 ignore 规则。
用于循环播放展示一组消息通知。
import Vue from 'vue';import { NoticeBar } from 'vant';Vue.use(NoticeBar);
通过 text
属性设置通知栏的内容,通过 left-icon
属性设置通知栏左侧的图标。
<van-notice-bar left-icon="volume-o" text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>
通知栏的内容长度溢出时会自动开启滚动播放,通过 scrollable
属性可以控制该行为。
<!-- 文字较短时,通过设置 scrollable 属性开启滚动播放 --><van-notice-bar scrollable text="技术是开发它的人的共同灵魂。" /><!-- 文字较长时,通过禁用 scrollable 属性关闭滚动播放 --><van-notice-bar :scrollable="false" text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>
文字较长时,可以通过设置 wrapable
属性来开启多行展示。
<van-notice-bar wrapable :scrollable="false" text="在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。"/>
通知栏支持 closeable
和 link
两种模式。
<!-- closeable 模式,在右侧显示关闭按钮 --><van-notice-bar mode="closeable">技术是开发它的人的共同灵魂。</van-notice-bar><!-- link 模式,在右侧显示链接箭头 --><van-notice-bar mode="link">技术是开发它的人的共同灵魂。</van-notice-bar>
通过 color
属性设置文本颜色,通过 background
属性设置背景色。
<van-notice-bar color="#1989fa" background="#ecf9ff" left-icon="info-o"> 技术是开发它的人的共同灵魂。</van-notice-bar>
搭配 NoticeBar 和 Swipe 组件可以实现垂直滚动的效果。
<van-notice-bar left-icon="volume-o" :scrollable="false"> <van-swipe vertical class="notice-swipe" :autoplay="3000" :show-indicators="false" > <van-swipe-item>内容 1</van-swipe-item> <van-swipe-item>内容 2</van-swipe-item> <van-swipe-item>内容 3</van-swipe-item> </van-swipe></van-notice-bar><style> .notice-swipe { height: 40px; line-height: 40px; }</style>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
mode | 通知栏模式,可选值为 closeable link | string | '' |
text | 通知文本内容 | string | '' |
color | 通知文本颜色 | string | #f60 |
background | 滚动条背景 | string | #fff7cc |
left-icon | 左侧图标名称或图片链接 | string | - |
delay | 动画延迟时间 (s) | number | string | 1 |
speed | 滚动速率 (px/s) | number | string | 60 |
scrollable | 是否开启滚动播放,内容长度溢出时默认开启 | boolean | - |
wrapable | 是否开启文本换行,只在禁用滚动时生效 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击通知栏时触发 | event: Event |
close | 关闭通知栏时触发 | event: Event |
replay v2.6.2 | 每当滚动栏重新开始滚动时触发 | - |
名称 | 内容 |
---|---|
default | 通知文本内容 |
left-icon | 自定义左侧图标 |
right-icon | 自定义右侧图标 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@notice-bar-height | 40px | - |
@notice-bar-padding | 0 @padding-md | - |
@notice-bar-wrapable-padding | @padding-xs @padding-md | - |
@notice-bar-text-color | @orange-dark | - |
@notice-bar-font-size | @font-size-md | - |
@notice-bar-line-height | 24px | - |
@notice-bar-background-color | @orange-light | - |
@notice-bar-icon-size | 16px | - |
@notice-bar-icon-min-width | 24px | - |
瀑布流滚动加载,用于展示长列表,当列表即将滚动到底部时,会触发事件并加载更多列表项。
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(); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 是否处于加载状态,加载过程中不触发load 事件 | boolean | false |
finished | 是否已加载完成,加载完成后不再触发load 事件 | boolean | false |
error | 是否加载失败,加载失败后点击错误提示可以重新 触发 load 事件,必须使用sync 修饰符 | boolean | false |
offset | 滚动条与底部距离小于 offset 时触发load 事件 | number | string | 300 |
loading-text | 加载过程中的提示文案 | string | 加载中... |
finished-text | 加载完成后的提示文案 | string | - |
error-text | 加载失败后的提示文案 | string | - |
immediate-check | 是否在初始化时立即执行滚动位置检查 | boolean | true |
direction | 滚动触发加载的方向,可选值为up | string | down |
事件名 | 说明 | 回调参数 |
---|---|---|
load | 滚动条与底部距离小于 offset 时触发 | - |
名称 | 说明 |
---|---|
default | 列表内容 |
loading | 自定义底部加载中提示 |
finished | 自定义加载完成后的提示文案 |
error | 自定义加载失败后的提示文案 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@list-text-color | @gray-6 | - |
@list-text-font-size | @font-size-md | - |
@list-text-line-height | 50px | - |
List 会监听浏览器的滚动事件并计算列表的位置,当列表底部与可视区域的距离小于offset
时,List 会触发一次 load 事件。
List 初始化后会触发一次 load 事件,用于加载第一屏的数据,这个特性可以通过immediate-check
属性关闭。
如果一次请求加载的数据条数较少,导致列表内容无法铺满当前屏幕,List 会继续触发 load 事件,直到内容铺满屏幕或数据全部加载完成。因此你需要调整每次获取的数据条数,理想情况下每次请求获取的数据条数应能够填满一屏高度。
List
有以下三种状态,理解这些状态有助于你正确地使用List
组件:
loading
为false
,此时会根据列表滚动位置判断是否触发load
事件(列表内容不足一屏幕时,会直接触发)loading
为true
,表示正在发送异步请求,此时不会触发load
事件finished
为true
,此时不会触发load
事件在每次请求完毕后,需要手动将loading
设置为false
,表示加载结束
若 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-x: hidden
样式,会导致 List 一直触发加载。
html,body { overflow-x: hidden;}
这个问题的原因是当元素设置了overflow-x: hidden
样式时,该元素的overflow-y
会被浏览器设置为auto
,而不是默认值visible
,导致 List 无法正确地判断滚动容器。解决方法是去除该样式,或者在 html 和 body 标签上添加height: 100%
样式。
设置 direction
属性为 up 后,当滚动条处于页面顶部时,就会触发 List 组件的加载。
因此在使用该属性时,建议在每次数据加载完成后,将滚动条滚动至页面底部或非顶部的位置。
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://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
loading | 加载时的图片 | string | - |
error | 错误时的图片 | string | - |
preload | 预加载高度的比例 | string | - |
attempt | 尝试次数 | number | 3 |
listenEvents | 监听的事件 | string[] | scroll 等 |
adapter | 适配器 | object | - |
filter | 图片 URL 过滤 | object | - |
lazyComponent | 是否能懒加载模块 | boolean | false |
更多内容请参照:vue-lazyload 官方文档
用于循环播放一组图片或内容。
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://img01.yzcdn.cn/vant/apple-1.jpg', 'https://img01.yzcdn.cn/vant/apple-2.jpg', ], }; },};
<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> <template #indicator> <div class="custom-indicator">{{ current + 1 }}/4</div> </template></van-swipe><style> .custom-indicator { position: absolute; right: 5px; bottom: 5px; padding: 2px 5px; font-size: 12px; background: rgba(0, 0, 0, 0.1); }</style>
export default { data() { return { current: 0, }; }, methods: { onChange(index) { this.current = index; }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
autoplay | 自动轮播间隔,单位为 ms | number | string | - |
duration | 动画时长,单位为 ms | number | string | 500 |
initial-swipe | 初始位置索引值 | number | string | 0 |
width | 滑块宽度,单位为px | number | string | auto |
height | 滑块高度,单位为px | number | string | auto |
loop | 是否开启循环播放 | boolean | true |
show-indicators | 是否显示指示器 | boolean | true |
vertical | 是否为纵向滚动 | boolean | false |
touchable | 是否可以通过手势滑动 | boolean | true |
stop-propagation | 是否阻止滑动事件冒泡 | boolean | true |
lazy-render v2.5.8 | 是否延迟渲染未展示的轮播 | boolean | false |
indicator-color | 指示器颜色 | string | #1989fa |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 每一页轮播结束后触发 | index, 当前页的索引 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
通过 ref 可以获取到 Swipe 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
prev | 切换到上一轮播 | - | - |
next | 切换到下一轮播 | - | - |
swipeTo | 切换到指定位置 | index: number, options: Options | - |
resize | 外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘 | - | - |
名称 | 说明 | 类型 |
---|---|---|
immediate | 是否跳过动画 | boolean |
名称 | 说明 |
---|---|
default | 轮播内容 |
indicator | 自定义指示器 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@swipe-indicator-size | 6px | - |
@swipe-indicator-margin | @padding-sm | - |
@swipe-indicator-active-opacity | 1 | - |
@swipe-indicator-inactive-opacity | 0.3 | - |
@swipe-indicator-active-background-color | @blue | - |
@swipe-indicator-inactive-background-color | @border-color | - |
这种情况通常是由于项目中引入了fastclick
库导致的。fastclick
的原理是通过 Touch 事件模拟出 click 事件,而 Swipe 内部默认会阻止 touchmove 事件冒泡,干扰了 fastclick 的判断,导致出现这个问题。
将 Swipe 组件的 stop-propagation 属性设置为 false 即可避免该问题。
参见桌面端适配。
Vant 中的 Swipe 组件是比较轻量的,因此功能也比较基础。如果需要更复杂的轮播效果,推荐使用社区里一些优质的轮播库,比如 vue-awesome-swiper。
Swipe 组件在挂载时,会获取自身的宽度,并计算出轮播图的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法正确计算位置。
方法一,如果是使用 v-show
来控制组件展示的,则替换为 v-if
即可解决此问题:
<!-- Before --><van-swipe v-show="show" /><!-- After --><van-swipe v-if="show" />
方法二,调用组件的 resize 方法来主动触发重绘:
<van-swipe v-show="show" ref="swipe" />
this.$refs.swipe.resize();
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; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
offset-top v2.8.7 | 吸顶时与顶部的距离,支持 px vw vh rem 单位,默认 px | number | string | 0 |
z-index | 吸顶时的 z-index | number | string | 99 |
container | 容器对应的 HTML 节点 | Element | - |
事件名 | 说明 | 回调参数 |
---|---|---|
change v2.12.13 | 当吸顶状态改变时触发 | isFixed: boolean |
scroll | 滚动时触发 | { scrollTop: number, isFixed: boolean } |
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 #content> <van-image v-if="active === 0" src="https://img01.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow" /> <van-image v-if="active === 1" src="https://img01.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
属性后,会在图标右上角展示一个小红点;设置 badge
属性后,会在图标右上角展示相应的徽标。
<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: [], badge: 5 }, ], }; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
items | 分类显示所需的数据 | Item[] | [] |
height | 高度,默认单位为px | number | string | 300 |
main-active-index | 左侧选中项的索引 | number | string | 0 |
active-id | 右侧选中项的 id,支持传入数组 | number | string | (number | string)[] | 0 |
max | 右侧项最大选中个数 | number | string | Infinity |
selected-icon v2.9.0 | 自定义右侧栏选中状态的图标 | string | success |
事件名 | 说明 | 回调参数 |
---|---|---|
click-nav | 点击左侧导航时触发 | index:被点击的导航的索引 |
click-item | 点击右侧选择项时触发 | data: 该点击项的数据 |
名称 | 说明 |
---|---|
content | 自定义右侧区域内容 |
items
整体为一个数组,数组内包含一系列描述分类的对象,每个分类里,text
表示当前分类的名称,children
表示分类里的可选项。
[ { // 导航名称 text: '所有城市', // 导航名称右上角徽标,2.5.6 版本开始支持 badge: 3, // 是否在导航名称右上角显示小红点 dot: true, // 导航节点额外类名 className: 'my-class', // 该导航下所有的可选项 children: [ { // 名称 text: '温州', // id,作为匹配选中状态的标识符 id: 1, // 禁用选项 disabled: true, }, { text: '杭州', id: 2, }, ], },];
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@tree-select-font-size | @font-size-md | - |
@tree-select-nav-background-color | @background-color | - |
@tree-select-content-background-color | @white | - |
@tree-select-nav-item-padding | 14px @padding-sm | - |
@tree-select-item-height | 48px | - |
@tree-select-item-active-color | @red | - |
@tree-select-item-disabled-color | @gray-5 | - |
@tree-select-item-selected-size | 16px | - |
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
属性后,会在图标右上角展示一个小红点;设置 badge
属性后,会在图标右上角展示相应的徽标。
<van-tabbar v-model="active"> <van-tabbar-item icon="home-o">标签</van-tabbar-item> <van-tabbar-item icon="search" dot>标签</van-tabbar-item> <van-tabbar-item icon="friends-o" badge="5">标签</van-tabbar-item> <van-tabbar-item icon="setting-o" badge="20">标签</van-tabbar-item></van-tabbar>
通过 icon
插槽自定义图标,可以通过 slot-scope
判断标签是否选中。
<van-tabbar v-model="active"> <van-tabbar-item badge="3"> <span>自定义</span> <template #icon="props"> <img :src="props.active ? icon.active : icon.inactive" /> </template> </van-tabbar-item> <van-tabbar-item icon="search">标签</van-tabbar-item> <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
export default { data() { return { active: 0, icon: { active: 'https://img01.yzcdn.cn/vant/user-active.png', inactive: 'https://img01.yzcdn.cn/vant/user-inactive.png', }, }; },};
<van-tabbar v-model="active" active-color="#ee0a24" inactive-color="#000"> <van-tabbar-item icon="home-o">标签</van-tabbar-item> <van-tabbar-item icon="search">标签</van-tabbar-item> <van-tabbar-item icon="friends-o">标签</van-tabbar-item> <van-tabbar-item icon="setting-o">标签</van-tabbar-item></van-tabbar>
<van-tabbar v-model="active" @change="onChange"> <van-tabbar-item icon="home-o">标签1</van-tabbar-item> <van-tabbar-item icon="search">标签2</van-tabbar-item> <van-tabbar-item icon="friends-o">标签3</van-tabbar-item> <van-tabbar-item icon="setting-o">标签4</van-tabbar-item></van-tabbar>
import { 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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中标签的名称或索引值 | number | string | 0 |
fixed | 是否固定在底部 | boolean | true |
border | 是否显示外边框 | boolean | true |
z-index | 元素 z-index | number | string | 1 |
active-color | 选中标签的颜色 | string | #1989fa |
inactive-color | 未选中标签的颜色 | string | #7d7e80 |
route | 是否开启路由模式 | boolean | false |
placeholder v2.6.0 | 固定在底部时,是否在标签位置生成一个等高的占位元素 | boolean | false |
safe-area-inset-bottom | 是否开启底部安全区适配,设置 fixed 时默认开启 | boolean | false |
before-change v2.10.4 | 切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise | (name) => boolean | Promise | - |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换标签时触发 | active: 当前选中标签的名称或索引值 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | 标签名称,作为匹配的标识符 | number | string | 当前标签的索引值 |
icon | 图标名称或图片链接 | string | - |
icon-prefix v2.5.3 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
dot | 是否显示图标右上角小红点 | boolean | false |
badge v2.5.6 | 图标右上角徽标的内容 | number | string | - |
info | 图标右上角徽标的内容(已废弃,请使用 badge 属性) | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
名称 | 说明 | 参数 |
---|---|---|
icon | 自定义图标 | active: 是否为选中标签 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@tabbar-height | 50px | - |
@tabbar-z-index | 1 | - |
@tabbar-background-color | @white | - |
@tabbar-item-font-size | @font-size-sm | - |
@tabbar-item-text-color | @gray-7 | - |
@tabbar-item-active-color | @blue | - |
@tabbar-item-active-background-color | @tabbar-background-color | - |
@tabbar-item-line-height | 1 | - |
@tabbar-item-icon-size | 22px | - |
@tabbar-item-margin-bottom | 4px | - |
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', }; },};
标签数量超过 5 个时,标签栏可以在水平方向上滚动,切换时会自动将当前标签居中。
<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
支持两种样式风格:line
和card
,默认为 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
属性可以开启粘性布局,粘性布局下,标签页滚动到顶部时会自动吸顶。
<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" :key="index"> <template #title> <van-icon name="more-o" />选项 </template> 内容 {{ 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>
通过 before-change
属性可以在切换标签前执行特定的逻辑。
<van-tabs :before-change="beforeChange"> <van-tab v-for="index in 4" :title="'选项 ' + index"> 内容 {{ index }} </van-tab></van-tabs>
export default { methods: { beforeChange(index) { // 返回 false 表示阻止此次切换 if (index === 1) { return false; } // 返回 Promise 来执行异步逻辑 return new Promise((resolve) => { // 在 resolve 函数中返回 true 或 false resolve(index !== 3); }); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 绑定当前选中标签的标识符 | number | string | 0 |
type | 样式风格类型,可选值为 card | string | line |
color | 标签主题色 | string | #ee0a24 |
background | 标签栏背景色 | string | white |
duration | 动画时间,单位秒 | number | string | 0.3 |
line-width | 底部条宽度,默认单位 px | number | string | 40px |
line-height | 底部条高度,默认单位 px | number | string | 3px |
animated | 是否开启切换标签内容时的转场动画 | boolean | false |
border | 是否显示标签栏外边框,仅在 type="line" 时有效 | boolean | false |
ellipsis | 是否省略过长的标题文字 | boolean | true |
sticky | 是否使用粘性定位布局 | boolean | false |
swipeable | 是否开启手势滑动切换 | boolean | false |
lazy-render | 是否开启延迟渲染(首次切换到标签时才触发内容渲染) | boolean | true |
scrollspy | 是否开启滚动导航 | boolean | false |
offset-top v2.8.7 | 粘性定位布局下与顶部的最小距离,支持 px vw vh rem 单位,默认 px | number | string | 0 |
swipe-threshold | 滚动阈值,标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动 | number | string | 5 |
title-active-color | 标题选中态颜色 | string | - |
title-inactive-color | 标题默认态颜色 | string | - |
before-change v2.9.3 | 切换标签前的回调函数,返回 false 可阻止切换,支持返回 Promise | (name) => boolean | Promise | - |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
disabled | 是否禁用标签 | boolean | false |
dot | 是否在标题右上角显示小红点 | boolean | false |
badge v2.5.6 | 图标右上角徽标的内容 | number | string | - |
info | 图标右上角徽标的内容(已废弃,请使用 badge 属性) | number | string | - |
name | 标签名称,作为匹配的标识符 | number | string | 标签的索引值 |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
title-style | 自定义标题样式 | any | - |
title-class | 自定义标题类名 | any | - |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击标签时触发 | name:标识符,title:标题 |
change | 当前激活的标签改变时触发 | name:标识符,title:标题 |
disabled | 点击被禁用的标签时触发 | name:标识符,title:标题 |
rendered | 标签内容首次渲染时触发(仅在开启延迟渲染后触发) | name:标识符,title:标题 |
scroll | 滚动时触发,仅在 sticky 模式下生效 | { scrollTop: 距离顶部位置, isFixed: 是否吸顶 } |
通过 ref 可以获取到 Tabs 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
resize | 外层元素大小或组件显示状态变化时,可以调用此方法来触发重绘 | - | - |
scrollTo v2.9.3 | 滚动到指定的标签页,在滚动导航模式下可用 | name: 标识符 | - |
名称 | 说明 |
---|---|
nav-left | 标题左侧内容 |
nav-right | 标题右侧内容 |
名称 | 说明 |
---|---|
default | 标签页内容 |
title | 自定义标题 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@tab-text-color | @gray-7 | - |
@tab-active-text-color | @text-color | - |
@tab-disabled-text-color | @gray-5 | - |
@tab-font-size | @font-size-md | - |
@tab-line-height | @line-height-md | - |
@tabs-default-color | @red | - |
@tabs-line-height | 44px | - |
@tabs-card-height | 30px | - |
@tabs-nav-background-color | @white | - |
@tabs-bottom-bar-width | 40px | - |
@tabs-bottom-bar-height | 3px | - |
@tabs-bottom-bar-color | @tabs-default-color | - |
Tabs 组件在挂载时,会获取自身的宽度,并计算出底部条的位置。如果组件一开始处于隐藏状态,则获取到的宽度永远为 0,因此无法展示底部条位置。
方法一,如果是使用 v-show
来控制组件展示的,则替换为 v-if
即可解决此问题:
<!-- Before --><van-tabs v-show="show" /><!-- After --><van-tabs v-if="show" />
方法二,调用组件的 resize 方法来主动触发重绘:
<van-tabs v-show="show" ref="tabs" />
this.$refs.tabs.resize();
import 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
属性后,会在右上角展示一个小红点;设置 badge
属性后,会在右上角展示相应的徽标。
<van-sidebar v-model="activeKey"> <van-sidebar-item title="标签名称" dot /> <van-sidebar-item title="标签名称" badge="5" /> <van-sidebar-item title="标签名称" badge="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 }); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前导航项的索引 | number | string | 0 |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 切换导航项时触发 | index: 当前导航项的索引 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 内容 | string | '' |
dot | 是否显示右上角小红点 | boolean | false |
badge v2.5.6 | 图标右上角徽标的内容 | number | string | - |
info | 图标右上角徽标的内容(已废弃,请使用 badge 属性) | number | string | - |
disabled | 是否禁用该项 | boolean | false |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | index: 当前导航项的索引 |
Name | Description |
---|---|
title v2.10.8 | 自定义标题 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@sidebar-width | 80px | - |
@sidebar-font-size | @font-size-md | - |
@sidebar-line-height | @line-height-md | - |
@sidebar-text-color | @text-color | - |
@sidebar-disabled-text-color | @gray-5 | - |
@sidebar-padding | 20px @padding-sm | - |
@sidebar-active-color | @active-color | - |
@sidebar-background-color | @background-color | - |
@sidebar-selected-font-weight | @font-weight-bold | - |
@sidebar-selected-text-color | @text-color | - |
@sidebar-selected-border-width | 4px | - |
@sidebar-selected-border-height | 16px | - |
@sidebar-selected-border-color | @red | - |
@sidebar-selected-background-color | @white | - |
import Vue from 'vue';import { Pagination } from 'vant';Vue.use(Pagination);
通过 v-model
来绑定当前页码。
<van-pagination v-model="currentPage" :total-items="24" :items-per-page="5" />
export default { data() { return { currentPage: 1, }; },};
将 mode
设置为 simple
来切换到简单模式,此时分页器不会展示具体的页码按钮。
<van-pagination v-model="currentPage" :page-count="12" mode="simple" />
设置 force-ellipses
后会展示省略号按钮,点击后可以快速跳转。
<van-pagination v-model="currentPage" :total-items="125" :show-page-size="3" force-ellipses/>
通过 prev-text
、next-text
等插槽来自定义分页按钮的内容。
<van-pagination v-model="currentPage" :total-items="50" :show-page-size="5"> <template #prev-text> <van-icon name="arrow-left" /> </template> <template #next-text> <van-icon name="arrow" /> </template> <template #page="{ text }">{{ text }}</template></van-pagination>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前页码 | number | - |
mode | 显示模式,可选值为 simple | string | multi |
prev-text | 上一页按钮文字 | string | 上一页 |
next-text | 下一页按钮文字 | string | 下一页 |
page-count | 总页数 | number | string | 根据页数计算 |
total-items | 总记录数 | number | string | 0 |
items-per-page | 每页记录数 | number | string | 10 |
show-page-size | 显示的页码个数 | number | string | 5 |
force-ellipses | 是否显示省略号 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 页码改变时触发 | - |
名称 | 描述 | 参数 |
---|---|---|
page v2.10.9 | 自定义页码 | { number: number, text: string, active: boolean } |
prev-text v2.10.9 | 自定义上一页按钮文字 | - |
next-text v2.10.9 | 自定义下一页按钮文字 | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@pagination-height | 40px | - |
@pagination-font-size | @font-size-md | - |
@pagination-item-width | 36px | - |
@pagination-item-default-color | @blue | - |
@pagination-item-disabled-color | @gray-7 | - |
@pagination-item-disabled-background-color | @background-color | - |
@pagination-background-color | @white | - |
@pagination-desc-color | @gray-7 | - |
@pagination-disabled-opacity | @disabled-opacity | - |
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> <template #right> <van-icon name="search" size="18" /> </template></van-nav-bar>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | '' |
left-text | 左侧文案 | string | '' |
right-text | 右侧文案 | string | '' |
left-arrow | 是否显示左侧箭头 | boolean | false |
border | 是否显示下边框 | boolean | true |
fixed | 是否固定在顶部 | boolean | false |
placeholder v2.5.9 | 固定在顶部时,是否在标签位置生成一个等高的占位元素 | boolean | false |
z-index | 导航栏 z-index | number | string | 1 |
safe-area-inset-top v2.10.13 | 是否开启顶部安全区适配 | boolean | false |
名称 | 说明 |
---|---|
title | 自定义标题 |
left | 自定义左侧区域内容 |
right | 自定义右侧区域内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
click-left | 点击左侧按钮时触发 | - |
click-right | 点击右侧按钮时触发 | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@nav-bar-height | 46px | - |
@nav-bar-background-color | @white | - |
@nav-bar-arrow-size | 16px | - |
@nav-bar-icon-color | @blue | - |
@nav-bar-text-color | @blue | - |
@nav-bar-title-font-size | @font-size-lg | - |
@nav-bar-title-text-color | @text-color | - |
@nav-bar-z-index | 1 | - |
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], }; },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
index-list | 索引字符列表 | string[] | number[] | A-Z |
z-index | z-index 层级 | number | string | 1 |
sticky | 是否开启锚点自动吸顶 | boolean | true |
sticky-offset-top | 锚点自动吸顶时与顶部的距离 | number | 0 |
highlight-color | 索引字符高亮颜色 | string | #ee0a24 |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
index | 索引字符 | number | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
select | 点击索引栏的字符时触发 | index: number | string |
change v2.10.10 | 当前高亮的索引字符变化时触发 | index: number | string |
名称 | 说明 |
---|---|
default | 锚点位置显示内容,默认为索引字符 |
通过 ref 可以获取到 IndexBar 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
scrollTo v2.12.2 | 滚动到指定锚点 | index: number | string | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@index-bar-sidebar-z-index | 2 | - |
@index-bar-index-font-size | @font-size-xs | - |
@index-bar-index-line-height | @line-height-xs | - |
@index-bar-index-active-color | @red | - |
@index-anchor-z-index | 1 | - |
@index-anchor-padding | 0 @padding-md | - |
@index-anchor-text-color | @text-color | - |
@index-anchor-font-weight | @font-weight-bold | - |
@index-anchor-font-size | @font-size-md | - |
@index-anchor-line-height | 32px | - |
@index-anchor-background-color | transparent | - |
@index-anchor-sticky-text-color | @red | - |
@index-anchor-sticky-background-color | @white | - |
宫格可以在水平方向上把页面分隔成等宽度的区块,用于展示内容或进行页面导航。
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://img01.yzcdn.cn/vant/apple-1.jpg" rel="external nofollow" /> </van-grid-item> <van-grid-item> <van-image src="https://img01.yzcdn.cn/vant/apple-2.jpg" rel="external nofollow" /> </van-grid-item> <van-grid-item> <van-image src="https://img01.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow" /> </van-grid-item></van-grid>
设置 square
属性后,格子的高度会和宽度保持一致。
<van-grid square> <van-grid-item v-for="value in 8" :key="value" icon="photo-o" text="文字" /></van-grid>
通过 gutter
属性设置格子之间的距离。
<van-grid :gutter="10"> <van-grid-item v-for="value in 8" :key="value" icon="photo-o" text="文字" /></van-grid>
将 direction
属性设置为 horizontal
,可以让宫格的内容呈横向排列。
<van-grid direction="horizontal" :column-num="2"> <van-grid-item icon="photo-o" text="文字" /> <van-grid-item icon="photo-o" text="文字" /> <van-grid-item icon="photo-o" text="文字" /></van-grid>
通过 to
属性设置 vue-router
跳转链接,通过 url
属性设置 URL 跳转链接。
<van-grid clickable :column-num="2"> <van-grid-item icon="home-o" text="路由跳转" to="/" /> <van-grid-item icon="search" text="URL 跳转" url="/vant/mobile.html" /></van-grid>
设置 dot
属性后,会在图标右上角展示一个小红点。设置 badge
属性后,会在图标右上角展示相应的徽标。
<van-grid :column-num="2"> <van-grid-item icon="home-o" text="文字" dot /> <van-grid-item icon="search" text="文字" badge="99+" /></van-grid>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
column-num | 列数 | number | string | 4 |
icon-size | 图标大小,默认单位为px | number | string | 28px |
gutter | 格子之间的间距,默认单位为px | number | string | 0 |
border | 是否显示边框 | boolean | true |
center | 是否将格子内容居中显示 | boolean | true |
square | 是否将格子固定为正方形 | boolean | false |
clickable | 是否开启格子点击反馈 | boolean | false |
direction v2.8.2 | 格子内容排列的方向,可选值为 horizontal | string | vertical |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 文字 | string | - |
icon | 图标名称或图片链接 | string | - |
icon-prefix v2.5.3 | 图标类名前缀,同 Icon 组件的 class-prefix 属性 | string | van-icon |
dot | 是否显示图标右上角小红点 | boolean | false |
badge v2.5.6 | 图标右上角徽标的内容 | number | string | - |
info 2.2.1 | 图标右上角徽标的内容(已废弃,请使用 badge 属性) | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击格子时触发 | event: Event |
名称 | 说明 |
---|---|
default | 自定义宫格的所有内容 |
icon | 自定义图标 |
text | 自定义文字 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@grid-item-content-padding | @padding-md @padding-xs | - |
@grid-item-content-background-color | @white | - |
@grid-item-content-active-color | @active-color | - |
@grid-item-icon-size | 28px | - |
@grid-item-text-color | @gray-7 | - |
@grid-item-text-font-size | @font-size-sm | - |
import Vue from 'vue';import { Tag } from 'vant';Vue.use(Tag);
通过 type
属性控制标签颜色。
<van-tag type="primary">标签</van-tag><van-tag type="success">标签</van-tag><van-tag type="danger">标签</van-tag><van-tag type="warning">标签</van-tag>
设置 plain
属性设置为空心样式。
<van-tag plain type="primary">标签</van-tag>
通过 round
设置为圆角样式。
<van-tag round type="primary">标签</van-tag>
通过 mark
设置为标记样式(半圆角)。
<van-tag mark type="primary">标签</van-tag>
添加 closeable
属性表示标签是可关闭的,关闭标签时会触发 close
事件,在 close
事件中可以执行隐藏标签的逻辑。
<van-tag v-if="show" closeable size="medium" type="primary" @close="close"> 标签</van-tag>
export default { data() { return { show: true, }; }, methods: { close() { this.show = false; }, },};
通过 size
属性调整标签大小。
<van-tag type="primary">标签</van-tag><van-tag type="primary" size="medium">标签</van-tag><van-tag type="primary" size="large">标签</van-tag>
通过 color
和 text-color
属性设置标签颜色。
<van-tag color="#7232dd">标签</van-tag><van-tag color="#ffe1e1" text-color="#ad0000">标签</van-tag><van-tag color="#7232dd" plain>标签</van-tag>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 类型,可选值为primary success danger warning | string | default |
size | 大小, 可选值为large medium | string | - |
color | 标签颜色 | string | - |
plain | 是否为空心样式 | boolean | false |
round | 是否为圆角样式 | boolean | false |
mark | 是否为标记样式 | boolean | false |
text-color | 文本颜色,优先级高于color 属性 | string | white |
closeable | 是否为可关闭标签 | boolean | false |
名称 | 说明 |
---|---|
default | 标签显示内容 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
close | 关闭标签时触发 | - |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@tag-padding | 0 @padding-base | - |
@tag-text-color | @white | - |
@tag-font-size | @font-size-sm | - |
@tag-border-radius | 2px | - |
@tag-line-height | 16px | - |
@tag-medium-padding | 2px 6px | - |
@tag-large-padding | @padding-base @padding-xs | - |
@tag-large-border-radius | @border-radius-md | - |
@tag-large-font-size | @font-size-md | - |
@tag-round-border-radius | @border-radius-max | - |
@tag-danger-color | @red | - |
@tag-primary-color | @blue | - |
@tag-success-color | @green | - |
@tag-warning-color | @orange | - |
@tag-default-color | @gray-6 | - |
@tag-plain-background-color | @white | - |
SwitchCell 组件将在 3.0 版本中废弃,请直接使用 Cell 和 Switch 组件代替,替换写法如下:
<van-cell center title="标题"> <template #right-icon> <van-switch v-model="checked" size="24" /> </template></van-cell>
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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 开关状态 | any | false |
title | 左侧标题 | string | '' |
border | 是否展示单元格内边框 | boolean | true |
cell-size | 单元格大小,可选值为 large | string | - |
loading | 是否为加载状态 | boolean | false |
disabled | 是否为禁用状态 | boolean | false |
size | 开关尺寸 | number | string | 24px |
active-color | 开关时的背景色 | string | #1989fa |
inactive-color | 开关时的背景色 | string | white |
active-value | 打开时的值 | any | true |
inactive-value | 关闭时的值 | any | false |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 开关状态切换回调 | checked: 是否选中开关 |
由于使用场景有限,Panel 组件将在 3.0 版本中废弃,请直接使用 Cell 和 Button 组件代替。
import Vue from 'vue';import { Panel } from 'vant';Vue.use(Panel);
面板只是一个容器,里面可以放入自定义的内容。
<van-panel title="标题" desc="描述信息" status="状态"> <div>内容</div></van-panel>
使用插槽自定义内容。
<van-panel title="标题" desc="描述信息" status="状态"> <div>内容</div> <template #footer> <van-button size="small">按钮</van-button> <van-button size="small" type="danger">按钮</van-button> </template></van-panel>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | - |
desc | 描述 | string | - |
status | 状态 | string | - |
icon | 标题左侧图标名称或图片链接 | string | - |
名称 | 说明 |
---|---|
default | 自定义内容 |
header | 自定义 header |
footer | 自定义 footer |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@panel-background-color | @white | - |
@panel-header-value-color | @red | - |
@panel-footer-padding | @padding-xs @padding-md | - |
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> <template #tip> 你的收货地址不支持同城送, <span @click="onClickEditAddress">修改地址</span> </template></van-submit-bar>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
price | 价格(单位分) | number | - |
decimal-length | 价格小数点位数 | number | string | 2 |
label | 价格左侧文案 | string | 合计: |
suffix-label | 价格右侧文案 | string | - |
text-align | 价格文案对齐方向,可选值为 left | string | right |
button-text | 按钮文字 | string | - |
button-type | 按钮类型 | string | danger |
button-color v2.9.1 | 自定义按钮颜色 | string | - |
tip | 在订单栏上方的提示文案 | string | - |
tip-icon | 提示文案左侧的图标名称或图片链接 | string | - |
currency | 货币符号 | string | ¥ |
disabled | 是否禁用按钮 | boolean | false |
loading | 是否显示将按钮显示为加载中状态 | boolean | false |
safe-area-inset-bottom | 是否开启底部安全区适配 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
submit | 按钮点击事件回调 | - |
名称 | 说明 |
---|---|
default | 自定义订单栏左侧内容 |
button v2.10.12 | 自定义按钮 |
top | 自定义订单栏上方内容 |
tip | 提示文案中的额外内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@submit-bar-height | 50px | - |
@submit-bar-z-index | 100 | - |
@submit-bar-background-color | @white | - |
@submit-bar-button-width | 110px | - |
@submit-bar-price-color | @red | - |
@submit-bar-price-font-size | @font-size-md | - |
@submit-bar-currency-font-size | @font-size-md | - |
@submit-bar-text-color | @text-color | - |
@submit-bar-text-font-size | @font-size-md | - |
@submit-bar-tip-padding | @padding-xs @padding-sm | - |
@submit-bar-tip-font-size | @font-size-sm | - |
@submit-bar-tip-line-height | 1.5 | - |
@submit-bar-tip-color | #f56723 | - |
@submit-bar-tip-background-color | #fff7cc | - |
@submit-bar-tip-icon-size | 12px | - |
@submit-bar-button-height | 40px | - |
@submit-bar-padding | 0 @padding-md | - |
@submit-bar-price-integer-font-size | 20px | - |
@submit-bar-price-font-family | @price-integer-font-family | - |
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-icon icon="shop-o" text="店铺" @click="onClickIcon" /> <van-goods-action-button type="danger" text="立即购买" @click="onClickButton" /></van-goods-action>
import { Toast } from 'vant';export default { methods: { onClickIcon() { Toast('点击图标'); }, onClickButton() { Toast('点击按钮'); }, },};
在 GoodsActionIcon 组件上设置 dot
属性后,会在图标右上角展示一个小红点。设置 badge
属性后,会在图标右上角展示相应的徽标。
<van-goods-action> <van-goods-action-icon icon="chat-o" text="客服" dot /> <van-goods-action-icon icon="cart-o" text="购物车" badge="5" /> <van-goods-action-icon icon="shop-o" text="店铺" badge="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="#ee0a24" /> <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>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
safe-area-inset-bottom | 是否开启底部安全区适配 | boolean | true |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 按钮文字 | string | - |
icon | 图标 | string | - |
color | 图标颜色 | string | #323233 |
icon-class | 图标额外类名 | any | - |
dot 2.5.5 | 是否显示图标右上角小红点 | boolean | false |
badge v2.5.6 | 图标右上角徽标的内容 | number | string | - |
info | 图标右上角徽标的内容(已废弃,请使用 badge 属性) | number | string | - |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
text | 按钮文字 | string | - |
type | 按钮类型,可选值为 primary info warning danger | string | default |
color | 按钮颜色,支持传入linear-gradient 渐变色 | string | - |
icon | 左侧图标名称或图片链接 | string | - |
disabled | 是否禁用按钮 | boolean | false |
loading | 是否显示为加载状态 | boolean | false |
url | 点击后跳转的链接地址 | string | - |
to | 点击后跳转的目标路由对象,同 vue-router 的 to 属性 | string | object | - |
replace | 是否在跳转时替换当前页面历史 | boolean | false |
名称 | 说明 |
---|---|
default | 文本内容 |
icon | 自定义图标 |
名称 | 说明 |
---|---|
default | 按钮显示内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@goods-action-background-color | @white | - |
@goods-action-height | 50px | - |
@goods-action-icon-width | 48px | - |
@goods-action-icon-height | 100% | - |
@goods-action-icon-color | @text-color | - |
@goods-action-icon-size | 18px | - |
@goods-action-icon-font-size | @font-size-xs | - |
@goods-action-icon-active-color | @active-color | - |
@goods-action-icon-text-color | @gray-7 | - |
@goods-action-button-height | 40px | - |
@goods-action-button-warning-color | @gradient-orange | - |
@goods-action-button-danger-color | @gradient-red | - |
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); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 单元格标题 | string | 优惠券 |
chosen-coupon | 当前选中优惠券的索引 | number | string | -1 |
coupons | 可用优惠券列表 | Coupon[] | [] |
editable | 能否切换优惠券 | boolean | true |
border | 是否显示内边框 | boolean | true |
currency | 货币符号 | string | ¥ |
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
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 | 是否显示兑换按钮加载动画 | boolean | false |
exchange-button-disabled | 是否禁用兑换按钮 | boolean | false |
exchange-min-length | 兑换码最小长度 | number | 1 |
displayed-coupon-index | 滚动至特定优惠券位置 | number | - |
show-close-button | 是否显示列表底部按钮 | boolean | true |
close-button-text | 列表底部按钮文字 | string | 不使用优惠 |
input-placeholder | 输入框文字提示 | string | 请输入优惠码 |
show-exchange-bar | 是否展示兑换栏 | boolean | true |
currency | 货币符号 | string | ¥ |
empty-image | 列表为空时的占位图 | string | https://img01.yzcdn.cn/vant/coupon-empty.png |
show-count | 是否展示可用 / 不可用数量 | boolean | true |
事件名 | 说明 | 回调参数 |
---|---|---|
change | 优惠券切换回调 | index, 选中优惠券的索引 |
exchange | 兑换优惠券回调 | code, 兑换码 |
键名 | 说明 | 类型 |
---|---|---|
id | 优惠券 id | string |
name | 优惠券名称 | string |
condition | 满减条件 | string |
startAt | 卡有效开始时间 (时间戳, 单位毫秒) | number |
endAt | 卡失效日期 (时间戳, 单位毫秒) | number |
description | 描述信息,优惠券可用时展示 | string |
reason | 不可用原因,优惠券不可用时展示 | string |
value | 折扣券优惠金额,单位分 | number |
valueDesc | 折扣券优惠金额文案 | string |
unitDesc | 单位文案 | string |
customValidPeriod | 自定义有效时间文案 | string |
名称 | 说明 |
---|---|
list-footer v2.12.21 | 优惠券列表底部 |
disabled-list-footer v2.12.21 | 不可用优惠券列表底部 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@coupon-margin | 0 @padding-sm @padding-sm | - |
@coupon-content-height | 84px | - |
@coupon-content-padding | 14px 0 | - |
@coupon-background-color | @white | - |
@coupon-active-background-color | @active-color | - |
@coupon-border-radius | @border-radius-lg | - |
@coupon-box-shadow | 0 0 4px rgba(0, 0, 0, 0.1) | - |
@coupon-head-width | 96px | - |
@coupon-amount-color | @red | - |
@coupon-amount-font-size | 30px | - |
@coupon-currency-font-size | 40% | - |
@coupon-name-font-size | @font-size-md | - |
@coupon-disabled-text-color | @gray-6 | - |
@coupon-description-padding | @padding-xs @padding-md | - |
@coupon-description-border-color | @border-color | - |
@coupon-list-background-color | @background-color | - |
@coupon-list-field-padding | 5px 0 5px @padding-md | - |
@coupon-list-exchange-button-height | 32px | - |
@coupon-list-close-button-height | 40px | - |
@coupon-list-empty-image-size | 200px | - |
@coupon-list-empty-tip-color | @gray-6 | - |
@coupon-list-empty-tip-font-size | @font-size-md | - |
@coupon-list-empty-tip-line-height | @line-height-md | - |
@coupon-cell-selected-text-color | @text-color | - |
展示联系人列表。
import Vue from 'vue';import { ContactList } from 'vant';Vue.use(ContactList);
<van-contact-list v-model="chosenContactId" :list="list" default-tag-text="默认" @add="onAdd" @edit="onEdit" @select="onSelect"/>
import { Toast } from 'vant';export default { data() { return { chosenContactId: '1', list: [ { id: '1', name: '张三', tel: '13000000000', isDefault: true, }, { id: '2', name: '李四', tel: '1310000000', }, ], }; }, methods: { onAdd() { Toast('新增'); }, onEdit(contact) { Toast('编辑' + contact.id); }, onSelect(contact) { Toast('选择' + contact.id); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中联系人的 id | number | string | - |
list | 联系人列表 | Contact[] | [] |
add-text | 新建按钮文案 | string | 新建联系人 |
default-tag-text | 默认联系人标签文案 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
add | 点击新增按钮时触发 | - |
edit | 点击编辑按钮时触发 | contact: Contact,index: number |
select | 切换选中的联系人时触发 | contact: Contact,index: number |
键名 | 说明 | 类型 |
---|---|---|
id | 每位联系人的唯一标识 | number | string |
name | 联系人姓名 | string |
tel | 联系人手机号 | number | string |
isDefault | 是否为默认联系人 | boolean |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@contact-list-edit-icon-size | 16px | - |
@contact-list-add-button-z-index | 999 | - |
@contact-list-item-padding | @padding-md | - |
编辑并保存联系人信息。
import Vue from 'vue';import { ContactEdit } from 'vant';Vue.use(ContactEdit);
<van-contact-edit is-edit show-set-default :contact-info="editingContact" set-default-label="设为默认联系人" @save="onSave" @delete="onDelete"/>
import { Toast } from 'vant';export default { data() { return { editingContact: {}, }; }, methods: { onSave(contactInfo) { Toast('保存'); }, onDelete(contactInfo) { Toast('删除'); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
contact-info | 联系人信息 | Contact | {} |
is-edit | 是否为编辑联系人 | boolean | false |
is-saving | 是否显示保存按钮加载动画 | boolean | false |
is-deleting | 是否显示删除按钮加载动画 | boolean | false |
tel-validator | 手机号格式校验函数 | (tel: string) => boolean | - |
show-set-default | 是否显示默认联系人栏 | boolean | false |
set-default-label | 默认联系人栏文案 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
save | 点击保存按钮时触发 | content:表单内容 |
delete | 点击删除按钮时触发 | content:表单内容 |
键名 | 说明 | 类型 |
---|---|---|
name | 联系人姓名 | string |
tel | 联系人手机号 | number | string |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@contact-edit-padding | @padding-md | - |
@contact-edit-fields-radius | @border-radius-md | - |
@contact-edit-buttons-padding | @padding-xl 0 | - |
@contact-edit-button-margin-bottom | @padding-sm | - |
@contact-edit-button-font-size | 16px | - |
@contact-edit-field-label-width | 4.1em | - |
以卡片的形式展示联系人信息。
import Vue from 'vue';import { ContactCard } from 'vant';Vue.use(ContactCard);
<van-contact-card type="add" @click="onAdd" />
import { Toast } from 'vant';export default { methods: { onAdd() { Toast('新增'); }, },};
<van-contact-card type="edit" :name="currentContact.name" :tel="currentContact.tel" @click="onEdit"/>
import { Toast } from 'vant';export default { data() { return { currentContact: { name: '张三', tel: '13000000000', }, }; }, methods: { onEdit() { Toast('编辑'); }, },};
<van-contact-card type="edit" name="张三" tel="13000000000" :editable="false" />
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
type | 卡片类型,可选值为 edit | string | add |
name | 联系人姓名 | string | - |
tel | 联系人手机号 | string | - |
add-text | 添加时的文案提示 | string | 添加联系人 |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@contact-card-padding | @padding-md | - |
@contact-card-add-icon-size | 40px | - |
@contact-card-add-icon-color | @blue | - |
@contact-card-value-line-height | @line-height-md | - |
商品卡片,用于展示商品的图片、价格等信息。
import Vue from 'vue';import { Card } from 'vant';Vue.use(Card);
<van-card num="2" price="2.00" desc="描述信息" title="商品标题" thumb="https://img01.yzcdn.cn/vant/ipad.jpeg"/>
通过 origin-price
设置商品原价,通过 tag
设置商品左上角标签。
<van-card num="2" tag="标签" price="2.00" desc="描述信息" title="商品标题" thumb="https://img01.yzcdn.cn/vant/ipad.jpeg" origin-price="10.00"/>
Card
组件提供了多个插槽,可以灵活地自定义内容。
<van-card num="2" price="2.00" desc="描述信息" title="商品标题" thumb="https://img01.yzcdn.cn/vant/ipad.jpeg"> <template #tags> <van-tag plain type="danger">标签</van-tag> <van-tag plain type="danger">标签</van-tag> </template> <template #footer> <van-button size="mini">按钮</van-button> <van-button size="mini">按钮</van-button> </template></van-card>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
thumb | 左侧图片 URL | string | - |
title | 标题 | string | - |
desc | 描述 | string | - |
tag | 图片角标 | string | - |
num | 商品数量 | number | string | - |
price | 商品价格 | number | string | - |
origin-price | 商品划线原价 | number | string | - |
centered | 内容是否垂直居中 | boolean | false |
currency | 货币符号 | string | ¥ |
thumb-link | 点击左侧图片后跳转的链接地址 | string | - |
lazy-load | 是否开启图片懒加载,须配合 Lazyload 组件使用 | boolean | false |
事件名 | 说明 | 回调参数 |
---|---|---|
click | 点击时触发 | event: Event |
click-thumb | 点击自定义图片时触发 | event: Event |
名称 | 说明 |
---|---|
title | 自定义标题 |
desc | 自定义描述 |
num | 自定义数量 |
price | 自定义价格 |
origin-price | 自定义商品原价 |
price-top | 自定义价格上方区域 |
bottom | 自定义价格下方区域 |
thumb | 自定义图片 |
tag | 自定义图片角标 |
tags | 自定义描述下方标签区域 |
footer | 自定义右下角内容 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@card-padding | @padding-xs @padding-md | - |
@card-font-size | @font-size-sm | - |
@card-text-color | @text-color | - |
@card-background-color | @background-color-light | - |
@card-thumb-size | 88px | - |
@card-thumb-border-radius | @border-radius-lg | - |
@card-title-line-height | 16px | - |
@card-desc-color | @gray-7 | - |
@card-desc-line-height | @line-height-md | - |
@card-price-color | @gray-8 | - |
@card-origin-price-color | @gray-6 | - |
@card-num-color | @gray-6 | - |
@card-origin-price-font-size | @font-size-xs | - |
@card-price-font-size | @font-size-sm | - |
@card-price-integer-font-size | @font-size-lg | - |
@card-price-font-family | @price-integer-font-family | - |
省市区三级联动选择,通常与弹出层组件配合使用。
import Vue from 'vue';import { Area } from 'vant';Vue.use(Area);
初始化省市区组件时,需要通过 area-list
属性传入省市区数据。
<van-area title="标题" :area-list="areaList" />
areaList 为对象结构,包含 province_list
、city_list
、county_list
三个 key。
每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两位代表省份,中间两位代表城市,后两位代表区县,以 0 补足 6 位。比如北京的地区码为 11
,以 0 补足 6 位,为 110000
。
示例数据如下:
const areaList = { province_list: { 110000: '北京市', 120000: '天津市', }, city_list: { 110100: '北京市', 120100: '天津市', }, county_list: { 110101: '东城区', 110102: '西城区', // .... },};
Vant 官方提供了一份默认的省市区数据,可以通过 @vant/area-data 引入:
yarn add @vant/area-data
import { areaList } from '@vant/area-data';export default { data() { return { areaList }; },};
如果想选中某个省市区,需要传入一个 value
属性,绑定对应的省市区 code
。
<van-area title="标题" :area-list="areaList" value="110101" />
可以通过 columns-num
属性配置省市区显示的列数,默认情况下会显示省市区,当你设置为 2
,则只会显示省市选择。
<van-area title="标题" :area-list="areaList" :columns-num="2" />
可以通过 columns-placeholder
属性配置每一列的占位提示文字。
<van-area title="标题" :area-list="areaList" :columns-placeholder="['请选择', '请选择', '请选择']"/>
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 当前选中的省市区code | string | - |
title | 顶部栏标题 | string | - |
confirm-button-text | 确认按钮文字 | string | 确认 |
cancel-button-text | 取消按钮文字 | string | 取消 |
area-list | 省市区数据,格式见下方 | object | - |
columns-placeholder | 列占位提示文字 | string[] | [] |
loading | 是否显示加载状态 | boolean | false |
readonly v2.10.5 | 是否为只读状态,只读状态下无法切换选项 | boolean | false |
item-height v2.8.6 | 选项高度,支持 px vw vh rem 单位,默认 px | number | string | 44 |
columns-num | 显示列数,3-省市区,2-省市,1-省 | number | string | 3 |
visible-item-count | 可见的选项个数 | number | string | 6 |
swipe-duration | 快速滑动时惯性滚动的时长,单位ms | number | string | 1000 |
is-oversea-code | 根据code 校验海外地址,海外地址会划分至单独的分类 | () => boolean | - |
事件 | 说明 | 回调参数 |
---|---|---|
confirm | 点击右上方完成按钮 | 一个数组参数,具体格式看下方数据格式章节 |
cancel | 点击取消按钮时 | - |
change | 选项改变时触发 | Picker 实例,所有列选中值,当前列对应的索引 |
名称 | 说明 |
---|---|
title v2.5.3 | 自定义标题内容 |
columns-top v2.5.3 | 自定义选项上方内容 |
columns-bottom v2.5.3 | 自定义选项下方内容 |
返回的数据整体为一个数组,数组内包含 columnsNum
个数据, 每个数据对应一列选项中被选中的数据。
code
代表被选中的地区编码, name
代表被选中的地区名称
[ { code: '110000', name: '北京市', }, { code: '110100', name: '北京市', }, { code: '110101', name: '东城区', },];
参见桌面端适配。
展示收货地址列表。
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 室', isDefault: true, }, { id: '2', name: '李四', tel: '1310000000', address: '浙江省杭州市拱墅区莫干山路 50 号', }, ], disabledList: [ { id: '3', name: '王五', tel: '1320000000', address: '浙江省杭州市滨江区江南大道 15 号', }, ], }; }, methods: { onAdd() { Toast('新增地址'); }, onEdit(item, index) { Toast('编辑地址:' + index); }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
v-model | 当前选中地址的 id | string | - |
list | 地址列表 | Address[] | [] |
disabled-list | 不可配送地址列表 | Address[] | [] |
disabled-text | 不可配送提示文案 | string | - |
switchable | 是否允许切换地址 | boolean | true |
add-button-text | 底部按钮文字 | string | 新增地址 |
default-tag-text | 默认地址标签文字 | string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
add | 点击新增按钮时触发 | - |
edit | 点击编辑按钮时触发 | item: 地址对象,index: 索引 |
select | 切换选中的地址时触发 | item: 地址对象,index: 索引 |
edit-disabled | 编辑不可配送的地址时触发 | item: 地址对象,index: 索引 |
select-disabled | 选中不可配送的地址时触发 | item: 地址对象,index: 索引 |
click-item | 点击任意地址时触发 | item: 地址对象,index: 索引 |
键名 | 说明 | 类型 |
---|---|---|
id | 每条地址的唯一标识 | number | string |
name | 收货人姓名 | string |
tel | 收货人手机号 | number | string |
address | 收货地址 | string |
isDefault | 是否为默认地址 | boolean |
名称 | 说明 | 参数 |
---|---|---|
default | 在列表下方插入内容 | - |
top | 在顶部插入内容 | - |
item-bottom v2.5.0 | 在列表项底部插入内容 | 列表项的值 |
tag v2.12.9 | 列表项标签内容自定义 | 列表项的值 |
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@address-list-padding | @padding-sm @padding-sm 80px | - |
@address-list-disabled-text-color | @gray-6 | - |
@address-list-disabled-text-padding | @padding-base * 5 0 @padding-md | - |
@address-list-disabled-text-font-size | @font-size-md | - |
@address-list-disabled-text-line-height | @line-height-md | - |
@address-list-add-button-z-index | 999 | - |
@address-list-item-padding | @padding-sm | - |
@address-list-item-text-color | @text-color | - |
@address-list-item-disabled-text-color | @gray-5 | - |
@address-list-item-font-size | 13px | - |
@address-list-item-line-height | @line-height-sm | - |
@address-list-item-radio-icon-color | @red | - |
@address-list-edit-icon-size | 20px | - |
收货地址编辑组件,用于新建、更新、删除收货地址。
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 = []; } }, },};
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
area-list | 地区列表 | object | - |
area-columns-placeholder | 地区选择列占位提示文字 | string[] | [] |
area-placeholder v2.6.1 | 地区输入框占位提示文字 | string | 选择省 / 市 / 区 |
address-info | 收货人信息初始值 | AddressInfo | {} |
search-result | 详细地址搜索结果 | SearchResult[] | [] |
show-postal | 是否显示邮政编码 | boolean | false |
show-delete | 是否显示删除按钮 | boolean | false |
show-set-default | 是否显示默认地址栏 | boolean | false |
show-search-result | 是否显示搜索结果 | boolean | false |
show-area | 是否显示地区 | boolean | true |
show-detail | 是否显示详细地址 | boolean | true |
disable-area v2.5.0 | 是否禁用地区选择 | boolean | false |
save-button-text | 保存按钮文字 | string | 保存 |
delete-button-text | 删除按钮文字 | string | 删除 |
detail-rows | 详细地址输入框行数 | number | string | 1 |
detail-maxlength | 详细地址最大长度 | number | string | 200 |
is-saving | 是否显示保存按钮加载动画 | boolean | false |
is-deleting | 是否显示删除按钮加载动画 | boolean | false |
tel-validator | 手机号格式校验函数 | string => boolean | - |
tel-maxlength v2.10.0 | 手机号最大长度 | number | string | - |
postal-validator | 邮政编码格式校验函数 | string => boolean | - |
validator | 自定义校验函数 | (key, val) => string | - |
事件名 | 说明 | 回调参数 |
---|---|---|
save | 点击保存按钮时触发 | content:表单内容 |
focus | 输入框聚焦时触发 | key: 聚焦的输入框对应的 key |
delete | 确认删除地址时触发 | content:表单内容 |
cancel-delete | 取消删除地址时触发 | content:表单内容 |
select-search | 选中搜索结果时触发 | value: 搜索结果 |
click-area v2.5.9 | 点击收件地区时触发 | - |
change-area | 修改收件地区时触发 | values: 地区信息 |
change-detail | 修改详细地址时触发 | value: 详细地址内容 |
change-default | 切换是否使用默认地址时触发 | value: 是否选中 |
名称 | 说明 |
---|---|
default | 在邮政编码下方插入内容 |
通过 ref 可以获取到 AddressEdit 实例并调用实例方法,详见组件实例方法。
方法名 | 说明 | 参数 | 返回值 |
---|---|---|---|
setAddressDetail | 设置详细地址 | addressDetail: string | - |
注意:AddressInfo 仅作为初始值传入,表单最终内容可以在 save 事件中获取
key | 说明 | 类型 |
---|---|---|
id | 每条地址的唯一标识 | number | string |
name | 收货人姓名 | string |
tel | 收货人手机号 | string |
province | 省份 | string |
city | 城市 | string |
county | 区县 | string |
addressDetail | 详细地址 | string |
areaCode | 地区编码,通过省市区选择 获取(必填) | string |
postalCode | 邮政编码 | string |
isDefault | 是否为默认地址 | boolean |
key | 说明 | 类型 |
---|---|---|
name | 地名 | string |
address | 详细地址 | string |
请参考 Area 组件。
组件提供了下列 Less 变量,可用于自定义样式,使用方法请参考主题定制。
名称 | 默认值 | 描述 |
---|---|---|
@address-edit-padding | @padding-sm | - |
@address-edit-buttons-padding | @padding-xl @padding-base | - |
@address-edit-button-margin-bottom | @padding-sm | - |
@address-edit-detail-finish-color | @blue | - |
@address-edit-detail-finish-font-size | @font-size-sm | - |