更新记录

1.0.0(2026-09-01) 下载此版本

  1. 新增 fg-sign-pad 签名组件,支持弹窗(popup)/ 内嵌(inline)两种模式
  2. 基于 Canvas 2D(type="2d")实现,兼容 App(app-vue)、H5、微信/支付宝/百度/字节/QQ/快手等小程序平台
  3. 支持画笔颜色、粗细、画板背景、圆角等配置
  4. 支持撤销上一笔、清空重签、导出图片(base64 / 临时文件路径)
  5. 支持 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 2Dtype="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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。