共计 2518 个字符,预计需要花费 7 分钟才能阅读完成。
业务系统中会有一些对附件的展示功能,比如文档或者图片之类,要么能下载,要么能预览,二者定有一条途径可以看到附件内容。
文档类多以链接 + 文件名的形式展示,点击文件名可以下载文件。
图片也可以以这种方式展示,也可以进行预览,这种方式会更加直观。
控件会需要一个左右翻页效果的两个按钮, 当图片数量超过 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;}
}
}
正文完
发表至: javascript
2020-06-23