因为我的项目中应用了antd.业务上有个需要,须要预览图片。想到了antd外面有个modal.稍作批改就只须要解决前后翻页的业务逻辑就行。
1,能够通过前一张,后一张按钮来进行翻页,图片右上角有退出预览按钮
2,键盘的左右按钮能够前后翻页,ESC按钮能够退出预览

代码如下:

interface IpicPreviewProps{    index:number; // 第几张图片索引值    pic:any[];  // 图片链接数组,存储图片地址    modalShow:boolean; // modal显示和暗藏    setModalShow:(v:boolean) => void; // 回调}function PicturePreview(props:IpicPreviewProps) :JSX.Element {    const {modalShow,index,pic} = props;    const [current,setCurrent] = useState('');  // 用于寄存以后显示图片地址    const [currentIndex,setCurrentIndex] = useState(0); // 用于寄存以后播放图片在数组中索引值        useEffect(()=>{        document.addEventListener('keyup',upHandle);        retrurn ()=>{            document.removeEventListener('keyup',upHandle);        }    },[currentIndex]);        useEffect(()=>{        setCurrent(pic[index]);        setCurrentIndex(index);    },[idnex,pic]);        const leftClick = useMemo(()=>        ()=>{            if(currentIndex !== 0){                setCurrentIndex((prev:number) => prev-1);                sestCurrent(pic[currentIndex-1]);            }        },[currentIndex,pic]);        const rightClick = useMemo(()=>        () =>{            const length = pic.length;            if(currentIndex !== length -1){                setCurrentIndex((prev:number) =>prev +1);                setCurrent(pic[currentIndex +1]);            }        },[currentIndex,pic]);             const upHandle = useMemo(()=>        (e:any) =>{            if(e.keyCode === 37){ // left                leftClick();            } else if(e.keyCode === 39){ // right                rightClick();            } else if(e.keyCode === 27){ // esc                props.setModalShow(false);            }        },[leftClick,rightClick,props.setModalShow]);            return (        <Modal            visible = {modalShow}            title =''            centered = {true}            maskClosable = {false}            footer ={null}            closable = {false}            keyboard = {true}            className = 'pic-preview-container'>            <div className = 'content'>                <div className = 'left-btn' onClick={leftClick}><img src = {left}/></div>                <div className = 'pic-content'>                    <img src = {current} className = 'main-pic' />                    <img src = {close} className='close-btn' onClick{()=>{props.setModalShow(false)}}/>                 </div>                 <div className = 'right-btn' onClick={rightClick}><img src = {right}/></div>             </div>          </Modal>      )        }export default Memo(PicturePreview);

款式less文件如下

.ant-modal-root{    .pic-preview-container{        width:9rem !important;        padding-bottom: 0 !important;        .ant-modal-content{            background:tansparent;            box-shadow: 0 0 0 rgba(0 ,0 ,0,0);            .content{                background-color:transparent;                display:flex;                flex-direction:row;                align-items:center;                justify-content:center;                .left-btn{                    justify-content:center;                    align-items:center;                    display:flex;                    width: 0.4rem;                    height:0.7rem;                    background:#000000                    opacity:.5;                    margin-right:.2rem;                    img{                        display:inline-block;                        height:.25rem;                        width:.15rem;                    }                }                .right-btn{                    margin-left:.2rem;                    justify-content:center;                    align-items:center;                    display:flex;                    width:.4rem;                    height:.7rem;                    background:#000000;                    opacity:.5;                    img{                        display:inline-block;                        height:.25rem;                        width:.15rem;                    }                }                .pic-content{                    position:relative;                    .close-btn{                        display:inline-block;                        width:.4rem;                        height:.4rem;                        position:absolute;                        right:-0.2rem;                        top:-0.2rem;                    }                }            }        }    }}