最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue?vue-esign簽字板的demo

 更新時間:2022年04月21日 10:56:57   作者:今天代碼敲了嗎  
這篇文章主要介紹了vue?vue-esign簽字板的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

vue vue-esign簽字板demo

使用vue-esign讓用戶能夠在手動簽字并返回為base64或者file格式的文件流

安裝

npm install vue-esign --save

在main.js中全局引用

import vueEsign from 'vue-esign'
Vue.use(vueEsign)

Demo 

<template>
? <div class="esigns">
? ? <vue-esign
? ? ? ref="esign"
? ? ? style="
? ? ? ? width: 100%;
? ? ? ? height: 400px
? ? ? "
? ? ? :isCrop="isCrop"
? ? ? :lineWidth="lineWidth"
? ? ? :lineColor="lineColor"
? ? ? :bgColor.sync="bgColor"
? ? />
? ? <div class="btn">
? ? ? <van-button type="primary" @click="handleReset">重置</van-button>
? ? ? <van-button type="info" @click="handleGenerate">確定</van-button>
? ? </div>
? </div>
</template>
<script>
export default {
? name: "Esign",
? data() {
? ? return {
? ? ? lineWidth: 6,
? ? ? lineColor: "#000000",
? ? ? bgColor: "",
? ? ? resultImg: "",
? ? ? isCrop: false,
? ? };
? },
? methods: {
? ? handleReset() {
? ? ? // 清除
? ? ? this.$refs.esign.reset();
? ? },
? ? handleGenerate() {
? ? ? // 獲取base64
? ? ? var _this = this;
? ? ? _this.$refs.esign
? ? ? ? .generate()
? ? ? ? .then((res) => {
? ? ? ? ? // 轉(zhuǎn)成文件
? ? ? ? ? var file = _this.dataURLtoFile(res);
? ? ? ? ? ? console.log("file:",file )
? ? ? ? ? //調(diào)用接口
? ? ? ? ? uploadFile(file).then(({ data }) => {
? ? ? ? ? ?console.log("data:",data)
? ? ? ? ? });
? ? ? ? })
? ? ? ? .catch((err) => {
? ? ? ? ? _this.$toast(err);?
? ? ? ? });
? ? },
? ? // 將base64轉(zhuǎn)換為file
? ? dataURLtoFile(dataurl) {
? ? ? let arr = dataurl.split(",");
? ? ? let mime = arr[0].match(/:(.*?);/)[1];
? ? ? let bytes = atob(arr[1]); // 解碼base64
? ? ? let n = bytes.length;
? ? ? let ia = new Uint8Array(n);
? ? ? while (n--) {
? ? ? ? ia[n] = bytes.charCodeAt(n);
? ? ? }
? ? ? return new File([ia], "easign.jpg", { type: mime });
? ? },
? },
};
</script>
<style scoped>
.btn {
? display: flex;
? justify-content: space-around;
? margin-top: 10px;
}
</style>

vue移動端電子簽名demo

HTML

<template>
?? ?<div id='canvasBox'>
?? ??? ?<div ref="canvasBox">
?? ??? ? ? ? <canvas id="canvas" ref="canvas" height="150"></canvas>
?? ??? ?</div>
?? ??? ?<div class="row row-space-between">
?? ??? ? ?<button ?@click="onClickCancle">取消</button>
?? ??? ? ?<button @click="clear">重簽</button>
?? ??? ? ?<button @click="save">確認(rèn)</button>
?? ??? ?</div>
?? ??? ?<!-- <img :src="singImgUrl" alt /> -->
?? ?</div>
</template>

JS相關(guān)代碼

<script>
var draw;
var preHandler = function(e) {
  e.preventDefault();
};
class Draw {
  constructor(el) {
    this.el = el;
    this.canvas = document.getElementById(this.el);
    this.cxt = this.canvas.getContext("2d");
    this.stage_info = canvas.getBoundingClientRect();
    this.path = {
      beginX: 0,
      beginY: 0,
      endX: 0,
      endY: 0
    };
  }
  init(btn) {
    var that = this;
    this.canvas.addEventListener("touchstart", function(event) {
      document.addEventListener("touchstart", preHandler, false);
      that.drawBegin(event);
    });
    this.canvas.addEventListener("touchend", function(event) {
      document.addEventListener("touchend", preHandler, false);
      that.drawEnd();
    });
    this.clear(btn);
  }
  drawBegin(e) {
    var that = this;
    window.getSelection()
      ? window.getSelection().removeAllRanges()
      : document.selection.empty();
    this.cxt.strokeStyle = "#BC4C2D";
    this.cxt.beginPath();
    this.cxt.moveTo(
      e.changedTouches[0].clientX - this.stage_info.left,
      e.changedTouches[0].clientY - this.stage_info.top
    );
    this.path.beginX = e.changedTouches[0].clientX - this.stage_info.left;
    this.path.beginY = e.changedTouches[0].clientY - this.stage_info.top;
    canvas.addEventListener("touchmove", function() {
      that.drawing(event);
    });
  }
  drawing(e) {
    this.cxt.lineTo(
      e.changedTouches[0].clientX - this.stage_info.left,
      e.changedTouches[0].clientY - this.stage_info.top
    );
    this.path.endX = e.changedTouches[0].clientX - this.stage_info.left;
    this.path.endY = e.changedTouches[0].clientY - this.stage_info.top;
    this.cxt.stroke();
  }
  drawEnd() {
    document.removeEventListener("touchstart", preHandler, false);
    document.removeEventListener("touchend", preHandler, false);
    document.removeEventListener("touchmove", preHandler, false);
    //canvas.ontouchmove = canvas.ontouchend = null
  }
  clear(btn) {
    this.base64Id = "";
    this.cxt.clearRect(0, 0, 500, 600);
  }
  save() {
    var blank = document.createElement("canvas"); //系統(tǒng)獲取一個空canvas對象
    blank.width = canvas.width;
    blank.height = canvas.height;
    let flag = canvas.toDataURL("image/png") == blank.toDataURL(); //比較值相等則為空;
    if (flag) {
      return "0";
    } else {
      return canvas.toDataURL("image/png");
    }
  }
}
export default {
  data() {
    return {
      singImgUrl: ""
    };
  },
  methods: {
	 clear() {
        draw.clear();
        this.base64Id = "";
	 },
   	save() {
      var data = "";
      data = draw.save();
      if (data == "0") {
      		this.$toast("請先簽名再點(diǎn)擊確定哦~");
      } else {
	      this.singImgUrl = data;
	      ///data 就是得到的base64格式的簽名圖片,根據(jù)業(yè)務(wù)這里可上傳到服務(wù)器
      }
      // 
    },
},
 mounted() {
 document.getElementById("canvasBox").addEventListener("touchmove", (e) => {
      e.preventDefault();
    });//阻止瀏覽器默認(rèn)行為,防止簽名瀏覽器下拉-------很重要
    this.base64Id = "";
    let _width = this.$refs.canvasBox.offsetWidth;
    this.$refs.canvas.width = _width; //適配移動端寬度給canvas
    draw = new Draw("canvas");
    draw.init();
  }
}
</script>

CSS 自行美化,相信大家都沒得問題

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue數(shù)據(jù)雙向綁定的深入探究

    Vue數(shù)據(jù)雙向綁定的深入探究

    這篇文章主要給大家介紹了關(guān)于Vue數(shù)據(jù)雙向綁定的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Vue3 的ref和reactive的用法和區(qū)別示例解析

    Vue3 的ref和reactive的用法和區(qū)別示例解析

    ref和reactive是Vue3中用來實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式的API,一般情況下,ref定義基本數(shù)據(jù)類型,reactive定義引用數(shù)據(jù)類型,本文給大家介紹Vue3 的ref和reactive的用法和區(qū)別,感興趣的朋友一起看看吧
    2023-10-10
  • vue項(xiàng)目中在可編輯div光標(biāo)位置插入內(nèi)容的實(shí)現(xiàn)代碼

    vue項(xiàng)目中在可編輯div光標(biāo)位置插入內(nèi)容的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue項(xiàng)目中在可編輯div光標(biāo)位置插入內(nèi)容的實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 解決vue bus.$emit觸發(fā)第一次$on監(jiān)聽不到問題

    解決vue bus.$emit觸發(fā)第一次$on監(jiān)聽不到問題

    這篇文章主要介紹了解決vue bus.$emit觸發(fā)第一次$on監(jiān)聽不到問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 使用Vue和ECharts創(chuàng)建交互式圖表的代碼示例

    使用Vue和ECharts創(chuàng)建交互式圖表的代碼示例

    在現(xiàn)代 Web 應(yīng)用中,數(shù)據(jù)可視化是一個重要的組成部分,它不僅能夠幫助用戶更好地理解復(fù)雜的數(shù)據(jù),還能提升用戶體驗(yàn),本文給大家使用Vue和ECharts創(chuàng)建交互式圖表的示例,需要的朋友可以參考下
    2024-11-11
  • vue中為何方法要寫在methods的里面

    vue中為何方法要寫在methods的里面

    這篇文章主要介紹了vue中為何方法要寫在methods的里面,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談Vue單頁面做SEO的四種方案

    淺談Vue單頁面做SEO的四種方案

    Vue SPA單頁面應(yīng)用對SEO不友好,當(dāng)然也有相應(yīng)的解決方案,通過查找資料,大概有以下4種方法,本文就詳細(xì)的介紹一下
    2021-10-10
  • vue @click與@click.native,及vue事件機(jī)制的使用分析

    vue @click與@click.native,及vue事件機(jī)制的使用分析

    這篇文章主要介紹了vue @click與@click.native,及vue事件機(jī)制的使用分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 深入理解vue中的$set

    深入理解vue中的$set

    這篇文章主要介紹了深入理解vue中的$set,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue 點(diǎn)擊按鈕實(shí)現(xiàn)動態(tài)掛載子組件的方法

    vue 點(diǎn)擊按鈕實(shí)現(xiàn)動態(tài)掛載子組件的方法

    今天小編就為大家分享一篇vue 點(diǎn)擊按鈕實(shí)現(xiàn)動態(tài)掛載子組件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論

阿巴嘎旗| 上林县| 灌云县| 屏南县| 仁布县| 博野县| 婺源县| 清水县| 牡丹江市| 镇康县| 顺义区| 承德市| 同心县| 江华| 莱州市| 磐安县| 上饶市| 吉林省| 宣城市| 兰溪市| 无为县| 临沭县| 宁都县| 枣阳市| 邛崃市| 确山县| 嘉鱼县| 邵阳市| 高尔夫| 河源市| 新乡县| 兴隆县| 平顶山市| 青铜峡市| 蓬莱市| 延长县| 友谊县| 深州市| 石城县| 德令哈市| 苍梧县|