项目作者: yesworld

项目描述 :
A Vue3 component to detect when a lazy component is becoming visible/hidden on the page.
高级语言: Vue
项目地址: git://github.com/yesworld/vue3-deferred-content.git
创建时间: 2020-12-23T11:18:54Z
项目社区:https://github.com/yesworld/vue3-deferred-content

开源协议:MIT License

下载


Vue 3 Lazy load image and component / vue3-deferred-content

A Vue3 component to detect when lazy component or HTML element is becoming visible/hidden on the page. The intersection can be observed once or listened by callback.









🚀 Features

  • 🔗 0 dependencies: No worry about your bundle size
  • Type Strong: Written in Typescript
  • 📦 Size: ~27kb

Live demo 🎉

📦 Installation

  1. $ npm i vue3-deferred-content
  2. # or
  3. $ yarn add vue3-deferred-content

📎 How to use?

main.js:

  1. import { createApp } from 'vue'
  2. import App from './App.vue'
  3. import VueDeferredContent from 'vue3-deferred-content'
  4. const app = createApp(App)
  5. const options = {
  6. name: 'lazyContent', // by default: deferred
  7. // by default for all components
  8. rootMargin: '0px', // string
  9. threshold: 0, // number | number[]
  10. }
  11. app.use(VueDeferredContent, options)
  12. app.mount('#app')

Examples

  1. Standard example with callbacks.
    1. <b>status: {{status}}</b>
    2. <lazy-content
    3. :auto-hide="false"
    4. @enter="enterElement"
    5. @leave="leaveElement"
    6. @change="changeIntersect"
    7. @disconnect="disconnect"
    8. >
    9. <img src="http://placekitten.com/360/280" alt="kitten">
    10. <p>Number of changes: {{changeCount}}</p>
    11. </lazy-content>
  1. export default defineComponent({
  2. name: 'Example1',
  3. data:() => ({
  4. changeCount: 0,
  5. status: '🙈 Leave',
  6. }),
  7. methods: {
  8. enterElement(target) {
  9. this.status = '🐵 Enter'
  10. console.log(this.status, target)
  11. },
  12. leaveElement(target) {
  13. this.status = '🙈 Leave'
  14. console.log(this.status, target)
  15. },
  16. changeIntersect(target) {
  17. this.changeCount++
  18. console.log('Change', target)
  19. },
  20. disconnect() {
  21. console.log('Disconnect')
  22. },
  23. },
  24. })
  1. Called once after first enter.
    1. <lazy-content
    2. :once="true"
    3. @change="changeIntersect"
    4. >
    5. <img src="http://placekitten.com/g/361/281" alt="kitten 2">
    6. <p>Number of changes: {{changeCount}}</p>
    7. </lazy-content>
  1. export default defineComponent({
  2. name: 'Example2',
  3. data:() => ({
  4. changeCount: 0,
  5. }),
  6. methods: {
  7. changeIntersect(target) {
  8. this.changeCount++
  9. console.log('Change', target)
  10. },
  11. },
  12. })
  1. Calling the module without callbacks. Lazy load image.

    1. <lazy-content>
    2. <img src="https://placekitten.com/362/282" alt="kitten 3">
    3. </lazy-content>
  2. Lazy load image and Transition.

    1. <lazy-content>
    2. <transition name="fade" :appear="true">
    3. <!-- This DIV tag is required for this example and I don't know why. :( -->
    4. <div>
    5. <img src="https://placekitten.com/400/300" alt="kitten 4">
    6. </div>
    7. </transition>
    8. </lazy-content>
  1. .fade-enter-active,
  2. .fade-leave-active {
  3. transition: opacity 0.8s ease;
  4. }
  5. .fade-enter-from,
  6. .fade-leave-to {
  7. opacity: 0;
  8. }
  1. Lazy load image and Transition group.
    1. <lazy-content>
    2. <transition-group name="list" :appear="true">
    3. <span v-for="(item, index) in items" :key="item" class="list-item" :style="`transition-delay: ${index * 250}ms;`">
    4. <img :src="item" alt="kitten 5">
    5. </span>
    6. </transition-group>
    7. </lazy-content>
  1. export default defineComponent({
  2. name: 'Example5',
  3. data:() => ({
  4. items: [
  5. 'https://placekitten.com/360/280',
  6. 'https://placekitten.com/361/281',
  7. 'https://placekitten.com/362/282',
  8. ]
  9. })
  10. })
  1. .placeholder {
  2. display: flex;
  3. flex-direction: row;
  4. justify-content: space-around;
  5. }
  6. .list-item {
  7. width: 30%;
  8. }
  9. .list-enter-active,
  10. .list-leave-active {
  11. transition: all 1s ease;
  12. }
  13. .list-enter-from,
  14. .list-leave-to {
  15. opacity: 0;
  16. transform: translateY(30px);
  17. }
  1. Async Component and Transition.
    1. <lazy-content
    2. :once="true"
    3. >
    4. <transition name="fade" :appear="true">
    5. <AsyncComponent></AsyncComponent>
    6. </transition>
    7. </lazy-content>
  1. export default defineComponent({
  2. name: 'Example6',
  3. components: {
  4. AsyncComponent: defineAsyncComponent(() => import('./AsyncComponent.vue')),
  5. },
  6. })
  1. .fade-enter-active,
  2. .fade-leave-active {
  3. transition: opacity 15s ease;
  4. }
  5. .fade-enter-from,
  6. .fade-leave-to {
  7. opacity: 0;
  8. }

TODO

  • Test

License

MIT License

Copyright (c) :suspect: @yesworld