当前位置:首页 > VUE

vue watch实现懒加载

2026-01-21 06:55:11VUE

使用 Vue 的 watch 实现懒加载

在 Vue 中,可以通过 watch 监听数据变化,结合 Intersection Observer API 或滚动事件实现懒加载。以下是具体实现方法:

监听滚动事件实现懒加载

  1. 定义需要懒加载的数据和状态 在组件中定义需要懒加载的数据列表和一个标志位,用于判断是否加载更多数据。

    data() {
      return {
        items: [], // 已加载的数据
        loading: false, // 是否正在加载
        page: 1, // 当前页码
        hasMore: true, // 是否还有更多数据
      };
    },
  2. 监听滚动事件mounted 钩子中绑定滚动事件,并在 beforeDestroy 中解绑。

    mounted() {
      window.addEventListener('scroll', this.handleScroll);
    },
    beforeDestroy() {
      window.removeEventListener('scroll', this.handleScroll);
    },
  3. 实现滚动处理逻辑handleScroll 方法中判断是否滚动到底部,触发加载更多数据。

    vue watch实现懒加载

    methods: {
      handleScroll() {
        const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        const windowHeight = document.documentElement.clientHeight;
        const scrollHeight = document.documentElement.scrollHeight;
    
        if (scrollTop + windowHeight >= scrollHeight - 100 && !this.loading && this.hasMore) {
          this.loadMore();
        }
      },
      async loadMore() {
        this.loading = true;
        const newItems = await fetchData(this.page); // 模拟异步请求
        if (newItems.length === 0) {
          this.hasMore = false;
        } else {
          this.items = [...this.items, ...newItems];
          this.page++;
        }
        this.loading = false;
      },
    },

使用 Intersection Observer API 实现懒加载

  1. 定义观察目标和回调 使用 Intersection Observer 监听目标元素是否进入视口。

    data() {
      return {
        items: [],
        loading: false,
        observer: null,
      };
    },
    mounted() {
      this.observer = new IntersectionObserver((entries) => {
        entries.forEach(entry => {
          if (entry.isIntersecting && !this.loading) {
            this.loadMore();
          }
        });
      });
      this.observer.observe(document.querySelector('.load-more-trigger'));
    },
    beforeDestroy() {
      this.observer.disconnect();
    },
  2. 加载更多数据loadMore 方法中请求数据并更新列表。

    methods: {
      async loadMore() {
        this.loading = true;
        const newItems = await fetchData(); // 模拟异步请求
        this.items = [...this.items, ...newItems];
        this.loading = false;
      },
    },
  3. 模板中添加触发元素 在模板中放置一个触发懒加载的元素(如占位符)。

    vue watch实现懒加载

    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
    <div class="load-more-trigger" v-if="!loading"></div>

结合 watch 监听数据变化

如果需要通过 watch 监听其他数据变化触发懒加载,可以这样实现:

  1. 监听数据变化 使用 watch 监听某个变量(如搜索关键词),变化时触发加载。

    watch: {
      searchQuery(newVal) {
        this.items = []; // 清空列表
        this.page = 1;
        this.hasMore = true;
        this.loadMore();
      },
    },
  2. 防抖优化 避免频繁触发加载,可以使用防抖函数。

    import { debounce } from 'lodash';
    methods: {
      handleScroll: debounce(function() {
        // 滚动逻辑
      }, 200),
    },

注意事项

  • 懒加载需结合分页逻辑,避免一次性加载过多数据。
  • 滚动事件需考虑性能问题,建议使用 Intersection Observer。
  • 在组件销毁时及时解绑事件或断开观察器,避免内存泄漏。

标签: 加载vue
分享给朋友:

相关文章

vue实现anchor

vue实现anchor

Vue 实现 Anchor(锚点)功能 在 Vue 中实现锚点功能可以通过多种方式完成,以下是几种常见的方法: 使用 HTML 原生锚点 HTML 原生锚点是最简单的方式,通过 <a>…

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue实现好友列表

vue实现好友列表

实现好友列表的Vue组件 数据准备 在Vue组件的data中定义好友列表数据,通常是一个数组对象,每个对象包含好友的基本信息如ID、头像、昵称等。 data() { return { f…

vue实现菜单栏锚点

vue实现菜单栏锚点

实现锚点菜单的基本思路 在Vue中实现菜单栏锚点功能,主要涉及两个方面:创建可跳转的锚点位置,以及菜单项的点击滚动控制。通过监听滚动事件可以高亮当前可见区域的对应菜单项。 创建页面锚点位置 在需要跳…

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式:…

vue原型实现

vue原型实现

Vue 原型实现的关键点 Vue.js 的原型系统是其响应式机制的核心部分,通过原型链实现数据的动态绑定和依赖收集。以下是实现 Vue 原型的主要技术要点。 数据响应式原理 Vue 通过 Objec…