基于react封装的一个步骤条组件

子组件

在这里插入图片描述

tsx文件

import React from 'react';
import './staticOA.less'

export enum LineMode {
    Left,
    Right,
    NoLine,
    JustLine,
}

export default function StaticOA(props: any) {
    const { data, lineMode, personMessageMode, stepNum, istop, isError, isActive, error1, active1, error2, active2 } = props
    return (
        <>
            <div className={['content', isError ? 'isError' : '', isActive ? 'isActive' : ''].join(' ')}>
                {
                    lineMode !== LineMode.JustLine && lineMode !== LineMode.NoLine && personMessageMode === 'bottom' ?
                        <div className="info">
                            {lineMode === LineMode.Left ? <div className="line"></div> : null}
                            <div className="stepNum">{stepNum}</div>
                            <div className="stepName">{data.name}
                                <div className="message">
                                    <div>{data.auditTime}</div>
                                    <div>{data.auditName}{data.phone ? `(${data.phone})` : null}</div>
                                </div>
                            </div>
                            {lineMode === LineMode.Right ? <div className="line"></div> : null}
                        </div> : <></>
                }
                {
                    lineMode == LineMode.JustLine ?
                        <div className="node">
                            <div className={["lineNode1", error1 ? 'error' : '', active1 ? 'active' : ''].join(' ')}></div>
                            <div className={["lineNode2", error2 ? 'error' : '', active2 ? 'active' : ''].join(' ')}></div>
                        </div> : null
                }
                {
                    lineMode == LineMode.NoLine && personMessageMode === 'bottom' ?
                        <div className={['info', 'set_height', istop ? 'top' : 'bottom'].join(' ')} >
                            <div className="stepNum">{stepNum}</div>
                            <div className="stepName">{data.name}
                                <div className="message">
                                    <div>{data.auditTime}</div>
                                    <div>{`${data.auditName}(${data.phone})`}</div>
                                </div>
                            </div>
                        </div> : <></>
                }

            </div>
        </>
    );

}

less文件

.content {
  display: inline-block;

  .info {
    display: flex;
    //主轴居中
    justify-content: center;
    align-items: baseline;

    .stepNum {
      width: 20px;
      height: 20px;
      margin-left: 10px;
      border-radius: 50%;
      background-color: gray;
      color: #fff;
      text-align: center;
      line-height: 20px;
    }

    .stepName {
      margin-left: 10px;
      margin-right: 10px;
    }

    .line {
      width: 60px;
      height: 3px;
      background-color: gray;
    }
  }

  .set_height {
    height: 120px;
    // align-items: center;
    align-self: baseline;
  }

  .node {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: baseline;
    width: 40px;
    height: 120px;
    position: relative;
    bottom: 20px;

  
    .lineNode1 {
      width: 40px;
      height: 60px;
      border-left: 3px solid gray;
      border-top: 3px solid gray;
    }

    .lineNode2 {
      width: 40px;
      height: 60px;
      border-left: 3px solid gray;
      border-bottom: 3px solid gray;
    }

    .error {
      border-color: #d9001b;
    }

    .active {
      border-color: #4aa8ff;
    }
  }
}

.isError {
  color: #d9001b;

  .info {
    .stepNum {
      background-color: #d9001b;
    }

    .line {
      width: 60px;
      height: 3px;
      background-color: #d9001b;
    }
  }
}

.isActive {
  color: #4aa8ff;

  .info {
    .stepNum {
      background-color: #4aa8ff;
    }

    .line {
      width: 60px;
      height: 3px;
      background-color: #4aa8ff;
    }
  }
}

父组件

tsx文件

import React from 'react';
import StaticOA, { LineMode } from './staticOA'
import './staticNode.less'

export default function StaticOANode() {
    const data = [
        {
            "name": "客户登记",
            "auditName": "张三",
            "phone": "15676543431",
            "auditTime": "2021-03-04 19:18:58",
            "taskStatus": {
                "code": 1,
                "label": "通过",
                "value": 1
            }
        },
        {
            "name": "签署合同",
            "auditName": "伊泽瑞尔2",
            "phone": "191****0003",
            "auditTime": "2021-03-04 19:18:58",
            "taskStatus": {
                "code": 1,
                "label": "通过",
                "value": 1
            }
        },
        {
            "name": "审核1",
            "auditName": "财务",
            "phone": "13144445522",
            "auditTime": "2021-03-04 19:19:12",
            "taskStatus": {
                "code": 1,
                "label": "通过",
                "value": 1
            }
        },
        {
            "name": "审核2",
            "auditName": "李四",
            "phone": "15676543431",
            "auditTime": "2021-03-04 19:19:31",
            "taskStatus": {
                "code": 2,
                "label": "不通过",
                "value": 2
            }
        },
        {
            "name": "回访1",
            "processInstanceId": "1120070",
            "auditName": "",
            "phone": "",
            "auditTime": "",
            "taskStatus": {
                "code": 0,
                "label": "待审核",
                "value": 0
            }
        },
        {
            "name": "回访2",
            "auditName": "",
            "phone": "",
            "auditTime": "",
            "taskStatus": {
                "code": 0,
                "label": "待审核",
                "value": 0
            }
        },
        {
            "name": "通过",
            "auditName": "",
            "phone": "",
            "auditTime": "",
            "taskStatus": {
                "code": 0,
                "label": "待审核",
                "value": 0
            }
        }
    ]

    return (
        <div className="container">
            <StaticOA data={data[0]} lineMode={LineMode.Right} personMessageMode={'bottom'} stepNum={1} isError={data[0].taskStatus.value === 2} isActive={data[0].taskStatus.value === 1} />
            <StaticOA data={data[1]} lineMode={LineMode.Right} personMessageMode={'bottom'} stepNum={2} isError={data[1].taskStatus.value === 2} isActive={data[1].taskStatus.value === 1} />
            <StaticOA lineMode={LineMode.JustLine} error1={data[2].taskStatus.value === 2} error2={data[3].taskStatus.value === 2} active1={data[2].taskStatus.value === 1} active2={data[3].taskStatus.value === 1} />
            <div className="container_nodes">
                <div className="container_node">
                    <StaticOA data={data[2]} lineMode={LineMode.NoLine} personMessageMode={'bottom'} stepNum={3} istop={true} isError={data[2].taskStatus.value === 2} isActive={data[2].taskStatus.value === 1} />
                    <StaticOA data={data[3]} lineMode={LineMode.NoLine} personMessageMode={'bottom'} stepNum={4} istop={false} isError={data[3].taskStatus.value === 2} isActive={data[3].taskStatus.value === 1} />
                </div>
            </div>
            <StaticOA data={data[4]} lineMode={LineMode.Left} personMessageMode={'bottom'} stepNum={5} isError={data[4].taskStatus.value === 2} isActive={data[4].taskStatus.value === 1} />
            <StaticOA data={data[5]} lineMode={LineMode.Left} personMessageMode={'bottom'} stepNum={6} isError={data[5].taskStatus.value === 2} isActive={data[5].taskStatus.value === 1} />
            <StaticOA data={data[6]} lineMode={LineMode.Left} personMessageMode={'bottom'} stepNum={7} />
        </div>
    );

}

less文件

.container {
  background: #fff;
  padding: 24px;
  display: flex;
  align-items: center;

  .container_nodes {
    display: inline-block;

    .container_node {
      display: flex;
      flex-direction: column;
      align-items: baseline;
      justify-content: space-between;
      position: relative;
      top: 20px;
    }
  }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值