在react中通过jsplumb实现动态的流向图

在项目业务上有一个能源流向图的需求需要实现,我选择的是jsplumb框架库,它可以绘制流程图表;大致的动态能源流向图demo如下:

 想要实现上面的流向图,首先要先熟悉jsplumb的几个api和属性。

一、安装使用jsplumb

npm install jsplumb //安装jsplumb库

import {jsPlumb} from "jsplumb"; //引入jsplumb库

二、API与属性

1、getInstance() 方法用于返回一个已创建的jsPlumbInstance对象。jsPlumbInstance 是 jsPlumb 库中重要的对象之一,它代表了一个 jsPlumb 实例,并包含了一系列 API 和配置选项,用于管理连接器和元素。

2、repaintEverything()方法用于重新渲染整个页面上的连接器,以适应元素位置或大小的变化。当元素被移动或缩放时,它们的位置、大小、旋转等属性都会发生变化。如果这些元素与其他元素之间存在连接器,则连接器的位置和样式也需要相应地进行更新,以保证页面上的连接显示正确。

3、deleteEveryConnection()方法用于删除页面上的所有连接器。当你需要一次性删除页面上所有的连接器时,可以调用 deleteEveryConnection() 方法。这个方法会遍历整个页面上的连接器,并将它们全部删除。

4、connect()方法用于创建一个连接器,并将其连接到页面上的两个元素之间.

5、属性字段参数:

  1. source:连接节点的起始位置。
  2. target:连接节点的结束位置。
  3. anchor:连接的位置(Right ,Left,Bottom,Top)。
  4. orerlays:给连接的线上添加小箭头。
  5. connector:连接的线的类型(Bezier:贝塞尔曲线;Flowchart:流程线;StateMachine:状态机;Straight:直线)。

具体的参考文档可以看这个:jsplumb 中文基础教程 (wdd.js.org)

三、完整代码

export default function Test(props:any) {
    let timer: any;
    const instance = jsPlumb.getInstance();//创建一个jsplumb对象
    const resize = () => {
        instance.repaintEverything();
    };
    const clear = () => {
        if (timer) {
            clearInterval(timer);
        }
        instance.deleteEveryConnection();
    };

    const init = () => {
        let m = 0.01;
        timer = setInterval(() => {
            m += 0.002;
            if (m > 0.98) {
                m = 0.012;
            }
            instance.deleteEveryConnection();

            //连接图一和图二
            instance.connect({
                source: "flowChart1",//图一的id
                target: "flowChart2",//图二的id
                endpoint: "Blank", //端点的形状设置为空
                connector: ["Flowchart", { cornerRadius: 2 }],
                anchor: ["Right", "Left"],//连接端点的位置,起始节点的右侧和结束节点的左侧
                paintStyle: { stroke: "#457DA5", strokeWidth: 2 },//线的样式
                overlays: [
                    ["Arrow", { width: 12, length: 12, location: m }],//小箭头样式及位置
                ],
            });
            //连接图二和图三
            instance.connect({
                source: "flowChart2",
                target: "flowChart3",
                endpoint: "Blank",
                connector: ["Flowchart", { cornerRadius: 2 }],
                anchor: ["Right", "Left"],
                paintStyle: { stroke: "#474554", strokeWidth: 2 },
                overlays: [
                    ["Arrow", { width: 12, length: 12, location: m }],
                ],
            });
            //连接图四和图三
            instance.connect({
                source: "flowChart4",
                target: "flowChart3",
                endpoint: "Blank",
                connector: ["Flowchart", { cornerRadius: 2 }],
                anchor: ["Right", "Left"],
                paintStyle: { stroke: "#27951D", strokeWidth: 2 },
                overlays: [
                    ["Arrow", { width: 12, length: 12, location: m }],
                ],
            });
            //连接图四和图二
            instance.connect({
                source: "flowChart4",
                target: "flowChart2",
                endpoint: "Blank",
                connector: ["Flowchart", { cornerRadius: 2 }],
                anchor: ["Bottom", "Bottom"],
                paintStyle: { stroke: "#27951D", strokeWidth: 2 },
                overlays: [
                    ["Arrow", { width: 12, length: 12, location: m }],
                ],
            });

        }, 20);
    };
    useEffect(() => {
        init();
        window.addEventListener("resize", resize);
        return () => {
            clear();
            window.removeEventListener("resize", resize);
        };
    }, []);

    return (
          <div style={{width:'100%',display:"flex",justifyContent:"space-between"}}>
              <div id={'flowChart1'} style={{border: "5px solid #457DA5"}}>FlowChart1</div>
              <div id={'flowChart2'} style={{border: "5px solid #474554"}}>FlowChart2</div>
              <div id={'flowChart3'} style={{border: "5px solid #9C8D41"}}>FlowChart3</div>
              <div id={'flowChart4'} style={{border: "5px solid #27951D"}}>FlowChart4</div>
          </div>
      );
};

以上代码就可以实现图例中的流向图了,有什么其他的好方法欢迎评论交流。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在React实现形验证码,可以使用第三方库react-captcha来生成验证码。首先,需要在项目安装react-captcha。 ``` npm install react-captcha --save ``` 然后,在组件使用Captcha组件来生成验证码。在这个组件,我们可以设置一些属性,例如验证码长度、字符集、背景颜色等等。在这个例子,我们将生成一个长度为6的验证码,字符集为大小写字母和数字,背景颜色为浅灰色。 ``` import React from 'react'; import Captcha from 'react-captcha'; class CaptchaExample extends React.Component { render() { return ( <Captcha captchaCodeLength={6} captchaChars={'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'} captchaBgColor={'#f2f2f2'} /> ); } } export default CaptchaExample; ``` 此时,我们已经能够在React生成形验证码了。但是,我们还需要在验证码输入框验证用户输入是否正确。这可以通过在Captcha组件上设置onVerify属性来实现。 ``` import React from 'react'; import Captcha from 'react-captcha'; class CaptchaExample extends React.Component { constructor(props) { super(props); this.state = { captchaCode: '', validCaptcha: '' }; } handleVerify = code => { this.setState({ validCaptcha: code }); }; handleSubmit = e => { e.preventDefault(); if (this.state.captchaCode === this.state.validCaptcha) { alert('验证码正确!'); } else { alert('验证码错误!'); } }; handleChange = e => { this.setState({ captchaCode: e.target.value }); }; render() { return ( <form onSubmit={this.handleSubmit}> <Captcha captchaCodeLength={6} captchaChars={'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'} captchaBgColor={'#f2f2f2'} onVerify={this.handleVerify} /> <input type="text" value={this.state.captchaCode} onChange={this.handleChange} /> <button type="submit">提交</button> </form> ); } } export default CaptchaExample; ``` 在这个例子,我们在Captcha组件上设置了onVerify属性,当用户输入验证码时,会自动调用handleVerify方法,将生成的验证码存储在validCaptcha状态。当用户提交表单时,将会比较用户输入的验证码和生成的验证码是否一致。如果一致,则弹出“验证码正确!”的提示框,否则弹出“验证码错误!”的提示框。 这样,我们就完成了在React生成形验证码的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值