用于展示附件(文档或者图片)的控件

算法寻星家
• 阅读 1431

业务系统中会有一些对附件的展示功能,比如文档或者图片之类,要么能下载,要么能预览,二者定有一条途径可以看到附件内容。
文档类多以链接+文件名的形式展示,点击文件名可以下载文件。
图片也可以以这种方式展示,也可以进行预览,这种方式会更加直观。

控件会需要一个左右翻页效果的两个按钮,当图片数量超过4时可以左右翻页,下载类、预览类分开处理。

AttachComponent.tsx

interface IProps{
    attachData:any;
}
function AttachComponent(props:IProps):JSX.Element{
    const {attachData} = props;
    cosnt [imgList,setImgList] = useState([]);
    const [docList,setDocList] = useState([]);
    const [current,setCurrent] = useState(0); // use variable 'current' set  current img index
    const [moveWidth,setMoveWidth] = useState(0);
    
    useEffect(()=>{
        handleAttachData();
    },[attachData])
    useEffect(()=>{
        handleMove();
    },[current]);
    
    
const handleAttachData =() =>{
    const ImgArr :any = [];
    const DocArr :any = [];
    attachData.forEach((item:any=>{
        cosnt {type} = item; //  distinguish image and doc by type
        if(1 === type){
            ImgArr.push(item);
        }else if(2 === type){
            DocArr.push(item);
        }
    }))
    setImgList(ImgArr);
    setDocList(DocArr);
}

const handleMove =() =>{
    setMoveWidth( current * 100 );
}

// handle page left 
const HandleMoveLeft = () =>{
    setCurrent(current -1 > 0 ? current -1 : 0);
}
// handle page right
const HandleMoveRight = () =>{
    let maxCnt = parseInt((imgList.length / 4).toString());
    if(imgList.length % 4 ){
        maxCnt = maxCnt + 1;
    }
    if(current +1 >=  maxCnt){
        return;
    }
    setCurrent(current + 1 );
}

return(
    <div className = 'attach-container'>
        {docList.length >0 &&
            <ul className = 'doc-list'>
                {
                    docList.map((item:any,index:number)=>{
                        return <li className = 'doc-item' key = {`doc-item-${index}`}><a href ={'doc file url for download'} download ={true}>{item.name}</a></li>
                    })
                }
            </ul>
        }
        {imgList.length > 0 && 
            <div className = 'img-list'>
                <div className = 'img-container'>
                    {
                        imgList.map((item:any,index:number)=>{
                            return <div key={`doc-item-${index}`} className ='img-item'><img src = {'img file url for download'} alt='load file failed'/></div>
                        })
                    }
                </div>
                // when length >4  show page left btn
                {   
                    imgList.length > 4 && 
                    <div className = 'left' onClick={handleMoveLeft}>
                        <img src={'left button src'} alt ='picture load failed'/>
                   </div>
                }
                {   
                    imgList.length > 4 && 
                    <div className = 'right' onClick={handleMoveRight}>
                        <img src={'right button src'} alt ='picture load failed'/>
                   </div>
                }
            </div>
        }
    </div>
  )
}
export default Memo(AttachComponent);

AttachComponent.less

.attach-container{
    width:100%;
    position:relative;
    .img-list{
        width:100%;
        position:relative;
        padding:.1rem 0;
        .img-container{
            position:relative;
            left:0;
            transition:left 0.3s;
        }
        .img-item{
            display:inline-block;
            width:23.5%;
            margin-left:2%;
            height:1.3rem;
            img{
                width:100%;
                height:100%;
            }
            &:nth-of-type(1){
                margin-left:0;
            }
            &:nth-of-type(5n){
                margin-left:0;
            }
        }
    }
    .left, .right{
        width:.5rem;
        height:.5rem;
        background:rgba(0,0,0,0.3);
        border-raidus:50%;
        position:absolute;
        display:flex;
        justify-content:center;
        align-items:center;
    }
    .right{
        right:0;
    }
    ul,li{
        margin:0;
        padding:0;
        a{
            #427aff;
        }
    }
}
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
TurnipBit开发板DIY呼吸的吃豆人教程实例
  转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇)  0x00前言  吃豆人是耳熟能详的可爱形象,如今我们的TurnipBit也集成了这可爱的图形,我们这就让他来呼吸了~。  0x01效果展示  先一起看下最终的成品演示视频:  http:/
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这