因为项目种常查看大图预览的需求,如果是自己写的用模态框写的查看大图,只是简单看看还可以,如果需要旋转,放大缩小,反转等等操作,就会很麻烦。也看过很多用来查看大图的插件,viewer真的是功能最为全面的,而且在各个框架中均有对应的封装插件,使用起来也很方便,所以这里写一下各个框架内viewer的使用方法。
下面之说直接使用的方法,具体细节的options可以查看文档,下面也有文档连接
下面是JQuery和原生js的写法, 要注意JQuery版本和js版本是不一样的,要到对应的地方下载
[]: https://github.com/fengyuanchen/viewerjs “JS版本”
[]: https://github.com/fengyuanchen/jquery-viewer “JQuery版本”
JS版本
jQuery 版本:
<link rel="stylesheet" href="css/viewer.min.css">
<script src="js/jquery.min.js"></script>
<script src="js/viewer.min.js"></script>
<ul id="viewer">
<li><img src="img/1.jpg" ></li>
<li><img src="img/2.jpg""></li>
</ul>
JS 版本:
var viewer = new Viewer(document.getElementById('viewer'));
jQuery 版本:
$('#viewer').viewer();
[]: https://mirari.cc/2017/08/27/Vue图片浏览组件v-viewer,支持旋转、缩放、翻转等操作/ “文档”
npm install v-viewer
import Viewer from 'v-viewer'
Vue.use(Viewer)
直接使用组件
<viewer :images="images">
<img v-for="src in images" :src="src" :key="src">
</viewer>
也可以使用指令v-viewer
,使用指令的元素下的img都可以就行查看,v-viewer内可以传入样式
<div class="images" v-viewer="{inline: true}">
<img v-for="src in images" :src="src" :key="src">
</div>
[]: https://www.ctolib.com/hyk51594176-rc-viewer.html “文档”
<script src="https://cdn.bootcss.com/viewerjs/1.0.0/viewer.min.js"></script>
<link href="https://cdn.bootcss.com/viewerjs/1.0.0/viewer.min.css" rel="stylesheet">
npm install @hanyk/rc-viewer
//components
import RcViewer from '@hanyk/rc-viewer'
图片列表
<RcViewer options={options} ref='viewer'>
<ul id="images">
<li><img src="picture-1.jpg" alt="Picture 1"></li>
<li><img src="picture-2.jpg" alt="Picture 2"></li>
<li><img src="picture-3.jpg" alt="Picture 3"></li>
</ul>
</RcViewer>
单张图片
<RcViewer options={options}>
<img src="picture-3.jpg" alt="Picture 3">
</RcViewer>
这种情况下就可以直接点击就可以使用了
当然也可以用js打开图片查看组件
const { viewer } = this.refs.viewer
viewer.show()
但是,我们在平常使用中有很多查看图片的地方 ,如果每个地方都使用一次RcViwer组件既浪费性能,也会很麻烦,会有很多重复代码,所以我们只要在这个页面里公用一个就可以,然后动态传入图片路由,然后再你需要查看的图片的地方绑定公共方法就可以,这里我就以React的写法举例,用其他框架也是一个道理。
这里我用的是阿里的ant design pro框架:
首先我们开始写global这个model的reducer,用来改变这个图片imgUrl,这里为什么要同时变化viewerFlag
这个状态呢,应为图片路由可能不会变化,但是viewerFlag
每次都会变化,然后我们就可以在componentWillReceiveProps
钩子里看viewerFlag
是否变化来决定是否查看图片
//./models/global.js
state: {
imgUrl: ''
viewerFlag:true,
},
reducers: {
saveImgUrl(state, { payload }) {
return {
...state,
viewerFlag:!state.viewerFlag,
imgUrl: payload,
};
},
...
}
下一步我们在BasicLayout这个基础布局中使用RcViewer
组件:
//.layouts/BasicLayout.js
import RcViewer from '@hanyk/rc-viewer'
...
//引入global的model去除imgUrl,这就是我们要动态变化的url
export default connect(({ global}) => ({
imgUrl: global.imgUrl,
viewerFlag: global.viewerFlag,
...setting,
}))(props => (
....
));
...
//通过判断viwerFlag,判断是否需要展示,因为url可能不会变化,但是viwerFlag是必然变化的
componentWillReceiveProps(nextProps) {
if(this.props.viewerFlag != nextProps.viewerFlag) {
const { viewer } = this.refs.viewer
viewer.show()
}
}
...
render() {
{imgUrl} = this.props
return(
...
<RcViewer ref='viewer'>
<img style={{display:'none'}} src={imgUrl} alt=""/> //我们这里创建一个不现实的图片,因为这张图片只是为了用来查看放大图片的,不需要显示
</RcViewer>
...
)
}
然后就可以在各个模块中使用图片查看了,只需要dipatch
触发saveImgUrl
这个reducer
//./page/demo/demo.js
showPic = (imgUrl)=> {
this.props.dispatch({type:'global/saveImgUrl',payload:imgUrl})
}
...
<Button type='eye' onClick={this.showPic.bind(this,imageUrl)}><查看图片/Button>
...
这样在每个模块中都可以一直复用一个图片查看组件,是非常方便的,你也可以把这个showPic方法放到公共方法里,这样更为简洁
以上就是我对viewer.js的详解,如果有什么什么问题也可以直接问我