Skip to content

Cell 单元格 - Vant 4

Cell 单元格

🎯 介绍

Cell 单元格就像是移动应用界面中的"万能积木" 🧱!它是构建列表页面的基础元素,就像乐高积木一样,可以自由组合搭建出各种精美的界面。

无论是设置页面的选项列表、联系人信息展示,还是商品详情的属性说明,Cell 都能以简洁优雅的方式呈现信息,让复杂的数据变得井井有条 ✨。它就像一个贴心的"信息管家",帮你把内容整理得清晰明了!

📦 引入

通过以下方式来全局注册组件,更多注册方式请参考组件注册

js
import { createApp } from'vue'; import { Cell, CellGroup } from'vant'; const app = createApp(); app.use(Cell); app.use(CellGroup);

🚀 代码演示

基础用法

Cell 就像一个独立的"小房间" 🏠,可以单独存在,也可以和兄弟姐妹们住在 CellGroup 这个"大家庭"里。

当 Cell 们聚在一起时,CellGroup 就像一个贴心的"管家",为它们提供统一的边框装饰,让整个列表看起来更加整齐美观 ✨。

html

卡片风格

想要让你的列表更有现代感?🎨 通过 CellGroupinset 属性,就能瞬间把普通的列表变成时尚的圆角卡片!

这种卡片风格就像给内容穿上了一件优雅的"外套",让信息展示更加精致,特别适合现代化的应用设计 💫。

html

单元格大小

想要调整 Cell 的"身材"?💪 通过 size 属性就能轻松控制!

就像给衣服选择尺码一样,你可以让 Cell 变得更紧凑或更宽松,完美适配不同的设计需求 👔。

html

展示图标

为你的 Cell 添加一个醒目的"小徽章"!🎖️ 通过 icon 属性,可以在标题左侧放置各种精美的图标。

这些小图标就像是内容的"身份证",让用户一眼就能识别不同类型的信息,提升界面的可读性和美观度 ✨。

html

展示箭头

想要暗示用户"这里可以点击"?👆 设置 is-link 属性后,Cell 右侧就会出现一个优雅的小箭头!

而且这个箭头还很"听话",通过 arrow-direction 属性可以让它指向上下左右任意方向,就像一个贴心的"导航员" 🧭。

html

页面导航

让你的 Cell 变身"传送门"!🚪 通过 url 属性可以实现网页跳转,或者用 to 属性进行路由导航。

就像给每个 Cell 都装上了"小火箭",用户轻轻一点就能飞到目标页面,体验丝滑的页面切换 🚀。

html

分组标题

想要给你的列表加个"小标签"?🏷️ 通过 CellGrouptitle 属性就能为一组 Cell 添加醒目的标题。

这个标题就像是"章节名",帮助用户快速理解下面内容的分类,让信息结构更加清晰明了 📚。

html

使用插槽

当标准配置无法满足你的创意时,插槽就是你的"魔法工具箱"!🎩✨

通过插槽可以自由定制 Cell 的任何部分,让你的想象力尽情发挥,打造独一无二的界面效果 🎨。

html

垂直居中

追求完美对齐?通过 center 属性可以让 Cell 的左侧图标与右侧内容都完美垂直居中!

就像给内容们排了一个整齐的"队列",无论高矮胖瘦都能站在同一条水平线上,看起来特别舒服 😌。

html

API

CellGroup Props

参数说明类型默认值
title分组标题string-
inset是否展示为圆角卡片风格booleanfalse
border是否显示外边框booleantrue

Cell Props

参数说明类型默认值
title左侧标题*numberstring*
value右侧内容*numberstring*
label标题下方的描述信息*numberstring*
size单元格大小,可选值为 large``normalstring-
icon左侧图标名称或图片链接,等同于 Icon 组件的 name 属性string-

| icon-prefix | 图标类名前缀,等同于 Icon 组件的 class-prefix 属性 | string | van-icon |

| tag | 根节点对应的 HTML 标签名 | string | div | | url | 点击后跳转的链接地址 | string | - | | to | 点击后跳转的目标路由对象,等同于 Vue Router 的 to 属性 | string | object | - |

| border | 是否显示内边框 | boolean | true | | replace | 是否在跳转时替换当前页面历史 | boolean | false | | clickable | 是否开启点击反馈 | boolean | null | | is-link | 是否展示右侧箭头并开启点击反馈 | boolean | false | | required | 是否显示表单必填星号 | boolean | false | | center | 是否使内容垂直居中 | boolean | false | | arrow-direction | 箭头方向,可选值为 left``up``down | string | right | | title-style | 左侧标题额外样式 | string | Array | object | - | | title-class | 左侧标题额外类名 | string | Array | object | - | | value-class | 右侧内容额外类名 | string | Array | object | - | | label-class | 描述信息额外类名 | string | Array | object | - |

Cell Events

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

CellGroup Slots

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

Cell Slots

名称说明
title自定义左侧标题
value自定义右侧内容
label自定义标题下方的描述信息
icon自定义左侧图标
right-icon自定义右侧图标
extra自定义单元格最右侧的额外内容

类型定义

组件导出以下类型定义:

ts
importtype { CellSize, CellProps, CellGroupProps, CellArrowDirection, } from'vant';

主题定制

样式变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件

名称默认值描述
--van-cell-font-sizevar(--van-font-size-md)-
--van-cell-line-height24px-
--van-cell-vertical-padding10px-
--van-cell-horizontal-paddingvar(--van-padding-md)-
--van-cell-text-colorvar(--van-text-color)-
--van-cell-backgroundvar(--van-background-2)-
--van-cell-border-colorvar(--van-border-color)-
--van-cell-active-colorvar(--van-active-color)-
--van-cell-required-colorvar(--van-danger-color)-
--van-cell-label-colorvar(--van-text-color-2)-
--van-cell-label-font-sizevar(--van-font-size-sm)-
--van-cell-label-line-heightvar(--van-line-height-sm)-
--van-cell-label-margin-topvar(--van-padding-base)-
--van-cell-value-colorvar(--van-text-color-2)-
--van-cell-value-font-sizeinherit-
--van-cell-icon-size16px-
--van-cell-right-icon-colorvar(--van-gray-6)-
--van-cell-large-vertical-paddingvar(--van-padding-sm)-
--van-cell-large-title-font-sizevar(--van-font-size-lg)-
--van-cell-large-label-font-sizevar(--van-font-size-md)-
--van-cell-large-value-font-sizeinherit-
--van-cell-group-backgroundvar(--van-background-2)-
--van-cell-group-title-colorvar(--van-text-color-2)-
--van-cell-group-title-paddingvar(--van-padding-md) var(--van-padding-md) var(--van-padding-xs)-
--van-cell-group-title-font-sizevar(--van-font-size-md)-
--van-cell-group-title-line-height16px-
--van-cell-group-inset-padding0 var(--van-padding-md)-
--van-cell-group-inset-radiusvar(--van-radius-lg)-
--van-cell-group-inset-title-paddingvar(--van-padding-md) var(--van-padding-md) var(--van-padding-xs) var(--van-padding-xl)-

最佳实践

信息层级设计

合理的信息层级能让用户快速获取关键信息 📋。建议遵循以下原则:

html
<!-- ✅ 推荐:清晰的信息层级 -->
<van-cell-group title="个人信息">
  <van-cell title="姓名" value="张三" />
  <van-cell title="手机号" value="138****8888" label="已验证" />
  <van-cell title="邮箱" value="zhangsan@example.com" label="未验证" />
</van-cell-group>

<!-- ❌ 避免:信息过于冗长 -->
<van-cell title="这是一个非常非常长的标题,可能会影响用户体验和界面美观度" />

交互状态设计

明确的交互提示能提升用户体验 ✨:

html
<!-- ✅ 推荐:明确的交互提示 -->
<van-cell title="设置" is-link />
<van-cell title="帮助中心" is-link url="/help" />
<van-cell title="退出登录" @click="logout" />

<!-- ✅ 推荐:合理使用图标 -->
<van-cell title="消息通知" icon="bell-o" is-link />
<van-cell title="隐私设置" icon="shield-o" is-link />

性能优化小贴士

长列表优化

对于包含大量 Cell 的长列表,建议配合虚拟滚动技术:

html
<!-- 对于超长列表,建议配合 List 组件使用 -->
<van-list v-model:loading="loading" @load="onLoad">
  <van-cell-group v-for="group in dataList" :key="group.id">
    <van-cell 
      v-for="item in group.items" 
      :key="item.id"
      :title="item.title"
      :value="item.value"
    />
  </van-cell-group>
</van-list>

事件处理优化

使用事件委托减少内存占用:

javascript
// ✅ 推荐:使用事件委托
const handleCellClick = (item) => {
  // 统一处理点击事件
  router.push(`/detail/${item.id}`);
};

// ❌ 避免:为每个 Cell 绑定独立事件处理器

设计建议

视觉层次

  • 标题:使用简洁明了的文字,避免过长 📝
  • 描述:提供必要的补充信息,使用较小字号 📄
  • 图标:选择语义明确的图标,保持风格统一 🎨
  • 间距:合理使用 size 属性控制信息密度 📏

交互反馈

  • 可点击的 Cell 应该设置 is-link 属性 👆
  • 重要操作可以使用不同的箭头方向提示 ➡️
  • 适当使用 center 属性保持视觉平衡 ⚖️

常见问题解决

Q: 如何实现 Cell 的条件渲染?

html
<van-cell-group>
  <van-cell 
    v-if="user.isVip" 
    title="VIP特权" 
    icon="diamond-o" 
    is-link 
  />
  <van-cell title="普通功能" is-link />
</van-cell-group>

Q: 如何自定义 Cell 的右侧内容?

html
<van-cell title="自定义右侧">
  <template #right-icon>
    <van-switch v-model="checked" />
  </template>
</van-cell>

Q: 如何实现 Cell 的动态样式?

html
<van-cell 
  :title="item.title"
  :class="{ 'highlight': item.isImportant }"
/>

<style>
.highlight {
  background-color: #fff7e6;
  border-left: 3px solid #ff9500;
}
</style>

Q: 如何处理长文本内容?

html
<!-- 使用 label 显示详细信息 -->
<van-cell 
  title="商品名称"
  value="iPhone 14 Pro Max"
  label="深空黑色 256GB 支持5G网络"
/>

<!-- 或使用插槽自定义布局 -->
<van-cell title="描述">
  <template #value>
    <div class="multi-line-text">
      这是一段很长的描述文字...
    </div>
  </template>
</van-cell>

相关组件

延伸阅读

基于Vant构建的企业级移动端解决方案