前言
第一次写博记录学习harmonyOS开发的过程,文案功底差请见谅!
场景
刚开始学习harmonyOS开发,近期有一个翻译网报APP的需求,在登录的时候需要验证码过滤验证码机器人试错。
参考
https://blog.csdn.net/zcczero/article/details/137057040
感谢 zcczero 大神的帖子 可以直接拿来使用,不过要注意一点就是:
图形绘制这里需要自己手动加一个类,如下图所示:
那么问题来了,我需要在用户登录不管成功还是失败都重置新的验证码怎么办?
由于对arkts的熟练度不够,刚开始老想着能不能像HTML那样去获取验证码这个组件的element。经过多番搜索失败告终,
然后像了一个并不人性化的处理,因为@link装饰器需要传引用 那么我在提交的时候修改验证码内的值,至少避免了验证机器人
的试错漏洞,但是这样一旦登录失败,验证码就跟图片显示的验证码不一致,始终不人性化。
解决
临近下班,有个同事让我看一个@watch的装饰器,我当时简单看了一下,感觉这个方案可行。
试着直接在引用类中加入@watch装饰器。
报错:堆栈溢出,然后详细了解了一下@watch装饰器的特性
只支持string类型
于是乎就单独加了一个string类型字段,这个字段我只需要单向从父级同步到子级就行 所以使用@prop装饰器
@ watch 装饰器特点是检测这个字段的文本修改,然后触发文本修改事件:
最后贴一个验证码组件的完整代码
@Component export default struct ImageCode { //指定canvas要绘制的图形的宽(可使用@Prop装饰器装饰,由调用此组件的父组件传递) @State canvas_width: number = 110; //指定canvas要绘制的图形的高 @State canvas_height: number = 40; //用于接收图形验证码的文本值 @Link showCode: VerCode @Prop @Watch("valueChange") text : string //用来配置CanvasRenderingContext2D对象的参数,包括是否开启抗锯齿,true表明开启抗锯齿。 private settings: RenderingContextSettings = new RenderingContextSettings(true) //用来创建CanvasRenderingContext2D对象,通过在canvas中调用CanvasRenderingContext2D对象来绘制。 private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings) build() { Row() { //在canvas中调用CanvasRenderingContext2D对象。 Canvas(this.context) .width(this.canvas_width) .height(this.canvas_height) .backgroundColor('#B8DACC') .onReady(() => { //在这里绘制图形 // let region=new Path2D(); // region.arc(50,10,1,0,5); this.showCode.vcode = CommonUtil.drawImgCode(this.context, this.canvas_width, this.canvas_height) console.log(this.showCode.vcode) }) .onClick(() => { this.showCode.vcode = CommonUtil.drawImgCode(this.context, this.canvas_width, this.canvas_height) console.log(this.showCode.vcode) }) } .width('100%') .height('100%') } valueChange(text: string) { this.showCode.vcode = CommonUtil.drawImgCode(this.context, this.canvas_width, this.canvas_height) console.log(this.showCode.vcode) } }
调用的地方,随意修改文本内容即可。
到此问题解决,看一下最终的效果。
标签:vcode,canvas,harmonyOS,showCode,验证码,height,width,Next From: https://www.cnblogs.com/yuki-/p/18320285