下面介绍为了方便就把项目的文件叫作父组件,然后签名的那个组件叫作子组件
! 如有不太明白的地方,多看看代码注释。为细节地方
1. 首先根据element ui 在父组件中设置好diglog弹框,并且在全局样式下,自定义样式
<div class="canva" @click="centerDialogVisible = true">
// click绑定的方法是element提供的 centerDialogVisibe=true 是点击时弹框出现
<img :src="/UploadFiles/2021-04-02/imgsrc">
2. 然后在父组件data中定义centerDialogVisibe=false,imgsrc=''
data(){
return{
imgsrc: '', // base64编码,保存为图片用到
centerDialogVisible: false //dialog弹框显示 fales不显示,true显示
}
}
3. 然后dialog弹框的样式写好之后,就该引入组件了,组件是在网上找的,原文地址如下
原文地址是组件下载地址,并没有过多介绍 download.csdn.net/download/we…
组件为单独组件,通过components引入即可使用,根据项目需求自行配置编写样式。当作子组件引入父组件中。
组件内容如下:
<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 线条颜色
* showUrl 是否显示预览图片
* imgWidth img 宽度
* imgHeight img 高度
* draw_clear //监听清空事件
* draw_save //监听保存事件 返回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对象
stroke_info: null, // 当前绘图的坐标
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() // 清空所有绘画路径
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给父组件,当签名签完了之后,会保存图片的,data是base64编码,图片img src直接可识别
// 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中写方法接收子组件传来的data
// 如上标签中加入的自定义方法
getSignImg (val) {
//val 是接收子组件的data的
this.imgsrc = val // 让签的名变成图片
this.centerDialogVisible = false
}
子组件有中带有两个按钮,一个是清除,一个是确定,点击确定时,图片保存到原来需要的位置后,dialog应该关闭,所以加上了element ui 提供的
this.centerDialogVisible = false
就可以点击确定,关闭dialog弹框了
总结:
elemnet ui dailog弹框不要写入 标签内,要写在根元素中,不要被包裹,如下结构可参考
</el-col>
</el-row>
<el-dialog
title="签名"
:visible.sync="centerDialogVisible"
width="85%"
center>
<sign @draw_save="getSignImg"></sign>
</el-dialog>
</div>
想要点击某个元素出现dialog弹框时,就给某个元素加上element提供的点击事件(),然后dialog中的定义(:visible.sync)也必须一致
在没有引入组件之前,是在父组件中写js代码,因为dialog弹框出现时,弹框里面的dom才会加载,js会立即执行,用了其提供的open方法也不是很理想,js代码总会比dom先执行一步,我也放在定时器中让js缓慢执行,然后清除定时器又成了问题,所以就放弃了这种写法,改为组件引入。
如果某个元素绑定了element提供的点击事件之后,想又得绑定一个点击事件,那么把提供的方法写在自己的方法中
<div class="canva" @click="isShow">
methods:{
isShow(){
this.centerDialogVisible = true
//...
}
}
想要改变canvas宽高,画线粗细,画线颜色,画线背景,一定在子组件内props中更改,自定义改会出问题,canvas描线会模糊,有锯齿
父组件想要子组件中的data,就利用子传父,$emit ,父组件得用子组件的data,保存为图片,子组件就得传出去
然后以上就总结完毕,搜了好多文章,并没有详细的介绍签名效果,有的是需要引入插件,有的是需要写js,有的更是要充某币购买,很是麻烦,然后再这里写上这篇文章,是为了帮助更多的人,也许公司项目刚好也做这个效果呢,这些都有可能。不过还好下载的组件没花钱,花钱买了,怪怪的,免费最好。
总结
以上所述是小编给大家介绍的vue+element加入签名效果(移动端可用),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]