Vant 4 ContactCard 联系人卡片组件完全指南:从引入注册到主题定制
2026/9/13 1:43:53 网站建设 项目流程

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 区域,并分别设置iconcenterborder={false}isLinktitleClass等属性。因此 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"并传入nametel展示姓名和手机号:

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

nametel均使用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,为trueemit('click', event);同时isLink={props.editable}决定是否显示右侧箭头;
  • 文案国际化addContact文案在 locale/lang 目录 下随语言包提供,如ar-SA.ts中为 "إضافة جهة اتصال"、bg-BG.ts中为 "Добавяне на контакт" 等,默认英文为 "Add contact info"(中文为"添加联系人")。

单元测试同样印证了上述行为(test/index.spec.ts):默认情况下trigger('click')后断言click事件被触发一次;而当editablefalse时再次点击,断言emitted('click')为空。

API 详解

Props

以下参数表格完整来自官方文档,并补充了源码 ContactCard.tsx 中的实现细节:

属性说明类型默认值
type卡片类型,可选值为editadd为默认添加态)stringadd
name联系人姓名(edit类型下展示)string-
tel联系人手机号(edit类型下展示)string-
add-text添加卡片时的文案提示(add类型下展示)stringAdd contact info
editable是否允许编辑联系人,控制点击事件与右侧箭头booleantrue

源码中对应声明为:

  • type使用makeStringProp<ContactCardType>('add'),类型收窄为'add' | 'edit'(ContactCard.tsx);
  • nametel均为String类型;
  • addTextString,为空时走国际化兜底;
  • editable使用truthProp,默认值为true

Events

事件说明回调参数
click点击组件时触发(editablefalse时不触发)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-paddingvar(--van-padding-md)卡片内边距
--van-contact-card-add-icon-size40px添加态图标尺寸
--van-contact-card-add-icon-colorvar(--van-primary-color)添加态图标颜色
--van-contact-card-title-line-heightvar(--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-cardpadding--van-contact-card-padding控制;
  • .van-contact-card__titleline-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-gradientbackground-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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询