Preview 表单预览
键值信息卡(订单详情、个人信息、账单汇总等只读详情页的卡片形态):头部「标签 + 强调值」、中部键值列表、底部操作按钮行,全部由 panelData 一个数据对象驱动;数据变化整卡响应式更新。常与卡片容器或列表页配合,也可放进弹层做确认页。
平台兼容性
| App | Web | 微信小程序 |
|---|---|---|
| ✓ | ✓ | ✓ |
三段(头部 / 列表 / 按钮行)按数据有无自动装配:某段数据为空就不渲染该段;全部为空时只剩插槽内容。
基础用法(订单详情卡)
html
<n-preview :panel-data="order" @click="onButtonClick" />
js
const order = {
label: "订单金额",
value: "¥29.90",
list: [
{ label: "订单号", value: "NP20260131001", valueColor: "#ef4444" },
{ label: "物流单号", value: "SF34409992021080911" },
{ label: "创建时间", value: "2026-01-31 09:20" },
{ label: "订单备注", value: "路上注意安全,超时可提前联系。" }
],
buttons: [{ text: "联系客服" }]
};
// click 回传 { index, item },item 是按钮原始对象(可携带 id 等业务字段)
function onButtonClick(detail: NPreviewClickDetail) {
uni.showToast({ title: `点击了第 ${detail.index} 个按钮`, icon: "none" });
}
列表项
valueColor/labelColor覆盖该行文字色;按钮项color覆盖按钮文字色(默认品牌色)。
两端对齐标签(表单风)
标签逐字两端分布是表单详情的经典排法,需配合固定标签宽:
html
<n-preview
:panel-data="profile"
label-align="justify"
:label-width="72"
>
<text class="extra">补充说明(默认插槽,渲染在列表与按钮行之间)</text>
</n-preview>
js
const profile = {
label: "个人信息",
list: [
{ label: "姓名", value: "张三" },
{ label: "手机号码", value: "189****0020" },
{ label: "家庭住址", value: "广东省深圳市龙华区" }
],
buttons: [
{ id: 1, text: "修改", color: "#262626" },
{ id: 2, text: "删除", color: "#ef4444" }
]
};
labelWidth = 0(自适应宽)时 justify 降级为左对齐;逐字分布适合 2~6 字中文标签,长句与英文词不建议用 justify。
更新某行值
js
const preview = ref<NPreviewComponentPublicInstance | null>(null);
// 更新的是组件内部显示副本,panelData 原始对象不被改写
if (preview.value != null) preview.value.setValue(0, "已发货");
业务字段映射
后端字段名与约定不一致时用 fields 映射(未指定的键用同名字段):
html
<n-preview :panel-data="dto" :fields="mapping" />
js
const dto = {
title: "账单金额",
amount: "¥128.00",
items: [
{ title: "套餐费", amount: "¥88.00" },
{ title: "增值服务", amount: "¥40.00" }
],
actions: [{ label: "去支付" }]
};
const mapping = {
label: "title",
value: "amount",
list: "items",
buttons: "actions",
text: "label"
};
label/value键同时用于头部与列表行(头部与行共用同一套键名),未指定的labelColor/valueColor/color/disabled仍用同名字段。
实现说明(参考做法 → 本库做法)
| 机制 | 参考做法 | 本库做法与理由 |
|---|---|---|
| 数据入口 | previewData 对象直传 |
panelData(UTSJSONObject 类型化,与数据驱动组件族同口径)+ fields 9 键映射全集 |
| 点击回传 | { index, ...按钮项 } 展开进事件参数 |
{ index, item } 保留原始对象——展开语义由 item 承载,业务自定义字段不被约定字段遮蔽 |
| 数据错误 | 静默(类型不符渲染异常或空白) | error 事件显式上抛 { field, index }(index=-1 面板级),数据驱动族一致 |
| setValue | 深拷贝 previewData 后改写触发重渲染 | 更新组件内部显示副本,原始数据对象不改写 |
| 头部值/列表值颜色 | hdValColor / bdColor 两个 prop 分立 |
收敛为一个 valueColor;需要不同色的场景用逐项 valueColor 覆盖 |
| 字号定制 | hdLabelSize / hdValSize / bdSize / btnSize 四个字号 prop |
主题令牌(--n-preview-head-label-size 等 4 个)+ 逐项颜色;全卡字号属主题定制,不进单实例 API |
| 左右留白 | padding prop |
令牌 --n-preview-padding-x |
| 标签与值间距 | labelRight prop |
令牌 --n-preview-label-gap |
| 上下外边距 | marginTop / marginBottom prop |
custom-style(全库统一的相邻元素排间距通道) |
| 头部线缩进 | hdLeft / hdRight prop |
固定左缩进对齐文字、右到边(表单卡惯例) |
| 线色 | borderColor prop |
令牌 --n-preview-line-color(深浅自动) |
| 按钮默认色 | 固定 #465CFF |
品牌色令牌,随库主题一致 |
| 标签 justify | CSS text-align-last: justify(uni-app x 不支持) |
标签逐字渲染进 space-between 容器实现两端分布;需 labelWidth 固定宽,否则降级左对齐 |
| 外框线 | 上下 0.5px 伪元素线 | 绝对定位 1px view,非 App 端 scaleY(0.5) 半高渲染(无伪元素依赖) |
API
Props
| 属性 | 类型 | 说明 |
|---|---|---|
| panel-data | UTSJSONObject|null | 面板数据 { label?, value?, list?, buttons? },null 只渲染插槽,默认 null |
| fields | NPreviewFields | 映射 label/value/list/labelColor/valueColor/buttons/text/color/disabled,未指定或空串使用同名字段,默认 {} |
| background | string | 卡片背景色,空 = 主题背景色(深浅自动),默认 "" |
| label-width | number | 标签固定宽度(px),0 = 按文字自适应;justify 需固定宽,默认 0 |
| label-align | NPreviewLabelAlign | 标签对齐:left / right / justify(两端逐字分布),默认 "left" |
| label-color | string | 标签文字色,空 = 次要色,默认 "" |
| value-color | string | 值文字色(头部值与列表值统一),空 = 主文字色,默认 "" |
| value-align | NPreviewValueAlign | 值对齐:right / left,默认 "right" |
| highlight | boolean | 底部按钮按压反馈,默认 true |
| border | boolean | 上下外边框线,默认 true |
| custom-class | string | 根节点额外类(类需定义在组件样式表内),默认 "" |
| custom-style | string | 根节点行内样式,默认 "" |
Events
| 事件 | 参数 | 说明 |
|---|---|---|
| click | 点击底部按钮时触发(禁用按钮不触发) | |
| valueClick | 点击列表值时触发 | |
| error | 面板数据字段类型非法时触发;index=-1 表示面板级字段 |
Slots
| 插槽 | 说明 |
|---|---|
| default | 补充内容区,渲染在键值列表与按钮行之间 |
Methods
| 方法 | 参数 | 说明 |
|---|---|---|
| setValue | (index: number, value: string) | 更新列表第 index 行的显示值;越界忽略 |