业务中会出现只读状态的表格,表格可以只有单纯的数字展示,也可以支持JSX元素的装入。和其他类型表格不一样,这种表格主要用于信息展示,没有什么业务上的交互。分为两个部分,一部分是TSX文件的业务逻辑,一个是less的描述。
ReadOnlyTable.tsx文件
import * as React from 'react;import {Memo,useState,useEffect} from 'react';import './readOnlyTable.less';interface ReadOnlyTableItems{ key:string; value :string | number | JSX.Element; itemClassName ?:string;}interface ReadOnlyTableProps{ data:ReadOnlyTableItems[][]; className?:string; textFontSize?:number; defaultProps?:any; keyMaxNumber ?: number; // max number of title words}const textPadding = 0.4; // init text paddingconst ReadOnlyTable:React.FC<ReadOnlyTableProps> = (props:ReadOnlyTableProps) :JSX.Element | null =>{ const [titleWidth,setTitleWidth] = useState(textPadding); useEffect(()=>{ const textFontSize = props.textFontSize ? props.textFontSize : 0.16; setTitleWidth(getKeyMaxNumber(props.data) * textFontSize+textPadding); },[]); useEffect(()=>{ setTitleWidth(getKeyMaxNumber(props.data)*0.16+textPadding); },[props.data]); const { data,className}= props; const getKeyMaxNumber(item:any[],maxNumber:number = 0):number =>{ if(props.keyMaxNumber) { return props.keyMaxNumber; } let max = maxNumber; item.forEach(item=>{ if(item.constructor === Array){ max = getKeyMaxNumber(item,max); }else if(String(item.key.length > max){ max = String(item.key).length; } }); return max; } if(!Array.isArray(props.data) || props.data.length === 0 ) { return null; } return ( <div classNmae = {`read-only-table-container ${className ? className : ""}`}> {data.map((v:ReadOnlyTableItems,i:number)=> <div className = 'read-only-table-row' key = {i}> {v.map((val:ReadOnlyTableItems,index:number)=> <div className = {`read-only-table-items ${val.itemClassName ? val.itemClassName :"defaultClassName"}`} key = {index}> <div className = 'read-only-table-key' style = {{width:`${titleWidth} rem`}}>{val.key}</div> <div className = 'read-only-table-value' title = {typeof val.value === 'string' ? val.value :''}>{val.value ? val.value : ''}</div> </div> )} </div> )} )}ReadOnlyTable.defaultProps = { textFontSize = 0.16;}export default Memo(ReadOnlyTable);
less文件描述
.read-only-table-container { background:#fff; width:100%; font-size:.16rem; border-right:.01rem solid #e1e3ec; .read-only-table-row{ display:flex; background-clip:padding-box; &:last-of-type{ .read-only-table-key{ border-bottom:.01rem solid #e1e3ec; } .read-only-table-value{ border-bottom:.01rem solid #e1e3ec; } } .read-only-table-items{ display:flex; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; &.defaultClassName{ flex:1; } .read-only-table-key{ line-height:.5rem; text-align:right; border-right:.01rem solid #e1e3ec; padding:.2rem; width:1.5rem; color:#666666; background:#fafafc; background-clip:padding-box; border-top:.01rem solid #e1e3ec; border-left:.01rem solid #e1e3ec; } .read-only-table-value{ line-height:.5rem; flex:1; padding: 0 0.2rem; white-space:nowrap; color:#333333; overflow:hidden; text-overflow:ellipsis; border-top:.01rem solid #e1e3ec; } } }}
出入数据格式如下:
const data =[ [{key:'一行一列',value:data}], [{key:'一行两列',value:data},{key:'一行两列',value:data}], [{key:'一行一列',value:data,itemClassName:'custom-style',style:{height:'1.5rem'}}], [{key:'jsx element',value:{JSX.Element}}] ]