vue+element加入簽名效果(移動(dòng)端可用)
下面介紹為了方便就把項(xiàng)目的文件叫作父組件,然后簽名的那個(gè)組件叫作子組件
! 如有不太明白的地方,多看看代碼注釋。為細(xì)節(jié)地方
1. 首先根據(jù)element ui 在父組件中設(shè)置好diglog彈框,并且在全局樣式下,自定義樣式
<div class="canva" @click="centerDialogVisible = true">
// click綁定的方法是element提供的 centerDialogVisibe=true 是點(diǎn)擊時(shí)彈框出現(xiàn)
<img :src="imgsrc" alt=""/> // src = base64 ,下面介紹到
</div>
// div是在父組件中,所以有了下面子傳給父數(shù)據(jù)
// 然后設(shè)置dialog彈框基本樣式
// title為彈框中頭部出現(xiàn)的名字
// visible.sync 為click綁定的方法一樣
// width為整個(gè)dialog的寬度
// <sign></sign>是簽名組件,綁定的方法是自定義方法,子傳父,后面會(huì)詳細(xì)介紹
<el-dialog
title="簽名"
:visible.sync="centerDialogVisible"
width="85%"
center>
<sign @draw_save="getSignImg"></sign>
</el-dialog>
//然后在全局樣式下自定義彈框中默認(rèn)的內(nèi)容高度
.el-dialog {
.el-dialog__header{
height: 20px;
}
.el-dialog__body{
height: 400px;
overflow: auto; // 項(xiàng)目中其他dialog需要滾動(dòng)條,所以加上就會(huì)出現(xiàn)滾動(dòng)條。簽名可忽略
}
}
.el-dialog__wrapper .el-dialog__title{
font-size: 21px;
}
2. 然后在父組件data中定義centerDialogVisibe=false,imgsrc=''
data(){
return{
imgsrc: '', // base64編碼,保存為圖片用到
centerDialogVisible: false //dialog彈框顯示 fales不顯示,true顯示
}
}
3. 然后dialog彈框的樣式寫(xiě)好之后,就該引入組件了,組件是在網(wǎng)上找的,原文地址如下
原文地址是組件下載地址,并沒(méi)有過(guò)多介紹 download.csdn.net/download/we…
組件為單獨(dú)組件,通過(guò)components引入即可使用,根據(jù)項(xiàng)目需求自行配置編寫(xiě)樣式。當(dāng)作子組件引入父組件中。
組件內(nèi)容如下:
<template>
<div class="sign">
<canvas id="canvas" :width="width" :height="height"></canvas>
<div>
<button type="button" @click="clear" id="clear">清空</button>
<button type="button" @click="save" id="save">保存</button>
</div>
</div>
</template>
<script>
/*
* width canvas 寬度
* height canvas 高度
* strokeStyle 線(xiàn)條顏色
* showUrl 是否顯示預(yù)覽圖片
* imgWidth img 寬度
* imgHeight img 高度
* draw_clear //監(jiān)聽(tīng)清空事件
* draw_save //監(jiān)聽(tīng)保存事件 返回base64 img 路徑
* */
var preHandler = function (e) { e.preventDefault() }
export default {
name: 'drawSign',
props: {
width: {
type: String,
default: '565'
},
height: {
type: String,
default: '355'
},
strokeStyle: {
type: String,
default: '#000'
},
showUrl: {
type: Boolean,
default: true
},
imgWidth: {
type: String,
default: '240'
},
imgHeight: {
type: String,
default: '106'
}
},
data () {
return {
canvas: null, // canvas
ctx: null, // ctx canvas對(duì)象
stroke_info: null, // 當(dāng)前繪圖的坐標(biāo)
url: '' // base64 圖像
}
},
methods: {
init () {
let that = this
this.canvas = document.getElementById('canvas')
this.ctx = this.canvas.getContext('2d')
this.stroke_info = this.canvas.getBoundingClientRect()
this.canvas.addEventListener('touchstart', function (event) {
document.addEventListener('touchStart', preHandler, false)
that.darwStart(event)
})
this.canvas.addEventListener('touchend', function (event) {
document.addEventListener('touchend', preHandler, false)
that.drawEnd()
})
this.clear()
},
darwStart (e) {
let that = this
let t = e.changedTouches[0]
// console.log(t.clientX, t.clientY);
this.ctx.strokeStyle = this.strokeStyle
this.ctx.beginPath() // 清空所有繪畫(huà)路徑
this.ctx.moveTo(t.clientX - this.stroke_info.left, t.clientY - this.stroke_info.top)
this.canvas.addEventListener('touchmove', function (event) {
that.darwMove(event)
})
},
darwMove (e) {
let t = e.changedTouches[0]
this.ctx.lineTo(t.clientX - this.stroke_info.left, t.clientY - this.stroke_info.top)
this.ctx.stroke()
},
drawEnd () {
document.removeEventListener('touchstart', preHandler, false)
document.removeEventListener('touchmove', preHandler, false)
document.removeEventListener('touchend', preHandler, false)
},
clear () {
this.ctx.clearRect(0, 0, this.width, this.height)
this.url = ''
this.$emit('draw_clear')
},
save () {
console.log(this)
let data = this.canvas.toDataURL()
// let query = {url: data}
this.$emit('draw_save', data)
// $emit 傳data給父組件,當(dāng)簽名簽完了之后,會(huì)保存圖片的,data是base64編碼,圖片img src直接可識(shí)別
// console.log(this.canvas);
}
},
mounted () {
this.$nextTick(_ => {
this.init()
})
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
#clear,#save{
width:270px;
height:50px;
line-height:50px;
font-size:20px;
position:absolute;
}
#clear{
bottom:0;
}
#save{
bottom:0;
right:0;
}
</style>
4. 然后在父組件methods中寫(xiě)方法接收子組件傳來(lái)的data
// 如上標(biāo)簽中加入的自定義方法
getSignImg (val) {
//val 是接收子組件的data的
this.imgsrc = val // 讓簽的名變成圖片
this.centerDialogVisible = false
}
子組件有中帶有兩個(gè)按鈕,一個(gè)是清除,一個(gè)是確定,點(diǎn)擊確定時(shí),圖片保存到原來(lái)需要的位置后,dialog應(yīng)該關(guān)閉,所以加上了element ui 提供的
this.centerDialogVisible = false
就可以點(diǎn)擊確定,關(guān)閉dialog彈框了
總結(jié):
elemnet ui dailog彈框不要寫(xiě)入 標(biāo)簽內(nèi),要寫(xiě)在根元素中,不要被包裹,如下結(jié)構(gòu)可參考
</el-col>
</el-row>
<el-dialog
title="簽名"
:visible.sync="centerDialogVisible"
width="85%"
center>
<sign @draw_save="getSignImg"></sign>
</el-dialog>
</div>
想要點(diǎn)擊某個(gè)元素出現(xiàn)dialog彈框時(shí),就給某個(gè)元素加上element提供的點(diǎn)擊事件(),然后dialog中的定義(:visible.sync)也必須一致
在沒(méi)有引入組件之前,是在父組件中寫(xiě)js代碼,因?yàn)閐ialog彈框出現(xiàn)時(shí),彈框里面的dom才會(huì)加載,js會(huì)立即執(zhí)行,用了其提供的open方法也不是很理想,js代碼總會(huì)比dom先執(zhí)行一步,我也放在定時(shí)器中讓js緩慢執(zhí)行,然后清除定時(shí)器又成了問(wèn)題,所以就放棄了這種寫(xiě)法,改為組件引入。
如果某個(gè)元素綁定了element提供的點(diǎn)擊事件之后,想又得綁定一個(gè)點(diǎn)擊事件,那么把提供的方法寫(xiě)在自己的方法中
<div class="canva" @click="isShow">
methods:{
isShow(){
this.centerDialogVisible = true
//...
}
}
想要改變canvas寬高,畫(huà)線(xiàn)粗細(xì),畫(huà)線(xiàn)顏色,畫(huà)線(xiàn)背景,一定在子組件內(nèi)props中更改,自定義改會(huì)出問(wèn)題,canvas描線(xiàn)會(huì)模糊,有鋸齒
父組件想要子組件中的data,就利用子傳父,$emit ,父組件得用子組件的data,保存為圖片,子組件就得傳出去
然后以上就總結(jié)完畢,搜了好多文章,并沒(méi)有詳細(xì)的介紹簽名效果,有的是需要引入插件,有的是需要寫(xiě)js,有的更是要充某幣購(gòu)買(mǎi),很是麻煩,然后再這里寫(xiě)上這篇文章,是為了幫助更多的人,也許公司項(xiàng)目剛好也做這個(gè)效果呢,這些都有可能。不過(guò)還好下載的組件沒(méi)花錢(qián),花錢(qián)買(mǎi)了,怪怪的,免費(fèi)最好。
總結(jié)
以上所述是小編給大家介紹的vue+element加入簽名效果(移動(dòng)端可用),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- vue?vue-touch移動(dòng)端手勢(shì)詳解
- atom-design(Vue.js移動(dòng)端組件庫(kù))手勢(shì)組件使用教程
- 詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案
- 使用vue實(shí)現(xiàn)手寫(xiě)簽名功能
- vue 使用 canvas 實(shí)現(xiàn)手寫(xiě)電子簽名
- vue移動(dòng)端使用canvas簽名的實(shí)現(xiàn)
- VUE解決微信簽名及SPA微信invalid signature問(wèn)題(完美處理)
- 使用vue實(shí)現(xiàn)一個(gè)電子簽名組件的示例代碼
- 詳解Vue開(kāi)發(fā)微信H5微信分享簽名失敗問(wèn)題解決方案
- 基于Vue實(shí)現(xiàn)手勢(shì)簽名
相關(guān)文章
Vue結(jié)合Video.js播放m3u8視頻流的方法示例
本篇文章主要介紹了Vue+Video.js播放m3u8視頻流的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
詳解Vue如何將多個(gè)空格被合并顯示成一個(gè)空格
這篇文章主要為大家詳細(xì)介紹了在Vue中如何將多個(gè)空格被合并顯示成一個(gè)空格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
vue+elementUI實(shí)現(xiàn)多文件上傳與預(yù)覽功能實(shí)戰(zhàn)記錄(word/PDF/圖片/docx/doc/xlxs/txt)
這篇文章主要給大家介紹了關(guān)于利用vue+elementUI實(shí)現(xiàn)多文件上傳與預(yù)覽功能的相關(guān)資料,包括word/PDF/圖片/docx/doc/xlxs/txt等格式文件上傳,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
element--Diaolog彈窗打開(kāi)之后渲染組件方式
這篇文章主要介紹了element--Diaolog彈窗打開(kāi)之后渲染組件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
vue router 跳轉(zhuǎn)時(shí)打開(kāi)新頁(yè)面的示例方法
這篇文章主要介紹了vue router 跳轉(zhuǎn)時(shí)打開(kāi)新頁(yè)面的示例方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
vue el-upload手動(dòng)上傳實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了vue el-upload手動(dòng)上傳實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
詳解vue項(xiàng)目?jī)?yōu)化之按需加載組件-使用webpack require.ensure
本篇文章主要介紹了詳解vue項(xiàng)目?jī)?yōu)化之按需加載組件-使用webpack require.ensure,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
vue3.0父?jìng)鹘o子的值不隨父組件改變而改變問(wèn)題及解決
這篇文章主要介紹了vue3.0父?jìng)鹘o子的值不隨父組件改變而改變問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Vue+Echarts實(shí)現(xiàn)柱狀折線(xiàn)圖
這篇文章主要為大家詳細(xì)介紹了Vue+Echarts實(shí)現(xiàn)柱狀折線(xiàn)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

