更新记录
1.0.0(2026-09-01) 下载此版本
- 新增 fg-sign-pad 签名组件,支持弹窗(popup)/ 内嵌(inline)两种模式
- 基于 Canvas 2D(type="2d")实现,兼容 App(app-vue)、H5、微信/支付宝/百度/字节/QQ/快手等小程序平台
- 支持画笔颜色、粗细、画板背景、圆角等配置
- 支持撤销上一笔、清空重签、导出图片(base64 / 临时文件路径)
- 支持 v-model 受控弹窗与事件回调(confirm / cancel / change 等)
平台兼容性
uni-app(4.87)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| × | × | √ |
fg-sign-pad 签名组件
组件名:fg-sign-pad
基于 Canvas 2D(type="2d")的手写签名组件,适用于合同签名、文件签名、审批签字、电子签名等场景。
- 支持 弹窗(popup) 与 内嵌(inline) 两种使用模式
- 支持画笔颜色、画笔粗细、画板背景、圆角等个性化配置
- 支持 撤销上一笔、清空重签、导出图片(base64 / 临时文件路径,可直接用于
uni.uploadFile上传) - 双击无需配置,easycom 自动注册,引入插件后直接在页面使用
<fg-sign-pad>标签即可
平台兼容性
| 平台 | 支持情况 | 说明 |
|---|---|---|
| App(app-vue) | ✅ | HBuilderX 3.x,uni-app 编译模式 |
| H5(浏览器 / 微信内置浏览器) | ✅ | 现代浏览器均可 |
| 微信小程序 | ✅ | 基础库 >= 2.9.0(Canvas 2D) |
| 支付宝小程序 | ✅ | 基础库支持 Canvas 2D 即可 |
| 百度 / 字节 / QQ / 快手 等小程序 | ✅ | 基于 uni-app Canvas 2D 封装,随平台基础库支持 |
| App-nvue | ❌ | nvue 不支持 Canvas 2D,请在 vue 页面使用 |
说明:组件使用
uni.createSelectorQuery().fields({ node: true })获取 Canvas 2D 节点,这是 uni-app 跨端统一的标准画布方案,各端基础库需满足上表要求。若初始化失败会通过error事件抛出并在控制台提示。
快速开始
插件放入 uni_modules 目录后(本项目已内置),页面可直接使用,无需 import:
模式一:弹窗模式(推荐,合同/文件签名常用)
<template>
<view class="page">
<!-- 页面展示签名缩略图 / 状态 -->
<image v-if="signature" :src="signature.base64" mode="widthFix" style="width: 300px;"></image>
<view v-else class="tip">尚未签名</view>
<!-- 点击虚线入口 → 弹出签名面板 -->
<fg-sign-pad mode="popup" @confirm="onConfirm" @cancel="onCancel" />
</view>
</template>
<script>
export default {
data() {
return {
signature: null
}
},
methods: {
onConfirm(res) {
// res = { base64, tempFilePath, fileType, width, height }
this.signature = res
// 上传到服务器
uni.uploadFile({
url: 'https://your-api.com/sign',
filePath: res.tempFilePath, // 有临时文件路径优先用它上传
name: 'file',
success: () => uni.showToast({ title: '签名已提交', icon: 'success' })
})
},
onCancel() {
console.log('用户取消签名')
}
}
}
</script>
模式二:内嵌模式(签名板直接显示在页面中)
<template>
<view>
<fg-sign-pad ref="sign" mode="inline" :height="240" />
<button type="primary" @tap="submit">提交签名</button>
</view>
</template>
<script>
export default {
methods: {
submit() {
this.$refs.sign.exportSignature().then(res => {
console.log(res.base64, res.tempFilePath)
})
}
}
}
</script>
Vue 3(组合式 API)用法
<template>
<fg-sign-pad ref="signRef" mode="inline" @confirm="onConfirm" />
</template>
<script setup>
import { ref } from 'vue'
const signRef = ref(null)
function onConfirm(res) {
console.log('签名结果:', res.base64)
}
function doExport() {
signRef.value.exportSignature().then(res => {
// ...
})
}
</script>
受控弹窗(v-model)
<template>
<view>
<button @tap="showSign = true">打开签名</button>
<fg-sign-pad v-model="showSign" mode="popup" @confirm="onConfirm" />
</view>
</template>
<script>
export default {
data() {
return { showSign: false }
},
methods: {
onConfirm(res) {
this.showSign = false
// 处理 res
}
}
}
</script>
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue |
Boolean | false |
弹窗模式显示控制(v-model) |
mode |
String | popup |
使用模式:popup 弹窗 / inline 内嵌 |
title |
String | 手写签名 |
弹窗标题 |
height |
Number/String | 300 |
画板高度(px),宽度自动撑满容器 |
lineColor |
String | #333333 |
画笔颜色 |
lineWidth |
Number | 3 |
画笔粗细(px) |
bgColor |
String | #FFFFFF |
画板背景色(导出图片同样带此背景) |
borderRadius |
Number/String | 12 |
画板圆角(px) |
placeholder |
String | 请在此处签名 |
无签名时的占位文字,传空字符串隐藏 |
placeholderColor |
String | #C0C4CC |
占位文字颜色 |
entryText |
String | 点击签名 |
弹窗模式入口文案 |
confirmText |
String | 确认 |
确认按钮文案 |
cancelText |
String | 取消 |
取消按钮文案 |
clearText |
String | 重签 |
重签按钮文案 |
emptyTip |
String | 请先完成签名 |
未签名点确认时的 toast 提示,传空字符串关闭提示 |
format |
String | png |
导出图片格式:png / jpg |
quality |
Number | 1 |
jpg 导出质量(0-1) |
maskClosable |
Boolean | true |
点击遮罩是否关闭弹窗 |
autoClose |
Boolean | true |
确认成功后是否自动关闭弹窗 |
zIndex |
Number/String | 999 |
弹窗层级 |
showCancel |
Boolean | true |
是否显示取消按钮(仅弹窗模式) |
showClear |
Boolean | true |
是否显示重签按钮 |
showConfirm |
Boolean | true |
是否显示确认按钮 |
haptic |
Boolean | false |
落笔/抬笔震动反馈(设备不支持时自动忽略) |
事件
| 事件名 | 参数 | 说明 |
|---|---|---|
confirm |
{ base64, tempFilePath, fileType, width, height } |
点击确认且已有签名时触发 |
cancel |
- | 用户点击"取消"按钮或弹窗关闭按钮时触发 |
clear |
- | 画板被清空时触发 |
change |
hasSignature: Boolean |
签名状态变化(落笔结束 / 清空 / 撤销)时触发 |
open |
- | 弹窗打开时触发 |
close |
- | 弹窗关闭时触发 |
ready |
- | 画布初始化完成时触发 |
error |
Error |
画布初始化/导出失败时触发 |
confirm回调参数说明:
base64:图片 dataURL 格式,可直接用于<image :src>预览或转 FormData 上传tempFilePath:本地临时文件路径,可用于uni.uploadFile直接上传- 各端差异:H5 端
base64稳定可用;小程序/App 端tempFilePath稳定可用,base64由临时文件读取转换(个别平台读取失败时为空串,此时请使用tempFilePath上传)
方法(通过 ref 调用)
| 方法名 | 参数 | 返回值 | 说明 |
|---|---|---|---|
open() |
- | - | 打开弹窗 |
close() |
- | - | 关闭弹窗(并清空画板) |
clear() |
- | - | 清空画板 |
undo() |
- | Boolean |
撤销上一笔,成功返回 true |
exportSignature(options) |
{ format?, quality?, width?, height? } |
Promise<{ base64, tempFilePath, fileType, width, height }> |
导出签名图片。width/height 为导出图片目标尺寸(px),默认与画板一致,只传其一时按画板比例自动推导另一边(如需要高清图可传 2 倍尺寸) |
isSigned() |
- | Boolean |
当前是否已有签名内容 |
常见问题
1. 控制台报错"未获取到 canvas 节点"?
- 微信小程序请检查基础库版本 >= 2.9.0(
manifest.json→ mp-weixin → 基础库最低版本) - App 端请确认使用 app-vue 页面(nvue 不支持),HBuilderX 版本 >= 3.x
- 插件放入
uni_modules后请刷新 HBuilderX 项目
2. 报错"canvasToTempFilePath:fail Cannot read property 'width' of undefined"?
微信小程序在自定义组件内调用 canvasToTempFilePath 时必须传入组件实例作为第二参数,组件内部已处理(uni.canvasToTempFilePath(options, this))。另一个常见原因是 Vue3 下 canvas 节点被 reactive 用 Proxy 包装后传给原生 API 会失败——组件已将 canvas 节点与 ctx 存放在实例非响应式属性(this._canvas / this._ctx)上。若仍出现该错误,请停止运行后重新编译运行(清理 unpackage/dist 下对应平台的旧编译产物),确保源码与编译产物一致。
3. H5 端(PC 浏览器)无法签写? 组件已支持鼠标事件(mousedown/mousemove/mouseup),PC 浏览器可直接按住鼠标签名;触摸设备自动走 touch 事件,二者互不干扰。
4. 为什么弹窗打开时画板偶尔空白?
画板初始化依赖弹窗内容渲染完成,组件已做 nextTick 延迟 + 失败自动重试(3 次)。若页面在弹窗出现的同时有大量渲染任务,可稍作等待或升级基础库。
5. 签名图片模糊怎么办?
组件已按设备 pixelRatio 放大画布分辨率(dpr 适配),导出尺寸为物理像素,无需额外处理。
6. 导出图片为什么带白底?
bgColor 默认 #FFFFFF,导出时背景会一并绘制。如需透明底 PNG,将 bgColor 设置为 transparent 即可。
更新日志
详见 changelog.md

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 0
赞赏 0
下载 12550864
赞赏 1948
赞赏
京公网安备:11010802035340号