更新记录
1.0.0(2026-02-02)
下载此版本
Features
- 初始版本发布
- 支持手写签名功能
- 支持自定义画笔颜色和粗细
- 支持水印功能(可自定义水印文本)
- 支持自动上传功能
- 支持自定义工具栏
- 兼容 H5、App、微信小程序、支付宝小程序等多端平台
- 提供完整的事件回调和方法调用
平台兼容性
uni-app(4.84)
| Vue2 |
Vue2插件版本 |
Vue3 |
Vue3插件版本 |
Chrome |
Chrome插件版本 |
Safari |
Safari插件版本 |
app-vue |
app-vue插件版本 |
app-nvue |
Android |
Android插件版本 |
iOS |
鸿蒙 |
| √ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
- |
√ |
1.0.0 |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
其他
mt-signature 手写签名组件
uni-app 手写签名组件,支持多平台(H5、App、小程序),提供丰富的功能和高度的可定制性。
功能特性
- ✅ 多平台支持(H5、App、微信小程序、支付宝小程序等)
- ✅ 手写签名绘制(触摸/鼠标)
- ✅ 平滑笔迹(贝塞尔曲线)
- ✅ 撤销功能
- ✅ 防误触(最小笔画长度)
- ✅ 自定义工具栏位置(顶部/底部/左侧/右侧)
- ✅ 水印支持(自动生成用户名+时间)
- ✅ 水印自适应横竖屏
- ✅ 自定义水印样式(颜色、大小、旋转角度)
- ✅ 自动上传
- ✅ 插槽支持(自定义工具栏)
- ✅ 丰富的事件回调
安装
将 mt-signature 文件夹复制到项目的 uni_modules 目录下。
基础用法
<template>
<view class="page">
<mt-signature
@confirm="handleConfirm"
@cancel="handleCancel"
/>
</view>
</template>
<script>
export default {
methods: {
handleConfirm(result) {
console.log('签名完成', result.tempFilePath);
},
handleCancel() {
console.log('取消签名');
}
}
}
</script>
<style>
.page {
width: 100vw;
height: 100vh;
}
</style>
Props 属性
画布配置
| 参数 |
类型 |
默认值 |
说明 |
| width |
String/Number |
'100%' |
画布宽度 |
| height |
String/Number |
'400rpx' |
画布高度 |
| backgroundColor |
String |
'#ffffff' |
画布背景色 |
| penColor |
String |
'#000000' |
画笔颜色 |
| penWidth |
Number |
3 |
画笔粗细 |
| placeholder |
String |
'请在此区域签字' |
占位提示文字 |
| disabled |
Boolean |
false |
是否禁用 |
| disableScroll |
Boolean |
true |
是否禁用滚动 |
笔迹优化
| 参数 |
类型 |
默认值 |
说明 |
| smoothStroke |
Boolean |
false |
是否平滑笔迹(使用贝塞尔曲线) |
| minStrokeLength |
Number |
0 |
最小笔画长度,小于此长度的笔画不计入(防误触) |
| maxUndoSteps |
Number |
0 |
撤销步数,0表示不支持撤销 |
工具栏配置
| 参数 |
类型 |
默认值 |
说明 |
| showToolbar |
Boolean |
true |
是否显示工具栏 |
| toolbarPosition |
String |
'top' |
工具栏位置:top/bottom/left/right |
| showCancelBtn |
Boolean |
true |
是否显示取消按钮 |
| showClearBtn |
Boolean |
true |
是否显示清屏按钮 |
| showConfirmBtn |
Boolean |
true |
是否显示确认按钮 |
| cancelText |
String |
'取消' |
取消按钮文字 |
| clearText |
String |
'清屏' |
清屏按钮文字 |
| confirmText |
String |
'确认' |
确认按钮文字 |
水印配置
| 参数 |
类型 |
默认值 |
说明 |
| showWatermark |
Boolean |
false |
是否显示水印 |
| watermark |
String |
'' |
水印文本(不传则自动生成:用户名+时间) |
| watermarkRows |
Number |
0 |
水印行数(0表示自动计算) |
| watermarkCols |
Number |
0 |
水印列数(0表示自动计算) |
| watermarkColor |
String |
'rgba(102, 102, 102, 0.5)' |
水印颜色 |
| watermarkFontSize |
Number |
20 |
水印字体大小 |
| watermarkRotate |
Number |
-45 |
水印旋转角度(度数) |
导出配置
| 参数 |
类型 |
默认值 |
说明 |
| fileType |
String |
'png' |
导出图片格式 |
| quality |
Number |
1 |
导出图片质量(0-1) |
上传配置
| 参数 |
类型 |
默认值 |
说明 |
| autoUpload |
Boolean |
false |
是否自动上传 |
| uploadUrl |
String |
'' |
上传接口地址 |
| uploadName |
String |
'file' |
上传文件字段名 |
| uploadHeader |
Object |
{} |
上传请求头 |
| uploadFormData |
Object |
{} |
上传额外参数 |
Events 事件
| 事件名 |
说明 |
回调参数 |
| ready |
画布初始化完成 |
- |
| start |
开始绘制 |
{ x, y } |
| drawing |
绘制中 |
{ x, y } |
| end |
结束绘制 |
- |
| clear |
清屏 |
- |
| undo |
撤销 |
{ stepsRemaining } |
| cancel |
取消 |
- |
| beforeConfirm |
确认前 |
- |
| confirm |
确认 |
{ tempFilePath, canvasWidth, canvasHeight, uploadResult } |
| success |
成功 |
{ tempFilePath, canvasWidth, canvasHeight, uploadResult } |
| error |
错误 |
{ type, message } |
Methods 方法
通过 ref 调用组件方法:
<mt-signature ref="signature" />
| 方法名 |
说明 |
参数 |
| clear() |
清空画布 |
- |
| undo() |
撤销上一步 |
- |
| isEmpty() |
判断是否为空 |
- |
Slots 插槽
| 插槽名 |
说明 |
| toolbar-left |
工具栏左侧内容 |
| toolbar-center |
工具栏中间内容 |
| toolbar-right |
工具栏右侧内容 |
使用示例
1. 基础签名
<mt-signature
height="500rpx"
@confirm="handleConfirm"
/>
2. 带水印签名
<mt-signature
:show-watermark="true"
watermark="张三 | 2024-01-01 12:00:00"
@confirm="handleConfirm"
/>
3. 自动上传
<mt-signature
:auto-upload="true"
upload-url="https://api.example.com/upload"
:upload-header="{ Authorization: 'Bearer token' }"
@success="handleSuccess"
/>
4. 平滑笔迹 + 撤销功能
<template>
<view class="page">
<mt-signature
ref="signature"
:smooth-stroke="true"
:max-undo-steps="10"
:show-confirm-btn="false"
>
<template #toolbar-right>
<button @click="handleUndo">撤销</button>
<button @click="handleClear">清空</button>
<button @click="handleConfirm">确认</button>
</template>
</mt-signature>
</view>
</template>
<script>
export default {
methods: {
handleUndo() {
this.$refs.signature.undo();
},
handleClear() {
this.$refs.signature.clear();
},
handleConfirm() {
// 手动触发确认逻辑
}
}
}
</script>
5. 防误触
<mt-signature
:min-stroke-length="10"
@confirm="handleConfirm"
/>
6. 自定义工具栏位置
<!-- 底部工具栏 -->
<mt-signature toolbar-position="bottom" />
<!-- 左侧工具栏 -->
<mt-signature toolbar-position="left" />
<!-- 右侧工具栏 -->
<mt-signature toolbar-position="right" />
7. 自定义水印样式
<mt-signature
:show-watermark="true"
watermark-color="rgba(255, 0, 0, 0.3)"
:watermark-font-size="24"
:watermark-rotate="-30"
@confirm="handleConfirm"
/>
8. 完整示例
<template>
<view class="signature-page">
<mt-signature
ref="signature"
height="100%"
pen-color="#1890ff"
:pen-width="4"
:smooth-stroke="true"
:max-undo-steps="10"
:min-stroke-length="5"
:show-watermark="true"
toolbar-position="bottom"
:auto-upload="true"
upload-url="https://api.example.com/upload"
:upload-header="uploadHeader"
@ready="handleReady"
@confirm="handleConfirm"
@error="handleError"
>
<template #toolbar-center>
<button @click="handleUndo" :disabled="!canUndo">撤销</button>
</template>
</mt-signature>
</view>
</template>
<script>
export default {
data() {
return {
canUndo: false,
uploadHeader: {
Authorization: 'Bearer ' + uni.getStorageSync('token')
}
};
},
methods: {
handleReady() {
console.log('画布已就绪');
},
handleUndo() {
this.$refs.signature.undo();
},
handleConfirm(result) {
console.log('签名完成', result);
if (result.uploadResult) {
console.log('上传成功', result.uploadResult);
}
},
handleError(error) {
console.error('错误', error);
uni.showToast({
title: error.message,
icon: 'none'
});
}
}
};
</script>
<style>
.signature-page {
width: 100vw;
height: 100vh;
}
</style>
兼容性
平台支持
| 平台 |
基础绘制 |
水印 |
上传 |
撤销 |
平滑笔迹 |
说明 |
| H5 |
✅ |
✅ |
✅ |
✅ |
✅ |
完全支持,支持鼠标绘制 |
| App |
✅ |
✅ |
✅ |
✅ |
✅ |
完全支持 |
| 微信小程序 |
✅ |
✅ |
✅ |
⚠️ |
✅ |
撤销功能可能有性能问题 |
| 支付宝小程序 |
✅ |
✅ |
✅ |
⚠️ |
✅ |
撤销功能可能有性能问题 |
| 百度小程序 |
✅ |
✅ |
✅ |
⚠️ |
✅ |
撤销功能可能有性能问题 |
| 字节小程序 |
✅ |
✅ |
✅ |
⚠️ |
✅ |
撤销功能可能有性能问题 |
| QQ小程序 |
✅ |
✅ |
✅ |
⚠️ |
✅ |
撤销功能可能有性能问题 |
Vue 版本支持
- Vue 2.x: ✅ 完全支持
- Vue 3.x: ✅ 完全支持(已适配生命周期)
功能兼容性说明
1. 基础绘制功能
2. 水印功能
- 所有平台均支持
- 水印会自动根据横竖屏调整密度
- 支持自定义水印样式(颜色、大小、旋转角度)
3. 撤销功能
- H5 和 App 平台完全支持
- 小程序平台支持但有限制:
- 每次撤销需要重新绘制图片,可能有性能开销
- 建议设置较小的
maxUndoSteps(如 3-5 步)
- 频繁撤销可能导致卡顿
4. 平滑笔迹
- 所有平台均支持
- 使用二次贝塞尔曲线实现
- 移动端可能有轻微性能影响,建议根据实际情况开启
5. 自动上传
- 所有平台均支持
- 需要配置
uploadUrl
- 小程序需要在后台配置合法域名
注意事项
通用注意事项
- 组件尺寸:组件需要明确的宽高才能正常工作
- 水印自适应:水印会自动根据横竖屏调整密度
- 性能优化:
- 撤销功能会占用内存,建议设置合理的
maxUndoSteps
- 平滑笔迹会略微增加性能开销,移动端建议谨慎使用
- 上传配置:自动上传需要配置
uploadUrl
小程序特殊注意事项
-
撤销功能限制:
- 小程序的撤销功能基于
canvasToTempFilePath 和 drawImage
- 频繁撤销可能导致性能问题
- 建议
maxUndoSteps 不超过 5
-
上传域名配置:
- 需要在小程序后台配置
uploadUrl 为合法域名
- 开发时可以在开发者工具中勾选"不校验合法域名"
-
Canvas 限制:
- 部分小程序对 canvas 尺寸有限制
- 建议画布尺寸不要过大(宽高不超过 4096px)
H5 特殊说明
- 鼠标支持:H5 平台同时支持触摸和鼠标绘制
- 跨域问题:如果使用水印功能,确保图片资源不跨域
Vue 版本兼容
组件同时支持 Vue 2 和 Vue 3:
- 使用
beforeDestroy(Vue 2)和 beforeUnmount(Vue 3)双生命周期
- 避免使用 Vue 3 专有 API
- canvasId 生成使用时间戳而非
_uid
测试建议
建议在以下环境进行测试:
- H5 浏览器:Chrome、Safari、Firefox
- 微信小程序:真机测试(开发者工具可能表现不一致)
- App:iOS 和 Android 真机测试
- 其他小程序:根据目标平台进行真机测试
已知问题
- 小程序撤销性能:小程序平台的撤销功能可能有性能问题,建议限制撤销步数
- 部分小程序水印字体:某些小程序平台可能不支持自定义字体,会使用系统默认字体
更新日志
v1.0.0
- 初始版本发布
- 支持基础签名功能
- 支持水印
- 支持自动上传
- 支持平滑笔迹
- 支持撤销功能
- 支持防误触
- 支持自定义工具栏位置 签名组件
一个功能完善、兼容多端的手写签名组件,支持水印、自动上传等功能。
平台兼容性
| Vue2 |
Vue3 |
H5 |
App |
微信小程序 |
支付宝小程序 |
百度小程序 |
字节小程序 |
QQ小程序 |
| ✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
安装
方式一:通过 uni_modules 安装(推荐)
在 HBuilderX 中右键 uni_modules 目录,选择 从插件市场导入插件,搜索 mt-signature 安装。
方式二:手动导入
将 mt-signature 文件夹复制到项目的 uni_modules 目录下。
基础用法
<template>
<view>
<mt-signature
@confirm="onConfirm"
@cancel="onCancel"
/>
</view>
</template>
<script>
export default {
methods: {
onConfirm(result) {
console.log('签名完成', result.tempFilePath);
},
onCancel() {
console.log('取消签名');
}
}
}
</script>
带水印
<template>
<mt-signature
:show-watermark="true"
watermark="张三 | 2024-01-30 10:30:00"
@confirm="onConfirm"
/>
</template>
自动上传
<template>
<mt-signature
:auto-upload="true"
upload-url="https://your-api.com/upload"
:upload-header="{ Authorization: 'Bearer token' }"
@confirm="onConfirm"
/>
</template>
<script>
export default {
methods: {
onConfirm(result) {
console.log('上传结果', result.uploadResult);
}
}
}
</script>
自定义样式
<template>
<mt-signature
width="100%"
height="500rpx"
background-color="#f5f5f5"
pen-color="#ff0000"
:pen-width="5"
placeholder="请在此处签名"
/>
</template>
自定义工具栏
<template>
<mt-signature>
<template #toolbar-left>
<button @click="handleBack">返回</button>
</template>
<template #toolbar-center>
<text>请签名</text>
</template>
<template #toolbar-right>
<button @click="handleSave">保存</button>
</template>
</mt-signature>
</template>
Props
| 参数 |
说明 |
类型 |
默认值 |
| width |
画布宽度 |
String/Number |
100% |
| height |
画布高度 |
String/Number |
400rpx |
| backgroundColor |
画布背景色 |
String |
#ffffff |
| penColor |
画笔颜色 |
String |
#000000 |
| penWidth |
画笔粗细 |
Number |
3 |
| showToolbar |
是否显示工具栏 |
Boolean |
true |
| showCancelBtn |
是否显示取消按钮 |
Boolean |
true |
| showClearBtn |
是否显示清屏按钮 |
Boolean |
true |
| showConfirmBtn |
是否显示确认按钮 |
Boolean |
true |
| cancelText |
取消按钮文字 |
String |
取消 |
| clearText |
清屏按钮文字 |
String |
清屏 |
| confirmText |
确认按钮文字 |
String |
确认 |
| placeholder |
占位提示文字 |
String |
请在此区域签字 |
| disabled |
是否禁用 |
Boolean |
false |
| disableScroll |
是否禁用滚动 |
Boolean |
true |
| showWatermark |
是否显示水印 |
Boolean |
false |
| watermark |
水印文本 |
String |
- |
| watermarkRows |
水印行数 |
Number |
12 |
| watermarkCols |
水印列数 |
Number |
6 |
| fileType |
导出图片格式 |
String |
png |
| quality |
导出图片质量(0-1) |
Number |
1 |
| autoUpload |
是否自动上传 |
Boolean |
false |
| uploadUrl |
上传接口地址 |
String |
- |
| uploadName |
上传文件字段名 |
String |
file |
| uploadHeader |
上传请求头 |
Object |
{} |
| uploadFormData |
上传额外参数 |
Object |
{} |
Events
| 事件名 |
说明 |
回调参数 |
| ready |
画布初始化完成 |
- |
| start |
开始签字 |
{ x, y } |
| drawing |
签字中 |
{ x, y } |
| end |
结束签字 |
- |
| clear |
清屏 |
- |
| cancel |
取消 |
- |
| beforeConfirm |
确认前 |
- |
| confirm |
确认签字 |
{ tempFilePath, canvasWidth, canvasHeight, uploadResult } |
| success |
操作成功 |
result |
| error |
操作失败 |
{ type, message } |
Slots
| 插槽名 |
说明 |
| toolbar-left |
工具栏左侧内容 |
| toolbar-center |
工具栏中间内容 |
| toolbar-right |
工具栏右侧内容 |
Methods
通过 ref 调用组件方法:
<template>
<mt-signature ref="signature" />
</template>
<script>
export default {
methods: {
// 清空签名
clearSignature() {
this.$refs.signature.clear();
},
// 判断是否为空
checkEmpty() {
const isEmpty = this.$refs.signature.isEmpty();
console.log('是否为空', isEmpty);
}
}
}
</script>
| 方法名 |
说明 |
参数 |
返回值 |
| clear |
清空签名 |
- |
- |
| isEmpty |
判断是否为空 |
- |
Boolean |
注意事项
- 小程序平台:需要在
manifest.json 中配置 canvas 权限
- H5平台:建议在移动端使用,PC端可能存在兼容性问题
- App平台:如需横屏显示,请在页面中单独处理屏幕方向
- 水印功能:水印仅在导出图片时添加,不影响签字体验
- 上传功能:需要配置正确的上传接口和请求头
完整示例
参考 pages/signature/index.vue 页面的实现。
更新日志
1.0.0 (2024-01-30)
- 初始版本发布
- 支持基础签名功能
- 支持水印功能
- 支持自动上传
- 兼容多端平台