vue el-image 怎么封装成可以预览大图的全局指令??

代码如下,指令v-preview可以正常调用了 但是el-image却无法调出来,出不来正常的效果,寻大神指点

html调用指令

<div class="wb_add_img clearfix">
  <a v-for="(pic, index) in picList" :key="index" v-preview="{srcList: srcList}" class="imgWrap">
       <img alt="图片" :src="pic.fileid" class="img"/>
  </a>
</div>

index.js

import preview from './children/preview'
Vue.directive('preview', {
    bind(el, binding, vnode) {
        const srcList = (binding.value && binding.value.srcList) || []
        el.addEventListener('click', () => {
            const $preview = new (Vue.extend(preview))({
                propsData: {
                    srcList: srcList
                }
            }).$mount()

            document.body.appendChild($preview.$el)
        })
    }
})

preview.js

<template>
    <div class="perImage">
        <el-image
            style="width: 100px; height: 100px"
            ref="preview"
            class="wqewe"
            :src="url"
            :preview-src-list="srcList"
        </el-image>
    </div>
</template>

<script>
    export default {
        props: {
            srcList: [Array, String],
        },
        data() {
            return {
                url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
                // picList: [
                //     'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
                //     'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg'
                // ]
            }
        },
        created() {
            this.init()
        },
        methods: {
            init() {
                this.$nextTick(() => {
                    this.showImgPreview()
                })
            },
            showImgPreview() {
                console.log('url', this.url)
                console.log('srcList', this.srcList)
            },
        },
        computed: {
            // 处理预览图片数据
            // previewSrc() {
                // return this.srcList
            // }
        },
    }
</script>

<style lang="scss" scoped>
    .preview-container {
        position: fixed;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        z-index: 9999;
        display: flex;
        justify-content: center;
        align-items: center;
        background-color: rgba(0, 0, 0, 0.8);
    }

    .preview-container img {
        max-width: 80%;
        max-height: 80%;
    }
</style>
阅读 1.5k
1 个回答

v-preview="{srcList: srcList}"里面的srcList是否组件创建时还是个空数组,创建之后通过请求拿到的数据
我看你的指令没有 watch 这个数据,所以你这个指令好像只能渲染出来一个传入空数组的el-image,不知道是不是这个原因

试了下你的代码,发现了几个报错

preview 指令应该触发了关键字,可以考虑换个名字
还有下一段代码不对呀

<el-image
  style="width: 100px; height: 100px"
  ref="preview"
  class="wqewe"
  :src="url"
  :preview-src-list="srcList"
</el-image>

// 应该是
<el-image
  style="width: 100px; height: 100px"
  ref="preview"
  class="wqewe"
  :src="url"
  :preview-src-list="srcList"
>
</el-image>

这样改完我这边是生效了

参考代码

<template>
<div class="wb_add_img clearfix">
  <a v-for="(pic, index) in picList" :key="index" v-xx="{srcList: srcList}" class="imgWrap">
      <img alt="图片" :src="pic.fileid" width="100" class="img"/>
  </a>
</div>
</template>
<script>
import preview from './demo'
import Vue from 'vue'
export default {
  data () {
    return {
      srcList: [
  'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',       'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg'
      ],
      picList: [
        {
          fileid: 'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg'
        },
        { fileid: 'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg' }
      ]
    }
  },
  directives: {
    xx: {
      bind (el, binding, vnode) {
        const srcList = (binding.value && binding.value.srcList) || []
        el.addEventListener('click', () => {
            const $preview = new (Vue.extend(preview))({
                propsData: {
                    srcList: srcList
                }
            }).$mount()

            document.body.appendChild($preview.$el)
        })
      }
    }
  }
}
</script>

demo.vue

<template>
  <div class="perImage">
    <el-image
      style="width: 100px; height: 100px"
      ref="preview"
      class="wqewe"
      :src="url"
      :preview-src-list="srcList"
    />
  </div>
</template>
<script>
// import { Image } from 'element-ui'
export default {
  props: {
    srcList: [Array, String],
  },
  components: {
    // ElImage: Image
  },
  data () {
    return {
      url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
      // picList: [
      //     'https://fuss10.elemecdn.com/8/27/f01c15bb73e1ef3793e64e6b7bbccjpeg.jpeg',
      //     'https://fuss10.elemecdn.com/1/8e/aeffeb4de74e2fde4bd74fc7b4486jpeg.jpeg'
      // ]
    }
  },
  created () {
    this.init()
  },
  methods: {
    init () {
      this.$nextTick(() => {
        this.showImgPreview()
      })
    },
    showImgPreview () {
      console.log('url', this.url)
      console.log('srcList', this.srcList)
    },
  },
  computed: {
    // 处理预览图片数据
    // previewSrc() {
    // return this.srcList
    // }
  },
}
</script>

<style lang="scss" scoped>
.preview-container {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: rgba(0, 0, 0, 0.8);
}

.preview-container img {
  max-width: 80%;
  max-height: 80%;
}
</style>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题