视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于elementUI实现图片预览组件的示例代码
2020-11-27 21:59:22 责编:小采
文档

这是一个简单的点击图片预览的组件

顺便记录一下写组件期间踩的vue中scope的坑~

从注册全局组件开始叭!

项目目录:


模仿elementUI目录结构,目录名是组件名,src中是组件源文件(或者js服务文件),文件目录下还有一个index.js用于同一管理src中的所有文件,导出并注册,这个组件我们只有一个vue文件件

先看index.js文件里有什么:

//引入了src下的vue组件文件
import starPicList from './src/star-pic-list';

/* istanbul ignore next */
starPicList.install = function(Vue) {
 //starPicList.name这就是后面可以使用的组件的名字(star-pic-list.vue文件里面定义的name),install是默认的一个方法
 Vue.component(starPicList.name, starPicList);
};

export default starPicList;

接下来介绍一下install方法:

Vue.use( plugin ):安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法将被作为 Vue 的参数调用。当 install 方法被同一个插件多次调用,插件将只会被安装一次。Vue.js 的插件应当有一个公开方法 install 。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:

导出starPicList组件后在管理组件js文件中引用,然后由这个统一管理js文件导出注册到全局即可:

好了,这些是废话!

组件的使用:

<!--图片列表形式,点击查看图片列表,点击显示上(下)一张-->
<template v-slot="scope">
 <star-pic-list :data="scope.row.pic" :max-show="2"/>
</template>

参数
data: 传入图片数组;
max-show: 一次最多显示几张图片

效果如下:

补充:vue组件开发中 style 添加scoped后,修改第三方组件样式没有效果问题:

在vue的开发中,我们通常和element-UI配合开发,就会遇到,在组件style中添加scoped后,element-ui中使用的子组件样式无法改变。

不用scoped,去掉这个属性,但是会污染全局样式,(可配合less 或者 scss(推荐scss),所有样式写在当前组件id或class下面)

组件源码:

<template>
 <div id="star-pic-vue">
 <template v-if="data">
 <img v-for="item in images"
 :src="item"
 id="contract_url"
 @click="enlargePic"/>
 <template v-if="isDialogShow">
 </template>
 <el-dialog
 :visible.sync="centerDialogVisible"
 modal
 close-on-click-modal
 custom-class="dialog"
 >
 <el-carousel :autoplay="false" arrow="always">
 <el-carousel-item v-for="item in data" :key="item">
 <img :src="item">
 </el-carousel-item>
 </el-carousel>
 </el-dialog>
 </template>
 </div>
</template>

<script>
 export default {
 name: "star-pic-list",
 props: ["data","maxShow"],
 data(){
 return{
 centerDialogVisible: false,
 showPic: '',
 isDialogShow: false,
 index: 0,
 }
 },
 computed: {
 images() {
 if (this.data instanceof Array && this.data.length > 2) {
 return this.data.splice(0,this.maxShow)
 } else {
 return this.data
 }
 }
 },
 methods: {
 // 放大图片
 enlargePic(e){
 this.isDialogShow = true;
 this.centerDialogVisible = true;
 this.showPic = this.data[0];
 console.log(this.images)
 },
 }
 }
</script>

<style lang="less">
#star-pic-vue{
 width: 200px;
 height: auto;
 display: flex;
 flex-wrap: wrap;
 img{
 width: 80px;
 height: 80px;
 margin: 4px;
 }
 .dialog {
 img{
 width: 100%;
 height: 100%;
 margin: 0;
 }
 }
 .el-carousel__item h3 {
 color: #475669;
 font-size: 18px;
 opacity: 0.75;
 line-height: 300px;
 margin: 0;
 height: 100%;
 width: 100%;
 }
 .el-dialog__header{
 display: none;
 }
 .el-dialog__body {
 padding: 0 !important;
 margin: 0 !important;
 height: 600px;
 }
 .el-carousel{
 height: 100%;
 }
 .el-carousel__container {
 height: 100%;
 }
}
</style>

更多组件点击这儿 --> link : github>components>star-pic-list

下载本文
显示全文
专题