请参考 快速上手 章节
修改代码请阅读我们的 开发指南
使用过程中发现任何问题都可以提 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: 是否选中开关 |