1 2 | 近期公司有一个小需求,在电子合同的基础上加上手写签名,并支持ipad适配,听到这里,我把ipad从泡面盖上拿了起来,打开了爱奇艺...?? 好的,接下来让我给大家介绍一下这个高效简单易上手的组件 --- react-canvas-draw |
简单介绍 && 快速上手
Installation
1 2 3 4 5 6 7 8 9 | // via npm npm install react-canvas-draw --save // via yarn yarn add react-canvas-draw Usage import React from "react"; import ReactDOM from "react-dom"; import CanvasDraw from "react-canvas-draw"; ReactDOM.render(<CanvasDraw />, document.getElementById("root")); |
Props
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | static defaultProps = { onChange: null loadTimeOffset: 5, lazyRadius: 30, brushRadius: 12, brushColor: "#444", catenaryColor: "#0a0302", gridColor: "rgba(150,150,150,0.17)", hideGrid: false, canvasWidth: 400, canvasHeight: 400, disabled: false, imgSrc: "", saveData: null, immediateLoading: false, hideInterface: false }; |
Functions
- getSaveData() 返回所画的图形的canvas编码
- loadSaveData(saveData: String, immediate: Boolean) 加载savaData对应的图形
- clear() 清空画布
- undo()撤销上一步操作
查看页面结构
- 可以看到页面生成了四个canvas,分别对应笔头drawing、画布grid、轨迹interface、模版temp
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | class Index extends PureComponent { signCanvas = React.createRef(); this.state = { imageBase64: null, }; // 得到签名并转化为图片 createSignImg = async () => { const signImg = this.signCanvas.current.canvas.drawing.toDataURL('image/png'); }; // 清空画布 clearSign = async () => { this.signCanvas.current.clear(); }; // 将图片提交到后台 submitSign = async () => { const { imageBase64 } = this.state; const form = new FormData(); form.append('file', dataURLtoBlob(imageBase64), `${moment()}mySign.png`); const response = await request(`/img/upload?_csrf=${window._csrf}`, { method: 'POST', body: form, }); render() { const { imageBase64 } = this.state; return ( <PageHeaderWrapper> <Card bordered={false}>电子手写签名</Card> <Card bordered={false}> <CanvasDraw ref={this.signCanvas} brushColor="#000" brushRadius={3} lazyRadius={10} canvasWidth="100%" canvasHeight={400} /> <Button type="primary" onClick={this.createSignImg}> 生成图片 </Button> <Button type="primary" onClick={this.clearSign}> 清空画布 </Button> <Button type="primary" onClick={this.submitSign}> 提交 </Button> </Card> <Card> 生成的图片: {imageBase64 && <img src={imageBase64} alt="图片" />} </Card> </PageHeaderWrapper> ); } } export default Index; |
- 注:关于图片提交服务器,参照之前的群鱼湾公众号:
- 老鱼出品:如何快速开发并搭建静态图片服务
- 关于ipad/移动设备适配,各位看官不用着急,咱下回再聊~我要吃泡面了??
- 欢迎关注群鱼湾公众号,做有态度的技术人?