三、核心组件详解
Vant Weapp提供了超过50个高质量组件,以下是开发中最常用的核心组件及其详细用法。
3.1 基础组件
3.1.1 Button按钮组件
Button是用户交互中最基础的组件,Vant Weapp提供了丰富的样式和状态。
<!-- 按钮类型 -->
<van-button type="primary">主要按钮</van-button>
<van-button type="default">默认按钮</van-button>
<van-button type="warning">警告按钮</van-button>
<van-button type="danger">危险按钮</van-button>
<van-button type="info">信息按钮</van-button>
<!-- 按钮尺寸 -->
<van-button size="large">大号按钮</van-button>
<van-button size="normal">普通按钮</van-button>
<van-button size="small">小型按钮</van-button>
<van-button size="mini">迷你按钮</van-button>
<!-- 按钮状态 -->
<van-button disabled>禁用按钮</van-button>
<van-button loading>加载按钮</van-button>
<!-- 块级按钮 -->
<van-button block>块级按钮</van-button>
<!-- 方形按钮 -->
<van-button square>方形按钮</van-button>
<!-- 自定义颜色 -->
<van-button color="#7232dd">自定义颜色按钮</van-button>
Button组件核心属性说明:type定义按钮的视觉类型;size控制按钮尺寸;disabled使按钮不可交互;loading显示加载动画;block使按钮宽度占满父容器;square使按钮无圆角。
3.1.2 Cell单元格组件
Cell是列表展示的基础组件,适用于信息展示和页面导航。
<!-- 基础单元格 -->
<van-cell title="单元格标题" value="单元格内容" />
<!-- 带图标的单元格 -->
<van-cell title="单元格" icon="location-o" />
<!-- 带箭头的单元格(用于导航) -->
<van-cell title="单元格" is-link />
<!-- 带描述的单元格 -->
<van-cell title="单元格" label="描述信息" value="内容" />
<!-- 单元格组 -->
<van-cell-group title="分组标题">
<van-cell title="单元格1" value="内容1" />
<van-cell title="单元格2" value="内容2" />
</van-cell-group>
<!-- 自定义内容 -->
<van-cell title="单元格" value="内容" label="描述信息" border>
<view class="custom-content">自定义内容</view>
</van-cell>
Cell组件核心特性:支持左侧图标(icon),支持右侧箭头(is-link),支持辅助描述(label),支持分组展示(van-cell-group)。
3.1.3 Icon图标组件
Vant Weapp内置了大量常用的图标,使用方便。
<!-- 基础图标 -->
<van-icon name="chat" />
<!-- 自定义颜色和大小 -->
<van-icon name="chat" color="red" size="30px" />
<!-- 使用图片URL -->
<van-icon name="https://example.com/icon.png" />
<!-- 图标徽标 -->
<van-icon name="chat" dot />
<van-icon name="chat" badge="5" />
Vant Weapp内置了超过200个高质量的图标,涵盖了移动端开发的常见场景。
3.2 表单组件
3.2.1 Field输入框
Field是表单交互的核心组件,支持多种输入类型和验证功能。
<!-- 基础输入框 -->
<van-field value="{
{ value }}" placeholder="请输入内容" bind:change="onChange" />
<!-- 去除iOS默认内边距 -->
<van-field
value="{
{ value }}"
placeholder="请输入内容"
disable-default-padding
/>
<!-- 配合always-embed实现同层渲染(iOS兼容)-->
<van-field
value="{
{ value }}"
placeholder="请输入内容"
always-embed
/>
<!-- 文本域 -->
<van-field
value="{
{ value }}"
type="textarea"
placeholder="请输入内容"
rows="3"
autosize
/>
<!-- 带验证状态的输入框 -->
<van-field
value="{
{ value }}"
placeholder="请输入用户名"
error-message="用户名格式不正确"
/>
<!-- 密码输入框 -->
<van-field
value="{
{ password }}"
type="password"
placeholder="请输入密码"
right-icon="eye-o"
/>
Field组件的重要注意事项:
iOS平台输入框默认存在内边距(padding),可通过disable-default-padding属性去除
配合always-embed属性可实现iOS同层渲染,解决focus时切换至非同层状态的问题
使用auto-height属性解决textare在iOS上自动换行时高度计算偏差的问题
3.2.2 Checkbox复选框
<!-- 基础复选框 -->
<van-checkbox value="{
{ checked }}" bind:change="onChange">复选框</van-checkbox>
<!-- 复选框组 -->
<van-checkbox-group value="{
{ checkedList }}" max="{
{ 2 }}" bind:change="onChange">
<van-checkbox name="a">选项一</van-checkbox>
<van-checkbox name="b">选项二</van-checkbox>
<van-checkbox name="c">选项三</van-checkbox>
</van-checkbox-group>
max属性用于限制最大可选数量,超出后其他复选框自动禁用。
3.2.3 Radio单选框
<van-radio-group value="{
{ radio }}" bind:change="onChange">
<van-radio name="a">选项一</van-radio>
<van-radio name="b">选项二</van-radio>
<van-radio name="c">选项三</van-radio>
</van-radio-group>
3.2.4 Switch开关
<van-switch checked="{
{ checked }}" size="22px" bind:change="onChange" />
3.3 布局组件
3.3.1 Grid宫格
Grid组件提供了灵活的网格布局能力,支持自定义列数、间距和内容排版。
<van-grid column-num="3" border>
<van-grid-item icon="home-o" text="首页" />
<van-grid-item icon="search" text="搜索" />
<van-grid-item icon="friends-o" text="朋友" />
<van-grid-item icon="setting-o" text="设置" />
</van-grid>
在各种屏幕尺寸下均能保持良好的布局一致性,文字溢出时会自动省略处理。
3.3.2 Tabbar标签栏
Tabbar组件是小程序底部导航的常用实现方式,支持多种自定义配置。
<van-tabbar active="{
{ active }}" bind:change="onChange">
<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>
使用建议:结合自定义tabBar功能时,需注意页面栈管理问题。
3.4 反馈组件
3.4.1 Dialog弹窗
<van-dialog title="标题" show="{
{ show }}" bind:close="onClose">
<view>弹窗内容</view>
</van-dialog>
通过Confirm和Cancel按钮进行交互,在7.0.15以下的微信版本中,关闭动画存在已知卡顿问题。
3.4.2 Toast提示
import Toast from '@vant/weapp/toast/toast';
// 显示纯文本提示
Toast('提示内容');
// 显示不同状态的提示
Toast.success('操作成功');
Toast.fail('操作失败');
Toast.loading('加载中...');
// 配置Toast参数
Toast({
message: '自定义提示',
duration: 3000,
position: 'top',
});
Toast使用的是函数式调用,这是Vant Weapp内置的全局方法,无需在页面JSON中单独注册。
3.4.3 Notify消息通知
import Notify from '@vant/weapp/notify/notify';
Notify({ type: 'primary', message: '通知内容' });
Notify({ type: 'success', message: '成功通知' });
Notify({ type: 'danger', message: '错误通知' });
3.5 展示组件
3.5.1 Image图片
增强版的Image标签,支持图片懒加载与加载失败提示。
<van-image
src="{
{ src }}"
width="100"
height="100"
fit="cover"
round
lazy-load
show-error
show-loading
/>
lazy-load属性可以延迟加载非可视区域的图片,极大提升长列表滚动性能。
3.5.2 Grid宫格(业务布局)
Grid宫格组件适合用于展示功能入口、商品分类等场景。
<van-grid column-num="2">
<van-grid-item icon="photo-o" text="图片" />
<van-grid-item icon="video-o" text="视频" />
<van-grid-item icon="gift-o" text="礼物" />
<van-grid-item icon="comment-o" text="评论" />
</van-grid>
3.5.3 Skeleton骨架屏
骨架屏可以在页面数据加载完成前展示占位区块,显著改善用户对加载等待的感知。
<van-skeleton title avatar row="3" loading="{
{ loading }}">
<!-- 真实内容 -->
<view>页面加载完成后的真实内容</view>
</van-skeleton>
虽然骨架屏本身并不真正减少加载时间,但它能通过视觉过渡让用户感觉加载更快,这是一种感知性能优化的经典手段。
四、样式定制详解
Vant Weapp的一个显著优势是其强大的样式定制能力。它提供了三种不同层次的定制方案,满足从简单调整到深度主题定制的各种需求。
4.1 方案一:解除样式隔离
Vant Weapp的所有组件都默认开启了addGlobalClass: true,以接受外部样式的影响。开发者可以直接在页面的样式文件中覆盖组件样式。
在页面中覆盖样式:
<van-button type="primary">主要按钮</van-button>
/* page.wxss */
.van-button--primary {
font-size: 20px;
background-color: #4c6ef5;
border-radius: 8px;
}
在自定义组件中覆盖样式:
需要在自定义组件的JS文件中开启styleIsolation: 'shared'选项,解除样式隔离限制:
// components/custom-component.js
Component({
options: {
styleIsolation: 'shared',
},
});
/* components/custom-component.wxss */
.van-button--primary {
padding: 0 20px;
height: 44px;
}
styleIsolation: 'shared'表示组件的样式将可以相互影响,外部样式类可以影响组件内部。
4.2 方案二:使用外部样式类
Vant Weapp为部分组件开放了外部样式类(externalClasses)接口,允许开发者通过传入自定义类名的方式覆盖组件内部特定元素的样式。
<van-cell
title="商品价格"
value="¥99.00"
title-class="custom-title"
value-class="custom-value"
/>
.custom-title {
color: #333333;
font-weight: 500;
}
.custom-value {
color: #ff4d4f;
font-size: 16px;
}
常用组件的外部样式类:
外部样式类的优先级可能低于组件默认样式,因此使用时建议添加!important以保证优先级。
4.3 方案三:使用CSS变量(主题定制)
相较于前两种方法,使用CSS变量支持在页面或应用级别对多个组件的样式做批量修改,更适合进行主题样式的定制。
定制单个组件:
可以在wxss中为组件设置CSS变量,或通过style属性来设置:
<van-button class="my-button">默认按钮</van-button>
.my-button {
--button-border-radius: 10px;
--button-default-color: #f2f3f5;
}
通过style属性动态设置(可实现运行时主题切换):
<van-button style="{
{ buttonStyle }}">默认按钮</van-button>
Page({
data: {
buttonStyle: `
--button-border-radius: 10px;
--button-default-color: #4c6ef5;
`,
},
onLoad() {
setTimeout(() => {
this.setData({
buttonStyle: `
--button-border-radius: 2px;
--button-default-color: #fa541c;
`,
});
}, 2000);
},
});
定制多个组件:
用一个container节点包裹住需要定制的组件,并将CSS变量设置在container节点上:
<view class="container">
<van-button bind:click="onClick">默认按钮</van-button>
<van-toast id="van-toast" />
</view>
.container {
--button-border-radius: 10px;
--button-default-color: #f2f3f5;
--toast-max-width: 100px;
--toast-background-color: pink;
}
定制全局主题:
在app.wxss中写入CSS变量,即可对全局生效:
page {
--button-border-radius: 8px;
--button-default-color: #323233;
--button-primary-color: #ffffff;
--button-primary-background-color: #1989fa;
}
4.4 样式覆盖的优先级规则
当多种样式定制方案同时使用时,优先级规则如下:
行内样式 > CSS变量 > 外部样式类 > 解除样式隔离的全局样式
合理利用优先级规则可以避免不必要的样式冲突。在实践中,推荐优先使用CSS变量进行主题级定制,因为它对组件的侵入最小,维护起来也最方便。
4.5 避免样式污染
为了避免样式污染影响其他页面或组件,建议在定制样式时添加自定义前缀,或使用CSS模块化方案:
/* 推荐:添加自定义前缀,只影响当前页面 */
.my-page .van-button--primary {
background-color: #4c6ef5;
}
/* 不推荐:全局样式可能影响其他页面 */
.van-button--primary {
background-color: #4c6ef5;
}