微信小程序电子签名组件,封装抽离可复用,签名成功输出base64和临时文件路径,解决vant弹窗中使用导致背景滚动问题,宽度自适应,高度设置百分比,开箱即用!

文章目录

  • 一、效果图
  • 二、组件完整代码示例
    • 1.signature.js文件
    • 2.signature.wxml文件
    • 3.signature.json文件
    • 4.signature.wxss文件
  • 三、小程序页面引入组件使用示例,以index页面为例
    • 1.index.wxml文件
    • 2.index.js文件
    • 3.index.json文件

一、效果图


二、组件完整代码示例

小程序根目录创建components文件夹,签名组件放在这个文件夹下,components文件夹下新建signature目录,

1.signature.js文件

代码如下(示例):

const app = getApp();
Component({/*** 组件的属性列表*/properties: {//高度百分比h: {type: Number,value: 0.2,},//  填充描述文字fillText: {type: String,value: "请使用正楷",},},/*** 组件的初始数据*/data: {canvas: "",ctx: "",pr: 0,width: 0,height: 0,first: true,},attached: function () {this.getSystemInfo();this.createCanvas();},/*** 组件的方法列表*/methods: {start(e) {if (this.data.first) {this.clearClick();this.setData({ first: false });}// 开始创建一个路径,如果不调用该方法,最后无法清除画布this.data.ctx.beginPath();// 把路径移动到画布中的指定点,不创建线条。用 stroke 方法来画线条this.data.ctx.moveTo(e.changedTouches[0].x, e.changedTouches[0].y);},move(e) {// 增加一个新点,然后创建一条从上次指定点到目标点的线。用 stroke 方法来画线条this.data.ctx.lineTo(e.changedTouches[0].x, e.changedTouches[0].y);this.data.ctx.stroke();},error: function (e) {console.log("画布触摸错误" + e);},/*** 初始化*/createCanvas() {const pr = this.data.pr; // 像素比const query = this.createSelectorQuery();query.select("#canvas").fields({ node: true, size: true }).exec((res) => {const canvas = res[0].node;const ctx = canvas.getContext("2d");canvas.width = this.data.width * pr; // 画布宽度canvas.height = this.data.height * pr; // 画布高度ctx.scale(pr, pr); // 缩放比ctx.lineGap = "round";ctx.lineJoin = "round";ctx.lineWidth = 4; // 字体粗细ctx.font = "40px Arial"; // 字体大小,ctx.fillStyle = "#ecf0ef"; // 填充颜色ctx.fillText(this.data.fillText,this.data.width / 2 - 100,this.data.height / 2);this.setData({ ctx, canvas });});},// 获取系统信息,宽,高,像素比getSystemInfo() {let _that = this;wx.getSystemInfo({success(res) {_that.setData({pr: res.pixelRatio,width: res.windowWidth,height: res.windowHeight * _that.data.h - 70,});},});},//重签clearClick: function () {//清除画布this.data.first = true;this.data.ctx.clearRect(0, 0, this.data.width, this.data.height);},//保存图片saveClick: function (cb) {if (this.data.first) {wx.showToast({title: "签名数据为空!",icon: "none",});return false;}//  获取临时文件路径wx.canvasToTempFilePath({x: 0,y: 0,width: this.data.width,height: this.data.height,destWidth: this.data.width * this.data.pr,destHeight: this.data.height * this.data.pr,canvasId: "canvas",canvas: this.data.canvas,fileType: "png",success: (res) => {// 文件转base64wx.getFileSystemManager().readFile({filePath: res.tempFilePath,encoding: "base64",success: (val) => {cb && cb(val,res);//  转换成功派发事件this.triggerEvent("success", val.data);},});},});},},
});

2.signature.wxml文件

代码如下(示例):

<view class="signature"><canvas type="2d" id="canvas" bindtouchmove="move" bindtouchstart="start" binderror="error" style="width:{{width}}px;height:{{height}}px;"></canvas>
</view>

3.signature.json文件

代码如下(示例):

{"component": true,"usingComponents": {}
}

4.signature.wxss文件

代码如下(示例):

.signature {padding-top: 30px;
}
canvas {background-color: white;
}

三、小程序页面引入组件使用示例,以index页面为例

1.index.wxml文件

本案例结合vant popup弹出框使用,可根据需求修改

代码如下(示例):

//  第一行解决弹窗签名时页面滚动问题
<page-meta page-style="{{ show ? 'overflow: hidden;' : '' }}" />
<view bindtap="test">测试签名</view>
<van-popup closeable show="{{ show }}" round position="bottom" custom-style="height: 50%" bind:close="onClose"><view ><signature h="{{0.5}}" class="signature" /></view><view class="signature-btn"><van-button type="primary" size="small" bindtap="reset">重置</van-button><van-button type="primary" size="small" bindtap="save">确认</van-button></view>
</van-popup>

2.index.js文件

代码如下(示例):

Page({data: {show:false,},test(){this.setData({show:true})},//  保存save(){let signature = this.selectComponent('.signature');signature.saveClick((res,url)=>{//  res:base64数据,url:临时文件urlconsole.log(res,url);this.reset()})},//  重置reset(){let signature = this.selectComponent('.signature');signature.clearClick()},onClose(){this.reset()this.setData({show:false}) }
})

3.index.json文件

代码如下(示例):

{"usingComponents": {"signature": "../../components/signature/signature","van-popup": "@vant/weapp/popup/index"},"navigationBarTitleText":"页面标题","navigationBarTextStyle": "white",
}

微信小程序电子签名组件相关推荐

  1. 微信小程序image组件开发程序以及相关图片问题参考资料汇总

    微信小程序image组件开发程序以及相关图片问题参考资料汇总,希望对大家小程序开发能有一定的参考和借鉴价值.以下汇总主要涉及到微信小程序image组件有关资源路径.缩放和剪裁模式等进行的探讨,无论是对 ...

  2. 小程序子组件向父组件传值_一套组件化、可复用、易扩展的微信小程序 UI 组件库...

    如何使用 Wux Weapp 是一套组件化.可复用.易扩展的微信小程序 UI 组件库.在开始使用之前,需要先阅读微信小程序自定义组件的相关文档. 通过 npm 安装,需要依赖小程序基础库 2.2.1 ...

  3. 微信小程序自定义组件方案

    前言:小程序已于11月初开放了小程序组件功能,但事件方面还不是很完善,有的组件暂时可能还是要用其他方式来实现,这里简单记录下开发小程序自定义组件的要点. 在小程序官方开发组件开发功能之前,自定义组件的 ...

  4. uniapp 判断页面是否是横竖屏,解决微信小程序video组件全屏播放视频遮盖自定义播放控件问题

    如果res.deviceOrientation 等于landscape 的话是竖屏,portrait则是横屏.因为用户每旋转一次屏幕就会触发里面的onShow钩子,因此在页面显示或横竖屏变化都会触发这 ...

  5. 微信小程序自定义组件,提示组件

    微信小程序自定义组件,这里列举了一个常用的提示自定义组件,调用自定义组件中的方法和字段.仅供参考和学习. 编写组件: 在根目录下添加"components"目录,然后像添加Page ...

  6. php小程序onload,微信小程序 loading 组件实例详解

    这篇文章主要介绍了微信小程序 loading 组件实例详解的相关资料,需要的朋友可以参考下 loading通常使用在请求网络数据时的一种方式,通过hidden属性设置显示与否 主要属性: wxml 显 ...

  7. 手把手教你写一个微信小程序日历组件

    今天我们一起写一个微信小程序日历组件 微信小程序日历组件 github.com/749264345/w- 好,我们先看一下要实现的模样,如下图 由以上截图我们可以看到 1.日历可以通过按钮[切换展示效 ...

  8. 微信小程序自定义组件(二)

    微信小程序自定义组件 ps 由于作业部落貌似出了点问题,耽误了点时间,找了一个stackedit.io准备写.无奈,这是要自己建编辑器的节奏啊.没有一个能靠的注 为何存在组件 组件间的关系 使用rel ...

  9. 微信小程序|area组件使用的地址数据文件plus

    area组件使用的地址数据文件 前言 1.解析json的地址转换为area.js的格式 2.转换格式的java代码 3.运行结果截图示意 前言 实战篇内容参考: 1.腾讯的全球地址数据文件及Xml-& ...

最新文章

  1. Android 实现一个验证码倒计时(Handler postDelayed 实现验证码倒计时)
  2. 第二项目AIaisell(易销宝)
  3. 用手机就能实时给图像直线描边,速度不亚于目标检测,在线Demo可玩
  4. 迈向未来的那五种人,自古以来就很重要的人
  5. java 中的finally 语句块执行顺序
  6. Caffe: gflag编译出现问题汇总
  7. 【渝粤教育】21秋期末考试建设工程法规10221k1
  8. Kali Linux工具文档翻译计划
  9. java商城项目_javaweb实战之商城项目开发(一)
  10. Django 框架 新建app 、新建表
  11. 使用c#调用XMLHTTP(XMLHTTPClass) ,发送和返回 json
  12. 上粱正,下粱不歪——网吧母盘制作流程(转)
  13. 流畅的python 18章
  14. 操作系统复习资料(考研+期末)
  15. 极简 Java 工作流概念入门
  16. 联想Lenovo——何去何从
  17. 我是不是应该离职?盖洛普Q12测评法
  18. PHP将word文件转为图片预览
  19. 信号完整性设计的五个问题
  20. STM32F4基础工程移植FreeRTOS

热门文章

  1. iOS端APP提交审核被拒绝包含用户生成内容必须有举报和拉黑功能
  2. 新增用户ui界面的实现
  3. 联想 ThinkPad X1 nano 2022款评测
  4. 【Zabbix】05 监控图形
  5. 关于设计一个群发短信的小程序
  6. 华为c8650刷机记录
  7. 神经网络详解(基本完成)
  8. php 上传二进制图片,关于PHP CURL上传二进制流图片
  9. Python口罩识别检测全网最全OpenCV训练分类器具体步骤(以训练口罩检测分类器为例)附分类器和数据集下载地址
  10. HM2101NL车规级隔离变压器的哪里经销