针对react-captcha-code第三方插件不能每次触发深颜色的处理

简介: 针对`react-captcha-code`插件生成浅色验证码的问题,通过改造成class组件`MyCaptcha.js`,自定义颜色和验证码生成逻辑,解决了颜色问题。

针对react-captcha-code第三方插件不能每次触发深颜色的处理:

react-captcha-code npm地址

https://www.npmjs.com/package/react-captcha-code/v/1.0.4

在node_modules中找到这个第三方依赖包:
在这里插入图片描述

将之改造成class组件:MyCaptcha.js

验证码组件:


/**
 * 
 * 原本使用react-captcha-code 这个第三方插件  但是会生成浅色字符验证码
 * 
 * 只针对颜色进行了处理  换成了class的形式
 * 
 * 如还想使用以前的第三方组件  只需在 login组件中 引入方式去掉My  即import Captcha from '../component/Captcha';
 * 
 * 
 * handleClickCaptcha
 *  这个方法是父组件传入的回调方法
 */
import React, {
    PureComponent } from 'react';
export default class Login extends PureComponent {
   
    state = {
   
        height: 40,//canvas的高
        width: 100,//canvas的宽
        bgColor: '#DFF0D8',//背景颜色
        charNum: 4,//验证码个数
        fontSize: 25,//验证码字体大小
        originalCharacter: [//可以生成验证码的字符
            '1',
            '2',
            '3',
            '4',
            '5',
            '6',
            '7',
            '8',
            '9',
            'a',
            'b',
            'c',
            'd',
            'e',
            'f',
            'g',
            'h',
            'i',
            'j',
            'k',
            'l',
            'm',
            'n',
            'p',
            'q',
            'r',
            's',
            't',
            'u',
            'v',
            'w',
            'x',
            'y',
            'z',
        ]
    };

    handleClick = () => {
   
        // 触发父组件传来的事件 更新
        this.props.handleClickCaptcha(this.generateCaptcha())
    }
    // 随机数字
    randomNum = (m, n) => {
   
        return Math.floor(Math.random() * (n - m + 1) + m);
    }
    // 随机颜色
    randomColor = () => {
   
        return `rgb(${
     this.randomNum(0, 92)}, ${
     this.randomNum(0, 92)}, ${
     this.randomNum(0, 92)})`;
    }
    // 返回验证码
    generateCaptcha = () => {
   
        let {
    height, width, bgColor, fontSize, charNum, originalCharacter } = this.state
        let checkCode = '';
        let canvas = document.getElementById("canvas")
        canvas.width = width;
        canvas.height = height;
        const ctx = canvas.getContext('2d');
        ctx.clearRect(0, 0, width, height);
        ctx.beginPath()
        ctx.fillStyle = bgColor;
        ctx.fillRect(0, 0, width, height);
        for (let i = 0; i < charNum; i++) {
   
            const charGap = Math.round(width / charNum)
            const offset = Math.round(charGap / 2) - 6;
            const code = originalCharacter[this.randomNum(0, originalCharacter.length - 1)];
            checkCode += code;
            ctx.save();
            ctx.beginPath();
            ctx.fillStyle = "white";
            ctx.strokeStyle = this.randomColor();
            ctx.font = `${
     fontSize}px serif`;
            ctx.rotate((Math.PI / 180) * this.randomNum(-5, 5));
            ctx.strokeText(code, offset + i * charGap, height / 2 + 8);
            ctx.beginPath();
            ctx.moveTo(this.randomNum(0, width), this.randomNum(0, height));
            ctx.lineTo(this.randomNum(0, width), this.randomNum(0, height));
            ctx.stroke();
            ctx.restore();
        }
        return checkCode
    }
    componentDidMount() {
   
        // 页面初次渲染 第一次调用父组件传过来的函数并将新生成的验证码返回
        this.props.handleClickCaptcha(this.generateCaptcha())
    }
    render() {
   
        return (
            <canvas id="canvas" onClick={
   this.handleClick}></canvas>
        )
    }
}

使用:
引用:

import Captcha from '../component/MyCaptcha';

使用:

<Captcha handleClickCaptcha={
   this.handleClickCaptcha.bind(this)} />

方法:

    // 接收验证码
    handleClickCaptcha(data) {
   
        this.setState({
   
            captcha: data,
        })
    }

在这里插入图片描述

目录
相关文章
|
2月前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
54 4
React技术栈-React路由插件之自定义组件标签
|
2月前
|
前端开发 程序员 API
React技术栈-React路由插件之react-router的基本使用
这篇博客介绍了React路由插件react-router的基本使用,包括其概念、API、以及如何通过实战案例在React应用中实现SPA(单页Web应用)的路由管理。
68 9
|
3月前
|
前端开发 C++
使用 Vite 创建 React+TS+SW 项目并整合 AntDesign 、Scss 等组件或插件
本文记录了如何使用Vite创建一个React+TypeScript+Service Workers(SW)项目,并整合AntDesign组件库和Scss等插件,包括项目的创建、配置问题解决、AntDesign和Scss的整合方法。
251 1
|
6月前
|
前端开发 数据可视化 API
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏(二)
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏
411 0
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏(二)
|
6月前
|
前端开发 JavaScript CDN
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏(一)
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏
219 0
|
6月前
|
前端开发 JavaScript
React vscode 开发插件与代码补全提示
React vscode 开发插件与代码补全提示
262 0
|
前端开发 JavaScript 算法
为什么改变react状态,会触发组件重新渲染?
为什么改变react状态,会触发组件重新渲染?
145 2
|
前端开发
滚动页面触发相应位置动画 ---react
滚动页面触发相应位置动画 ---react
|
前端开发
|
前端开发 JavaScript
React render 的原理和触发时机
React render 的原理和触发时机
156 0