From cb1183a5ed4c79574e249b552dccb17fdd0817ab Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:19:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AAlazy?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=9B=BE=E7=89=87=E7=9A=84=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/assets/card.vue | 4 +- src/components/common/card.vue | 4 +- src/components/lazyloadimg/index.js | 101 ++++++++++++++++++++++++++++ src/views/DetailView.vue | 4 +- 4 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/components/lazyloadimg/index.js diff --git a/src/components/assets/card.vue b/src/components/assets/card.vue index 4bef8c3..b32fbef 100644 --- a/src/components/assets/card.vue +++ b/src/components/assets/card.vue @@ -3,7 +3,7 @@
- 图片 +
Cotnesford park
@@ -35,6 +35,8 @@ import SellDialog from "@/components/Dialogs/sellDialog.vue" import {PassportWallet} from "@/wallet/passPort.js" import { useDetailStore } from "@/store/detail" import { apiGetPrice } from "@/utils/marketplace" +import LazyLoadImg from "@/components/lazyloadimg" +import placeholderImg from '@/assets/img/marketplace/GenesisHeroes_NFT.png' // import BuyDialog from "@/components/Dialogs/buyDialog.vue" import { diff --git a/src/components/common/card.vue b/src/components/common/card.vue index e9aa4c4..750f9fa 100644 --- a/src/components/common/card.vue +++ b/src/components/common/card.vue @@ -2,7 +2,7 @@
- 图片 +
Cotnesford park
@@ -34,6 +34,8 @@ import BuyDialog from "@/components/Dialogs/buyDialog.vue" import {priceCalculated} from "@/configs/priceCalculate.js" import { useDetailStore } from "@/store/detail" import { useImmutableStore } from "@/store/immutable" +import LazyLoadImg from "@/components/lazyloadimg" +import placeholderImg from '@/assets/img/marketplace/GenesisHeroes_NFT.png' import { useMarketplaceStore } from "@/store/marketplace" diff --git a/src/components/lazyloadimg/index.js b/src/components/lazyloadimg/index.js new file mode 100644 index 0000000..4773ec9 --- /dev/null +++ b/src/components/lazyloadimg/index.js @@ -0,0 +1,101 @@ +import { reactive, h, computed, ref, onMounted, onBeforeUnmount } from "vue"; + +export default { + props: { + src: { + type: String, + required: true + }, + srcPlaceholder: { + type: String, + default: + "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" + }, + srcset: { + type: String + }, + intersectionOptions: { + type: Object, + default: () => ({}) + }, + usePicture: { + type: Boolean, + default: false + } + }, + inheritAttrs: false, + setup(props, { attrs, slots, emit }) { + const root = ref(null); + const state = reactive({ + observer: null, + intersected: false, + loaded: false + }); + + // Computed + const srcImage = computed(() => + state.intersected && props.src ? props.src : props.srcPlaceholder + ); + const srcsetImage = computed(() => + state.intersected && props.srcset ? props.srcset : false + ); + + // Methods + const load = () => { + if ( + root.value && + root.value.getAttribute("src") !== props.srcPlaceholder + ) { + state.loaded = true; + emit("load", root.value); + } + }; + const error = () => emit("error", root.value); + + // Hooks + onMounted(() => { + if ("IntersectionObserver" in window) { + state.observer = new IntersectionObserver((entries) => { + const image = entries[0]; + if (image.isIntersecting) { + state.intersected = true; + state.observer.disconnect(); + emit("intersect"); + } + }, props.intersectionOptions); + + state.observer.observe(root.value); + } + }); + + onBeforeUnmount(() => { + if ("IntersectionObserver" in window && state.observer) { + state.observer.disconnect(); + } + }); + + return () => { + const img = h("img", { + ref: root, + src: srcImage.value, + srcset: srcsetImage.value || null, // set to null explicitly if falsy + ...attrs, + class: [ + attrs.class, + "v-lazy-image", + { "v-lazy-image-loaded": state.loaded } + ], + onLoad: load, + onError: error + }); + + return props.usePicture + ? h( + "picture", + { ref: root, onLoad: load }, + state.intersected ? [slots.default, img] : [img] + ) + : img; + }; + } +}; \ No newline at end of file diff --git a/src/views/DetailView.vue b/src/views/DetailView.vue index ba981f6..8df8cfb 100644 --- a/src/views/DetailView.vue +++ b/src/views/DetailView.vue @@ -5,7 +5,7 @@
- +
@@ -145,12 +145,14 @@ import { nftDetail } from "@/utils/marketplace" import {priceCalculated} from "@/configs/priceCalculate.js" import { BlockChain } from "@/components/chain/BlockChain" import {walletStore} from "@/store/wallet"; +import LazyLoadImg from "@/components/lazyloadimg" const router = useRouter(); const localWalletStore = walletStore() const props = defineProps({ address: String, tokenid: String }) +import placeholderImg from '@/assets/img/marketplace/GenesisHeroes_NFT.png' const detailData = ref(null) // const detailData = window.history.state.nftData // console.log(detailData)