Vant 4 ContactCard 联系人卡片组件完全指南:从引入注册到主题定制
【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vant
ContactCard(联系人卡片)是 Vant 4 移动端组件库中用于在表单类页面(如结算、地址确认、联系人管理)以卡片形式展示和编辑联系人信息的轻量组件。本文基于仓库中 ContactCard 官方文档 与其源码实现,系统讲解组件的注册引入、添加/编辑/只读三种典型用法、完整 Props 与 Events API、类型定义,并结合 ContactCard.tsx 与 index.less 剖析其底层基于 Cell 的渲染机制、可编辑状态控制和主题定制方式,帮助你在实际业务中快速落地一个可复用的联系人卡片。
组件介绍与适用场景
根据官方文档,ContactCard 的核心定位是"Display contact information in the form of cards"(以卡片形式展示联系人信息)。它是一个轻量展示型组件,常用于以下业务场景:
- 结算页 / 下单页展示默认收货联系人或紧急联系人;
- 联系人管理页作为"添加联系人"入口;
- 联系人详情页以只读形式展示姓名与电话,点击后进入编辑流程。
从组件实现看,ContactCard.tsx 内部直接复用了 Vant 的 Cell 单元格 组件,通过v-slots将卡片内容注入 Cell 的 title 区域,并分别设置icon、center、border={false}、isLink、titleClass等属性。因此 ContactCard 天然继承了 Cell 的布局能力、点击反馈(role="button"、tabindex)与右侧箭头(arrow)图标渲染逻辑,无需重复实现。
安装与组件注册
ContactCard 随 Vant 主包发布,只需安装vant即可使用。官方文档给出的注册方式是全局注册:
import { createApp } from 'vue'; import { ContactCard } from 'vant'; const app = createApp(); app.use(ContactCard);注册后即可在模板中直接使用<van-contact-card />。这一能力来自 index.ts 中的withInstall封装(实现在 packages/vant/src/utils/with-install.ts),它会为组件挂载install方法,同时导出命名导出ContactCard与默认导出。此外,index.ts 中还通过declare module 'vue'声明了VanContactCard全局组件类型,因此在 TS 环境下模板中使用<van-contact-card>也能获得完整的类型提示。
除了全局注册,Vant 还支持按需引入等更多注册方式(见 组件注册说明),可按项目实际需要选择。
典型用法
文档提供了三个最核心的使用场景,以下逐一展开并结合 官方 Demo 说明。
添加联系人
当页面处于"尚无联系人"状态时,使用type="add"渲染一个添加入口卡片:
<van-contact-card type="add" @click="onAdd" />import { showToast } from 'vant'; export default { setup() { const onAdd = () => showToast('add'); return { onAdd, }; }, };点击卡片会触发click事件,业务侧可在回调中弹出添加联系人表单(Demo 中仅以 Toast 占位示意)。
编辑联系人
已有联系人数据时,使用type="edit"并传入name与tel展示姓名和手机号:
<van-contact-card type="edit" :tel="tel" :name="name" @click="onEdit" />import { ref } from 'vue'; import { showToast } from 'vant'; export default { setup() { const tel = ref('13000000000'); const name = ref('John Snow'); const onEdit = () => showToast('edit'); return { tel, name, onEdit, }; }, };name与tel均使用ref维护响应式数据,实际项目中通常来自接口返回或全局状态。
不可编辑(只读展示)
当联系人不可修改(例如订单快照、历史记录)时,将editable设为false:
<van-contact-card type="edit" name="John Snow" tel="13000000000" :editable="false" />此模式下卡片不再呈现"可点击"视觉(右侧箭头消失),且点击不会触发click事件。
行为差异的源码印证
这三种形态的差异在源码中都有明确对应(ContactCard.tsx):
- 渲染内容:
type="add"时渲染props.addText,未传时回退到国际化文案t('addContact');type="edit"时渲染两行内容姓名:xxx与电话:xxx; - 左侧图标:
edit类型使用contact图标,add类型使用add-square图标; - 可编辑控制:
onClick中先判断props.editable,为true才emit('click', event);同时isLink={props.editable}决定是否显示右侧箭头; - 文案国际化:
addContact文案在 locale/lang 目录 下随语言包提供,如ar-SA.ts中为 "إضافة جهة اتصال"、bg-BG.ts中为 "Добавяне на контакт" 等,默认英文为 "Add contact info"(中文为"添加联系人")。
单元测试同样印证了上述行为(test/index.spec.ts):默认情况下trigger('click')后断言click事件被触发一次;而当editable为false时再次点击,断言emitted('click')为空。
API 详解
Props
以下参数表格完整来自官方文档,并补充了源码 ContactCard.tsx 中的实现细节:
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| type | 卡片类型,可选值为edit(add为默认添加态) | string | add |
| name | 联系人姓名(edit类型下展示) | string | - |
| tel | 联系人手机号(edit类型下展示) | string | - |
| add-text | 添加卡片时的文案提示(add类型下展示) | string | Add contact info |
| editable | 是否允许编辑联系人,控制点击事件与右侧箭头 | boolean | true |
源码中对应声明为:
type使用makeStringProp<ContactCardType>('add'),类型收窄为'add' | 'edit'(ContactCard.tsx);name、tel均为String类型;addText为String,为空时走国际化兜底;editable使用truthProp,默认值为true。
Events
| 事件 | 说明 | 回调参数 |
|---|---|---|
| click | 点击组件时触发(editable为false时不触发) | event: MouseEvent |
组件通过emits: ['click']声明(ContactCard.tsx),回调携带原生MouseEvent对象。
类型定义
组件对外导出以下 TypeScript 类型(见 index.ts):
import type { ContactCardType, ContactCardProps } from 'vant';ContactCardType:'add' | 'edit'联合类型;ContactCardProps:由ExtractPropTypes<typeof contactCardProps>推导的完整 Props 类型;- 另有
ContactCardThemeVars(见 types.ts),用于主题变量类型约束。
主题定制与样式变量
ContactCard 提供 4 个 CSS 变量用于样式定制,默认值定义在 index.less 的:root, :host中,与官方文档表格完全一致:
| 名称 | 默认值 | 说明 |
|---|---|---|
| --van-contact-card-padding | var(--van-padding-md) | 卡片内边距 |
| --van-contact-card-add-icon-size | 40px | 添加态图标尺寸 |
| --van-contact-card-add-icon-color | var(--van-primary-color) | 添加态图标颜色 |
| --van-contact-card-title-line-height | var(--van-line-height-md) | 标题行高 |
:root { --van-contact-card-padding: 16px; --van-contact-card-add-icon-size: 48px; --van-contact-card-add-icon-color: #ee0a24; --van-contact-card-title-line-height: 24px; }官方推荐通过 ConfigProvider 配置式组件 统一管理这类主题变量。变量在 index.less 中的实际作用包括:
.van-contact-card的padding由--van-contact-card-padding控制;.van-contact-card__title的line-height与左侧margin-left: 5px共同保证两行文本对齐;--add修饰类下,左侧图标(.van-cell__left-icon)使用--van-contact-card-add-icon-color与--van-contact-card-add-icon-size;- 组件底部通过
::before伪元素绘制了一条由警告色与主题色组成的 45° 斜纹渐变条纹(repeating-linear-gradient,background-size: 80px),形成 Vant 联系人卡片标志性的视觉分隔带。
小结
ContactCard 是 Vant 4 中一个"小而精"的表单配套组件:对外仅暴露 5 个 Props 和 1 个事件,却完整覆盖了添加入口、编辑展示、只读快照三种业务形态。其实现巧妙地复用 Cell 组件与多语言文案体系,配合editable对点击事件和箭头图标的双重控制,以及通过 4 个 CSS 变量即可完成的主题定制,使开发者能够以极低的成本将联系人交互无缝接入移动端表单流程。
【免费下载链接】vantA lightweight, customizable Vue UI library for mobile web apps.项目地址: https://gitcode.com/GitHub_Trending/va/vant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考