Taro+nutui h5使用nut-signature 签名组件的踩坑记录之使用canvas实现一个签名组件

本文记录了在Taro(3.4.0-beta.0)+ Nutui(3.1.16)开发H5过程中,遇到Nutui的nut-signature组件在H5上无法正常工作的问题。分析发现,由于H5中无法获取canvas节点导致签名失败。为了解决这个问题,作者选择使用canvas自行实现了一个签名组件,并详细介绍了组件的实现逻辑,包括监听touch事件来模拟签名动作。同时,文章还讨论了签名位置偏移和画笔模糊的常见问题及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期在使用Taro(“@tarojs/taro”: “3.4.0-beta.0”) + Nutui (3.1.16)开发H5时,需要一个签名功能结果在小程序上运行正常的 nut-signature组件,在h5上出问题了
首先问题是 :

Nutui的 签名组件(nut-signature)不能签名

在小程序中是可以正常使用,结果打包成h5就不行了,???
代码追踪+源码追踪,直接原因是:
在h5上
在这里插入图片描述
也就是在源码这个在这里插入图片描述
原因: Taro.createSelectorQuery().select("#spcanvas").fields 在数据返回时 res中本该包含node节点的但是在h5上没有,获取canvas节点未获取到导致在h5中签名失败

虽然官网上fields方法是兼容H5的但是这个地方就是没有获取到节点 -.-

解决方案: 用canvas,自己实现签名组件(小程序)

组件大致长这样
请添加图片描述
完整组件地址完整代码

实现逻辑就是 监听canvas的 touchstart、touchmove、touchend、touchleave事件
签名大致就是起笔,落笔 连线,收笔,想象自己写字的动作.
以vue举例,其他同理:

html代码部分

<div class="pad-20">
        <div class="written">
            <div id="canvas-content" style="width: 100%; height: 100%">
                <canvas
                    class="canvasSign"
                    id="canvasSign"
                    @touchstart="startEventHandler"
                    @touchmove="moveEventHandler"
                    @touchend="endEventHandler"
                    @touchleave="leaveEventHandler"
                />
            </div>

            <div class="flex-center">
                <button class="button_clear button" @click="() => clearClick()">重签</button
### 如何在 Taro Vue3 中集成和使用 `ec-canvas` 组件 #### 配置文件修改 为了能够在项目中正常使用 `ec-canvas` 组件,在项目的入口配置文件 `index.config.ts` 中声明此组件[^1]: ```typescript export default { navigationBarTitleText: '前端进阶技术栈', usingComponents: { "ec-canvas": "../../ec-canvas/ec-canvas" } } ``` #### 安装依赖包 确保安装了必要的依赖项,对于基于 TaroVue 的环境而言,通常需要通过 npm 或 yarn 来获取这些资源。 ```bash npm install echarts-for-weixin taro-vue3 # 或者 yarn add echarts-for-weixin taro-vue3 ``` #### 创建页面结构 创建一个新的页面用于展示图表功能,并引入所需的模块。这里假设已经有一个名为 `ChartPage.vue` 的文件存在。 ```vue <template> <view class="chart-container"> <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar"></ec-canvas> </view> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue'; import * as wxCharts from 'echarts-for-weixin'; const chartRef = ref(null); onMounted(() => { const query = wx.createSelectorQuery(); query.select('#mychart-dom-bar').fields({ node: true }).exec((res) => { if (res && res[0]) { drawBarChart(res[0].node); } }); }); function drawBarChart(canvas){ var myChart = new wxCharts.Chart({ canvas, type: 'bar', categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'], series: [{ name: 'Sales', data: [320, 332, 301, 334, 390], }], animation: true, width: canvas.width, height: canvas.height, dataLabel: true, legend: false, extra: { barWidth: 20 }, }); }; </script> <style scoped> .chart-container{ display: flex; justify-content: center; align-items: center; min-height: 100vh; } </style> ``` 上述代码展示了如何在一个新的 Vue 页面内初始化并渲染柱状图实例到指定的 `<ec-canvas>` 元素上。注意这里的 `canvas.id` 应当与模板中的 ID 对应起来以便正确关联 DOM 节点。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值