javascript - 如何在Vue js中做一个无限滚动,动态渲染一个列表(只可见)

标签 javascript arrays optimization vue.js render

我有一个非常大的对象数组,其中有大量数据要由 Vue 在 DOM 组件中呈现,我想最好的方法是只呈现将要可见的 HTML,因为例如,如果每个组件的高度为 100px,而组件容器的高度为 1000px,则一次只能渲染 10 个组件;直到用户向下或向上滚动,并以一种 FIFO 方式(先进先出)渲染和“取消渲染”各自的元素。

所以我想知道的是:哪种方法最好?可以通过使用一个包含 10 个对象的数组来解决,并将容器的高度增加 100px(将容器的高度额外增加 50px)底部和顶部),所以当用户在那个额外的空间滚动时做 fifo 的事情,另一个解决方案可以为每个组件提供计算能力(在 window 对象的帮助下)如果可见然后渲染自己(用v-show 指令)。我不知道。

(好的,这个问题指的是列表的动态渲染,而不是组件的动态加载或动态组件)。

任何想法、方法、标准或技术都会非常有用!

var app = new Vue({
  el: '#app',
  data: {
    users: Array(1000).fill({
      gender: "male",
      name: {
        title: "mr",
        first: "vincent",
        last: "ouellet"
      },
      location: {
        street: "6963 disputed rd",
        city: "brockton",
        state: "yukon",
        postcode: "Z4J 0J2",
        coordinates: {
        latitude: "-60.8550",
        longitude: "-36.0196"
      },
      timezone: {
        offset: "+3:30",
        description: "Tehran"
      }
      },
      email: "vincent.ouellet@example.com",
      login: {
        uuid: "eb9b61f7-fb0b-4731-9a1c-f4b2a7b3b6a9",
        username: "bigpeacock949",
        password: "nyjets",
        salt: "0TdUElhf",
        md5: "0fbc0edb70fda545f8838634f11f4be2",
        sha1: "f83e02d917721a1516b74937841b9c7f75a75d1e",
        sha256: "69e2c04bd4ccb43815b529a7182e1e59b9f788032b8197af54b9b6d3f907b8a3"
      },
      dob: {
        date: "1959-08-27T20:26:03Z",
        age: 59
      },
      registered: {
        date: "2013-10-20T04:51:58Z",
        age: 4
      },
      phone: "647-173-6604",
      cell: "544-306-1457",
      id: {
        name: "",
        value: null
      },
      picture: {
        large: "https://randomuser.me/api/portraits/men/13.jpg",
        medium: "https://randomuser.me/api/portraits/med/men/13.jpg",
        thumbnail: "https://randomuser.me/api/portraits/thumb/men/13.jpg"
      },
      nat: "CA"
      }
    )
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>

<div id="app">
  <ul v-for="(user, i) in users">
    <li>
      <image :src="`https://randomuser.me/api/portraits/men/${i}.jpg`"/>
      <!-- IM THE REAL APLICATION THIS IS A VERY HEAVY UI -->
      <pre>{{user}}</pre>
    </li>
  </ul>
</div>

最佳答案

在您创建的方法中,您可以添加一个事件监听器来查找文档的末尾。

window.onscroll = () => {
    let bottomOfWindow =
      document.documentElement.scrollTop + window.innerHeight ===
      document.documentElement.offsetHeight;

    if (bottomOfWindow) {
      axios.get(`https://randomuser.me/api/`).then(response => {
        this.persons.push(response.data.results[0]);
      });
    }
  };

一旦你得到你的回应,你就可以推送到你用来迭代的数组。 但是,当您在移动设备上使用时,您需要监听触摸事件而不是滚动。

或者我找到这个插件 https://peachscript.github.io/vue-infinite-loading/非常容易实现,它同时处理移动和桌面事件。

关于javascript - 如何在Vue js中做一个无限滚动,动态渲染一个列表(只可见),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901193/

相关文章:

javascript - 如何提交变更表格?

javascript - javascript 中 var a = (expression1, expression2) 背后的原因是什么?

javascript - 打印 Google 图表以占据整页

windows - Windows 7下64位R的优化问题

python - 优化社交排行榜

Python:内存泄漏?

javascript - 我可以出于开发目的运行本地版本的 firebase 数据库吗?

javascript - 如果我不打算返回任何内容,我应该使用像map和filter这样的数组方法吗?

Java 二维数组,查找包含的元素

java - 比较字符串数组列表和字符串数组