vue2使用vue-lazyload等待图片发起get请求返回数据解密后生成图片地址,后手动触发图片的懒加载
时间: 2024-02-27 21:57:00 浏览: 75
在Vue2中,可以使用vue-lazyload插件来实现图片的懒加载。如果想要等待图片发起get请求返回数据解密后生成图片地址,然后手动触发图片的懒加载,你可以使用以下步骤:
1. 在模板中,添加一个图片的占位符,并设置其src属性为一个默认的占位图片,例如:
```html
<img v-lazy="imageSrc" src="loading.gif"/>
```
2. 在组件的`data`选项中,定义一个`images`数组,用于存储需要显示的图片数据。例如:
```javascript
export default {
data () {
return {
images: []
}
}
}
```
3. 在组件的`mounted`钩子中,发起get请求获取需要显示的图片数据,并将其保存到`images`数组中。例如:
```javascript
import axios from 'axios'
export default {
mounted () {
axios.get('/api/images')
.then(response => {
this.images = response.data
})
.catch(error => {
console.log(error)
})
}
}
```
4. 在模板中,使用`v-for`指令遍历`images`数组,动态生成图片元素,并将图片数据传递给一个方法,用于解密生成图片地址。例如:
```html
<template>
<div>
<img v-for="image in images" v-lazy="decryptImageSrc(image)" src="loading.gif"/>
</div>
</template>
```
5. 在组件中,定义一个`decryptImageSrc`方法,用于解密图片数据并生成图片地址。例如:
```javascript
import CryptoJS from 'crypto-js'
export default {
methods: {
decryptImageSrc (image) {
const key = CryptoJS.enc.Utf8.parse('my-secret-key-12345')
const iv = CryptoJS.enc.Utf8.parse('my-iv-12345')
const encrypted = CryptoJS.enc.Base64.parse(image.src)
const result = CryptoJS.AES.decrypt({ ciphertext: encrypted }, key, { iv: iv })
const src = CryptoJS.enc.Utf8.stringify(result)
return src
}
}
}
```
6. 在组件中,使用`Vue.prototype.$Lazyload`方法获取到vue-lazyload的实例。然后,在`images`数组更新后,手动触发图片的懒加载。例如:
```javascript
import Vue from 'vue'
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload)
export default {
data () {
return {
images: []
}
},
mounted () {
axios.get('/api/images')
.then(response => {
this.images = response.data
this.lazyload = Vue.prototype.$Lazyload({/* options */})
this.$nextTick(() => {
this.loadImages()
})
})
.catch(error => {
console.log(error)
})
},
methods: {
loadImages () {
const images = document.querySelectorAll('img[v-lazy]')
images.forEach(image => {
if (this.isVisible(image)) {
this.lazyload.lazyLoad(image)
}
})
},
isVisible (element) {
const rect = element.getBoundingClientRect()
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
)
}
}
}
```
7. 在组件中,可以在`window`对象的`scroll`事件和`resize`事件中调用`loadImages`方法,以便在滚动和窗口大小变化时动态地触发图片的懒加载。例如:
```javascript
mounted () {
axios.get('/api/images')
.then(response => {
this.images = response.data
this.lazyload = Vue.prototype.$Lazyload({/* options */})
this.$nextTick(() => {
this.loadImages()
})
})
.catch(error => {
console.log(error)
})
window.addEventListener('scroll', this.loadImages)
window.addEventListener('resize', this.loadImages)
},
beforeDestroy () {
window.removeEventListener('scroll', this.loadImages)
window.removeEventListener('resize', this.loadImages)
}
```
阅读全文