За это время я написал компонент прокрутки Vue:starkwang/vue-virtual-collection, а теперь официально опубликуйте это ~
Было несколько похожих компонентов прокрутки списка vue, но они не были нацелены наВодопады текутКомпонент прокрутки vue, который представляет собой компонент прокрутки, подобный этому:
Нажмите ниже, чтобы посмотреть демонстрацию напрямую 👇:
vue-виртуальная-коллекцияstarkwang.github.ioЛюбая форма PR, выпуск приветствуется~
использовать
Его очень просто использовать:
import Vue from 'vue'
import VirtualCollection from 'vue-virtual-collection'
Vue.use(VirtualCollection)
Затем вы можете использовать его в своем коде, вот простой пример:
<template>
<div>
<VirtualCollection :cellSizeAndPositionGetter="cellSizeAndPositionGetter" :collection="items" :height="500" :width="330">
<div slot="cell" slot-scope="props">{{props.data}}</div>
</VirtualCollection>
</div>
</template>
<script>
export default {
data () {
return {
/**
* This will create 1000 items like:
* [
* { data: '#0' },
* { data: '#1' },
* ...
* { data: '#999' }
* ]
*/
items: new Array(1000).fill(0).map((_, index) => ({ data: '#' + index }))
}
},
methods: {
cellSizeAndPositionGetter(item, index) {
// compute size and position
return {
width: 100,
height: 150,
x: (index % 2) * 110,
y: parseInt(index / 2) * 160
}
}
}
}
</script>
выполнить
Теперь самотестирование, вероятно, может поддерживать рендеринг данных 100 Вт+ без задержек, чего определенно достаточно в большинстве сценариев. в общемлокальный рендеринга такжеПереработка ДОМ, не будет отображать все данные, а будет отображать ячейку, отображаемую в текущем окне просмотра, поэтому производительность будет намного выше, чем при отображении полного объема данных.
Кратко выраженный в коде:
const DisplayCells = Cells.filter(isInViewPort)
Но в этой реализации будут проблемы, если вы пройдёте все данные для вычисления по одномуisInViewPort, когда данных много, производительность очень плохая (впрочем, большинство компонентов бесконечной прокрутки делают это сейчас==).
Чтобы эффективно отображать, какие ячейки в области просмотра необходимо визуализировать, вместо этого нам нужно использовать идею «блочного рендеринга». Мы можем определить «блок» как квадрат 200*200,Все ячейки, пересекающиеся с этим блоком, будут записаны в этот блок.
Эти «блоки» хранятся в карте, когда происходит прокрутка, нам нужно только рассчитать данные о том, какие блоки должны отображаться в данный момент, а затем перейти к этим блокам, чтобы найти соответствующие ячейки, вместо обхода всех ячеек.
Вот нарисованный пример:
На данный момент то, что записано в Карте, должно быть:
{
"0.0": [1, 2, 3, 5], // 0.0块与1,2,3,5号Cell有重叠,下同
"0.1": [5, 3, 6, 7],
"0.2": [7, 6, 8, 9],
"1.0": [2, 3, 4],
"1.1": [3, 4, 6],
"1.2": [6, 9]
}
Когда мы прокручиваем страницу, мы можем легко вычислить, какие блоки в данный момент должны быть отрисованы в соответствии с расстоянием прокрутки, шириной и высотой области просмотра.
Например, в приведенном выше примере нам нужно визуализировать четыре блока 0.0, 0.1, 1.0 и 1.1, а затем нам нужно только найти ячейки, содержащиеся в этих блоках, на карте, и мы можем эффективно их визуализировать, а не Обходя все ячейки Поиск грубой силы.
Это еще один очень популярный компонент с открытым исходным кодом.react-virtualizeОсновную идею можно увидеть ниже, чтобы увидеть, как реализован конкретный SectionManager:
GitHub.com/Не Вон/Горячее Ах… GitHub.comПодобные идеи также могут быть применены к спискам, таблицам и сеточным системам.