searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

vue滚动加载数据

2023-07-10 09:34:42
35
0
  • 原生方法

  1. 添加一个用于显示数据的列表容器
    <div id="app">
      <ul id="data-list">
        <!-- 在这里展示数据 -->
      </ul>
    </div>
  2. 在Vue的实例中,定义数据和方法:
    new Vue({
      el: '#app',
      data: {
        dataList: [], // 存储加载的数据
        currentPage: 1, // 当前页数
        isLoading: false // 标记是否正在加载数据
      },
      mounted() {
        // 初始化时加载第一页数据
        this.loadMoreData();
        // 监听滚动事件
        window.addEventListener('scroll', this.handleScroll);
      },
      methods: {
        loadMoreData() {
          if (!this.isLoading) {
            this.isLoading = true;
            // 发起请求获取新数据
            // 例如使用axios发送Ajax请求
            axios.get('/api/data?page=' + this.currentPage)
              .then(response => {
                this.dataList = this.dataList.concat(response.data); // 追加新数据到列表
                this.currentPage++; // 增加页数
                this.isLoading = false; // 加载完毕,将isLoading设置为false
              })
              .catch(error => {
                console.error(error);
                this.isLoading = false; // 请求出错时,也要将isLoading设置为false
              });
          }
        },
        handleScroll() {
          // 检查是否滚动到页面底部
          const scrollHeight = document.documentElement.scrollHeight;
          const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
          const clientHeight = document.documentElement.clientHeight;
          if (scrollTop + clientHeight >= scrollHeight - 10) {
            // 触发加载更多数据
            this.loadMoreData();
          }
        }
      }
    });
  3. 在上述代码中,通过loadMoreData()方法来加载更多数据。确保在调用该方法时,isLoading标志位为false,以避免多次并发请求。请求成功后,将新数据追加到dataList数组中,并增加当前页数currentPage,然后将isLoading标志位设置为false。如果请求失败,也需要将isLoading标志位设置为false,以避免无法继续加载数据。handleScroll()方法用于监听滚动事件,并在滚动到页面底部时触发加载更多数据的操作。通过比较页面的高度、滚动的高度以及可见区域的高度,判断滚动位置是否接近页面底部。当条件满足时,调用loadMoreData()方法加载更多数据。
  1. 安装插件,在项目目录下打开终端,执行以下命令安装vue-infinite-loading插件:
    npm install vue-infinite-loading
  2. 引入插件
    在Vue的入口文件(通常是main.js)中,通过import语句引入vue-infinite-loading插件:
    import Vue from 'vue';
    import InfiniteLoading from 'vue-infinite-loading';
    
    // 注册vue-infinite-loading组件
    Vue.use(InfiniteLoading);​
  3. 在组件中使用插件
    在需要使用无限滚动加载的组件中,使用infinite-loading组件和相应的事件来实现无限滚动加载功能。以下是一个示例:
    <template>
      <div>
        <ul>
          <!-- 渲染列表数据 -->
          <li v-for="item in itemList" :key="item.id">{{ item.name }}</li>
        </ul>
        <!-- infinite-loading组件 -->
        <infinite-loading @infinite="loadMoreItems">
          <div slot="no-more">已加载全部数据</div>
        </infinite-loading>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          itemList: [], // 存储加载的列表数据
          currentPage: 1 // 当前页码
        };
      },
      methods: {
        loadMoreItems($state) {
          // 加载更多数据
          // 例如使用axios发送Ajax请求
          axios.get('/api/data?page=' + this.currentPage)
            .then(response => {
              const newDataList = response.data;
              // 判断是否还有更多数据
              if (newDataList.length > 0) {
                // 追加新数据到itemList中
                this.itemList = this.itemList.concat(newDataList);
                this.currentPage++;
                // 告诉插件加载成功
                $state.loaded();
              } else {
                // 所有数据加载完毕
                $state.complete();
              }
            })
            .catch(error => {
              console.error(error);
              // 告诉插件加载失败
              $state.error();
            });
        }
      }
    };
    </script>​

     

  4.  

    使用infinite-loading组件来实现无限滚动加载的功能。通过监听infinite事件,当滚动到加载更多的位置时,执行loadMoreItems方法来加载更多数据。在loadMoreItems方法中,通过Ajax请求获取数据,并根据返回结果追加数据到itemList数组中。根据数据是否已经加载完成,使用不同的插件状态方法(loaded()complete()error())告知插件加载状态。

  1. 使用
    import infiniteScroll from 'vue3-infinite-scroll-better'
    app.use(infiniteScroll).mount('#app')​
  2. 例子
                 <div
                      class="list-lis"
                      v-infinite-scroll="handleInfiniteOnLoad"
                      :infinite-scroll-immediate-check="false"
                      :infinite-scroll-disabled="scrollDisabled"
                      :infinite-scroll-watch-disabled="scrollDisabled"
                       :infinite-scroll-distance="20">
                        <a-list
                            size="small"
                            bordered
                            item-layout="horizontal"
                            :data-source="List"
                        >
                            <template #renderItem="{ item, index }">
                                <a-list-item>
                                    <a-skeleton :title="false" :loading="item.loading" active>
                                        <a-list-item-meta :description="item.email">
                                            <template #title>
                                                <span>{{ item.nickname }}</span>
                                            </template>
                                        </a-list-item-meta>
                                        <div>
                                         //数据
                                        </div>
                                    </a-skeleton>
                                </a-list-item>
                            </template>
                        </a-list>
                    </div>​
    setup(props, context) {
      const List= [] // 数据列表
      const listCount = 50
      const handleInfiniteOnLoad = () => {
        // 异步加载数据等逻辑
        if (scrollDisabled) {
          // 数据加载完毕
        } else {
          // 加载数据列表
        }
      }
      const scrollDisabled = computed(() => renderDataList.length >= listCount)
      return {
        scrollDisabled,
        renderDataList,
        handleInfiniteOnLoad
      }
    }
    
  3. 支持Vue3的滚动加载插件,所有用法和vue-infinite-scroll一致。详细api功能可点击作者链接查看
0条评论
0 / 1000
李辉
7文章数
0粉丝数
李辉
7 文章 | 0 粉丝
原创

vue滚动加载数据

2023-07-10 09:34:42
35
0
  • 原生方法

  1. 添加一个用于显示数据的列表容器
    <div id="app">
      <ul id="data-list">
        <!-- 在这里展示数据 -->
      </ul>
    </div>
  2. 在Vue的实例中,定义数据和方法:
    new Vue({
      el: '#app',
      data: {
        dataList: [], // 存储加载的数据
        currentPage: 1, // 当前页数
        isLoading: false // 标记是否正在加载数据
      },
      mounted() {
        // 初始化时加载第一页数据
        this.loadMoreData();
        // 监听滚动事件
        window.addEventListener('scroll', this.handleScroll);
      },
      methods: {
        loadMoreData() {
          if (!this.isLoading) {
            this.isLoading = true;
            // 发起请求获取新数据
            // 例如使用axios发送Ajax请求
            axios.get('/api/data?page=' + this.currentPage)
              .then(response => {
                this.dataList = this.dataList.concat(response.data); // 追加新数据到列表
                this.currentPage++; // 增加页数
                this.isLoading = false; // 加载完毕,将isLoading设置为false
              })
              .catch(error => {
                console.error(error);
                this.isLoading = false; // 请求出错时,也要将isLoading设置为false
              });
          }
        },
        handleScroll() {
          // 检查是否滚动到页面底部
          const scrollHeight = document.documentElement.scrollHeight;
          const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
          const clientHeight = document.documentElement.clientHeight;
          if (scrollTop + clientHeight >= scrollHeight - 10) {
            // 触发加载更多数据
            this.loadMoreData();
          }
        }
      }
    });
  3. 在上述代码中,通过loadMoreData()方法来加载更多数据。确保在调用该方法时,isLoading标志位为false,以避免多次并发请求。请求成功后,将新数据追加到dataList数组中,并增加当前页数currentPage,然后将isLoading标志位设置为false。如果请求失败,也需要将isLoading标志位设置为false,以避免无法继续加载数据。handleScroll()方法用于监听滚动事件,并在滚动到页面底部时触发加载更多数据的操作。通过比较页面的高度、滚动的高度以及可见区域的高度,判断滚动位置是否接近页面底部。当条件满足时,调用loadMoreData()方法加载更多数据。
  1. 安装插件,在项目目录下打开终端,执行以下命令安装vue-infinite-loading插件:
    npm install vue-infinite-loading
  2. 引入插件
    在Vue的入口文件(通常是main.js)中,通过import语句引入vue-infinite-loading插件:
    import Vue from 'vue';
    import InfiniteLoading from 'vue-infinite-loading';
    
    // 注册vue-infinite-loading组件
    Vue.use(InfiniteLoading);​
  3. 在组件中使用插件
    在需要使用无限滚动加载的组件中,使用infinite-loading组件和相应的事件来实现无限滚动加载功能。以下是一个示例:
    <template>
      <div>
        <ul>
          <!-- 渲染列表数据 -->
          <li v-for="item in itemList" :key="item.id">{{ item.name }}</li>
        </ul>
        <!-- infinite-loading组件 -->
        <infinite-loading @infinite="loadMoreItems">
          <div slot="no-more">已加载全部数据</div>
        </infinite-loading>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          itemList: [], // 存储加载的列表数据
          currentPage: 1 // 当前页码
        };
      },
      methods: {
        loadMoreItems($state) {
          // 加载更多数据
          // 例如使用axios发送Ajax请求
          axios.get('/api/data?page=' + this.currentPage)
            .then(response => {
              const newDataList = response.data;
              // 判断是否还有更多数据
              if (newDataList.length > 0) {
                // 追加新数据到itemList中
                this.itemList = this.itemList.concat(newDataList);
                this.currentPage++;
                // 告诉插件加载成功
                $state.loaded();
              } else {
                // 所有数据加载完毕
                $state.complete();
              }
            })
            .catch(error => {
              console.error(error);
              // 告诉插件加载失败
              $state.error();
            });
        }
      }
    };
    </script>​

     

  4.  

    使用infinite-loading组件来实现无限滚动加载的功能。通过监听infinite事件,当滚动到加载更多的位置时,执行loadMoreItems方法来加载更多数据。在loadMoreItems方法中,通过Ajax请求获取数据,并根据返回结果追加数据到itemList数组中。根据数据是否已经加载完成,使用不同的插件状态方法(loaded()complete()error())告知插件加载状态。

  1. 使用
    import infiniteScroll from 'vue3-infinite-scroll-better'
    app.use(infiniteScroll).mount('#app')​
  2. 例子
                 <div
                      class="list-lis"
                      v-infinite-scroll="handleInfiniteOnLoad"
                      :infinite-scroll-immediate-check="false"
                      :infinite-scroll-disabled="scrollDisabled"
                      :infinite-scroll-watch-disabled="scrollDisabled"
                       :infinite-scroll-distance="20">
                        <a-list
                            size="small"
                            bordered
                            item-layout="horizontal"
                            :data-source="List"
                        >
                            <template #renderItem="{ item, index }">
                                <a-list-item>
                                    <a-skeleton :title="false" :loading="item.loading" active>
                                        <a-list-item-meta :description="item.email">
                                            <template #title>
                                                <span>{{ item.nickname }}</span>
                                            </template>
                                        </a-list-item-meta>
                                        <div>
                                         //数据
                                        </div>
                                    </a-skeleton>
                                </a-list-item>
                            </template>
                        </a-list>
                    </div>​
    setup(props, context) {
      const List= [] // 数据列表
      const listCount = 50
      const handleInfiniteOnLoad = () => {
        // 异步加载数据等逻辑
        if (scrollDisabled) {
          // 数据加载完毕
        } else {
          // 加载数据列表
        }
      }
      const scrollDisabled = computed(() => renderDataList.length >= listCount)
      return {
        scrollDisabled,
        renderDataList,
        handleInfiniteOnLoad
      }
    }
    
  3. 支持Vue3的滚动加载插件,所有用法和vue-infinite-scroll一致。详细api功能可点击作者链接查看
文章来自个人专栏
前端相关知识
7 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0