手写表格组件和文本标签


  现在的前端ui框架越来越多,各个不同的ui框架有着自己明显的风格,而我们自己在开发时候难免会遇到一些框架不切合,或者需要定制化开发的情况。例如,我们之前写的一个前端项目,ui框架用的是 blueprint,facebook 的那一套。之后又写的一个项目用的是 antdesign ,蚂蚁金服的。

主要内容:

本文主要内容是记录一些自己在前端开发时遇到的一些需要造轮子的问题,记录分享。主要两点问题:一是blueprint框架提供的table组件可用性太差,于是自己手写了一个table组件;二是手动封装一个显示文本标签,解决表内容超出长度的问题。另外是分享一个写typescript在antd中踩的小坑。

一、commenTableList,自己封装的表格组件

  blueprint 的ui画风更偏社交应用一些,而 antdesign 明显就是更适合用做数据报表,在数据展示,呈现。我们当时用的是 blueprint3.2.0 版本,可能因为blueprint更趋于社交应用的原因,它表格展示的table适配性很差,于是我在项目中自己重新封装了一个commenTableList组件用于项目中表格展示数据。代码如下:

import * as React from 'react';
import {Spinner,Text} from '@blueprintjs/core';

export interface IProps{
    data:any[],
    config:any[],
    table_width:string,
    loading:string,
}

export class TableList extends React.PureComponent<IProps,any>{
    constructor(props:IProps){
        super(props)
        this.state = {
            data:props.data,
            config:props.config,
            table_width:props.table_width,
            loading:props.loading,
        }
    }

    // 组件初始化时不调用,组件接受新的props时调用
    public componentWillReceiveProps(nextProps:IProps){
        this.setState({
            data:nextProps.data,
            config:nextProps.config,
            table_width:nextProps.table_width,
            loading:nextProps.loading,
        });
    }

    public renderTable(data:any,config:any,tableWidth:string,loading:string){
        let html:any = '';
        if(loading === 'loading'){
            html = <Spinner/>
        }else if(loading === 'success'){
            if(data.length<=0){
                html = <div>当前暂时没有数据。</div>;
            }else{
                html= <table className="mytable"  style={{width:tableWidth}}>
            <thead>
                <tr>
                    {
                        config.map(
                            (e:any)=>{
                                return(
                                // tslint:disable-next-line:jsx-key
                                <td style={{width:e.width}}>
                                    {
                                        e.label
                                    }             
                                </td>
                                )
                            }
                        )
                    }
                </tr>
            </thead>
            <tbody>
                {
                    data.map(
                    (ele:any)=>{
                        return(
                        // tslint:disable-next-line:jsx-key
                        <tr>
                           {
                               config.map(
                                   (e:any)=>{
                                        let r=<div/>
                                        e.render!==undefined?
                                        r=<td style={{width:e.width}}>
                                        <div style={{width:'100%'}}>
                                        <Text ellipsize={true} tagName='div'> {e.render(ele)} </Text> 
                                        </div>                        
                                        </td>:
                                        r=<td style={{width:e.width}}>
                                        <div style={{width:'100%'}}>
                                        <Text ellipsize={true} tagName='div'> {ele[e.key]} </Text>     
                                        </div>                                               
                                        </td>;
                                        return(r)
                                    }
                               )
                           }
                        </tr>)
                    })
                }
                
            </tbody>
        </table>​
            }
        }else if(loading === 'error'){
            html = <div>当前暂时没有数据。</div>;
        }
        return html;
    }
   
    public render(){
        const {data,config,table_width,loading} = this.state;
        return (
            <div style={{width:'100%',height:'100%'}}>
               {this.renderTable(data,config,table_width,loading)}
            </div>
        )
    }
}

使用时只需要向 TableList 组件中传入 config,table_width,和 data。其中 config 为 table 的配置项配置列名,数据的字段名,和该列宽度。 table_width为表的宽度。
。例如,我写了一个测试组件,效果如图:
在这里插入图片描述
其中传入的 config 为 table 如下:

public render() {
    const config = [
      {
        key:'addressName',label:'轨迹名称',width:'20%'
      },
      {
        key:'trailRemark',label:'轨迹描述',width:'20%'
      },
      {
        key:'trailTime',label:'轨迹时间',width:'20%'
      },
      {
        key:'Remark',label:'描述',width:'20%'
      },
      {
        key:'Time',label:'时间',width:'20%'
      },
    ]
    const data = [
      {
        addressName : '111',
        trailRemark : '111',
        trailTime : '111',
        Remark : '111',
        Time : '111',
      },
      {
        addressName : '222',
        trailRemark : '222',
        trailTime : '222',
        Remark : '222',
        Time : '222',
      },
      {
        addressName : '333',
        trailRemark : '333',
        trailTime : '2333',
        Remark : '333',
        Time : '333',
      },
      {
        addressName : '444',
        trailRemark : '444',
        trailTime : '444',
        Remark : '444',
        Time : '444',
      },
      {
        addressName : '555',
        trailRemark : '555',
        trailTime : '555',
        Remark : '555',
        Time : '555',
      },
    ]
    return(
      <TableList data={data} config={config} loading='success' table_width={'100%'}/>
    );

基本上项目中各种需要表格形式展示的,都可以直接调用该组件。

二、antd的一些适配组件

  在使用 antd 的 table 组件时,如果页面上表格样式不够大,或数据太长就会出现下面这种情况
在这里插入图片描述
页面无法正常展示,对此有几种解决方法,最简单的当然就是修改表的样式。但是在一些极端情况下这种方法会显得十分无力。因此我推荐自己封装一个文本标签组件用作适配 table 展示数据 —— text标签。
  用该标签嵌套展示的文本内容,向其传入data和widths。data为文本内容,widths为标签宽度,当内容超过设定宽度时会自动省略,鼠标悬浮在上面可以查看省略的内容。效果图如下:
在这里插入图片描述
代码如下:

Text标签

import * as React from 'react';

export interface IProps{
  data : string ,
  widths : string,
}

export class Text extends React.PureComponent<IProps,any>{

  constructor(props:any){
    super(props);
    this.state = {
      data: this.props.data,
      widths: this.props.widths,
    }
  }

  public componentWillReceiveProps(nextProps:IProps){
    this.setState({
      data: nextProps.data,
      widths: nextProps.widths,
    });
  }

  public render() {
    const {data,widths} = this.state;
    return(
      <div className="text-lable" style={{width : widths}} title={data}> {data} </div>
    )
  }
}

div,text-lable的样式

.text-lable{
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  word-wrap: normal;
}

text在table中的使用实例

在table渲染的时候回调。将具体内容传入text标签展示就能得到上图效果。table里的text标签具体使用实例如下:

          <Table style={{ height: 600, width: 600 }}
            dataSource={dataModal}
            bordered={false}
            columns={[
              {
                title: '实体ID',
                dataIndex: 'entityID',
                render: (text: any) => <Text widths="60px" data={text}/>
              },
              {
                title: '出现地点',
                dataIndex: 'entitySpace',
                render: (text: any) => <Text widths="60px" data={text}/>
              },
              {
                title: '出现时间',
                dataIndex: 'entityTime',
                render: (text: any) => <Text widths="60px" data={text}/>
              },
              {
                title: '伴随ID',
                dataIndex: 'accompanyID',
                render: (text: any) => <Text widths="60px" data={text}/>
              },
              {
                title: '出现地点',
                dataIndex: 'accompanySpace',
                render: (text: any) => <Text widths="60px" data={text}/>
              },
              {
                title: '出现时间',
                dataIndex: 'accompanyTime',
                render: (text: any) => <Text widths="60px" data={text}/>
              },
            ]} 
            pagination={{   // 分页
              pageSize : 9,
            }} 
          />

关于andt的table在typescript中的一个小坑

主要关于antd,table的api中rowclassname属性回调函数的问题,也算是一个不大不小的坑,没有经验的话很容易才进去。
  我是在写表的隔行变色的样式的时候遇到的。在这里插入图片描述
如上图效果,思路是给回调的时候给各行一个classname,然后写自己想要的样式。antd 的官方api给的rowclassname回调函数如下,但是在typescript中直接这么写会 TSlint 报错。在这里插入图片描述
一开始rowclassname是这么写的

rowClassName={(record, index) => {
     let className = 'light-row';
     if (index % 2 === 1) className = 'dark-row';
     return className;
}

就官方api而言没什么问题,但在typescript中样写会报错,TSlint认为这种写法不符合它的可读性。刚开始写ts的小伙伴可能会找很久的原因。其实只需要再外面嵌套一层return就行。正确代码如下:

     <Table
          dataSource={dataList}
          bordered={false}
          columns={[
            {
              title: '实体ID',
              dataIndex: 'entityID',
            },
            {
              title: '匹配次数',
              className: 'column-money',
            },
            {
              title: '匹配度',
              dataIndex: 'degree',
            },
          ]} 
          rowClassName={this.rowName()}
        />

//  rowName方法:
  private rowName = () => {
    return (record: any, index: number) => {
      let className = 'light-row';
      if (index % 2 === 1) {
        className = 'dark-row'
      };
      return className;
    }
  }

css样式:

.light-row {
  background: #ffffff;
}
.dark-row {
  background: #f4f8ff;
}

这样写就能得到上述隔行变色的table样式。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
app端手写签名组件是指在移动应用程序中添加手写签名的功能模块。该组件可以允许用户使用手指或者触控笔在移动设备的屏幕上进行自由绘制,以实现电子签名的效果。 手写签名组件的实现原理是利用移动设备的触摸屏技术,将用户的触摸手势转化为相应的电子图像。具体而言,当用户在屏幕上滑动手指或触控笔时,组件会将这些坐标点记录下来,并以连续的线条形式显示在屏幕上。用户可以在画板上进行书写、绘制、擦除等操作,实现个性化的签名效果。 手写签名组件的使用场景广泛,可以应用于各类需要签名确认的场合。比如,在电子合同签署时,用户可以通过手写签名组件,在移动设备上输入自己的签名,代替传统的纸质签名,提高效率和便捷性。此外,手写签名组件还可以应用于表单签名、订单确认等各类业务场景。 手写签名组件的重要性在于在数字化时代仍然需要以传统签名方式进行确认的场合,通过移动设备上的手写签名功能,可以有效地将传统签名过程数字化,提高工作效率,减少纸质文件的使用。 总结而言,app端手写签名组件是一种便捷实用的功能模块,能够让用户在移动设备上实现电子签名。它通过记录用户的手势输入,模拟传统签名的效果,可以应用于各类签署确认的场合,提高工作效率,简化流程,并环保节能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值