pinafore/routes/_components/pseudoVirtualList/PseudoVirtualListItem.html

58 lines
1.5 KiB
HTML
Raw Normal View History

<div class="pseudo-virtual-list-item"
aria-hidden={hide}
pseudo-virtual-list-key={key}
style="height: {shouldHide ? `${height}px` : ''};"
ref:node>
{#if !shouldHide}
<svelte:component this={component}
virtualProps={props}
virtualIndex={index}
virtualLength={length}
/>
{/if}
</div>
<script>
2018-01-31 06:17:01 +01:00
import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
import { mark, stop } from '../../_utils/marks'
import { observe } from 'svelte-extras'
2018-01-31 06:17:01 +01:00
export default {
2018-04-20 06:38:01 +02:00
oncreate () {
2018-01-31 06:17:01 +01:00
this.observe('isIntersecting', isIntersecting => {
if (isIntersecting) {
mark('render')
this.set({hide: false})
stop('render')
} else {
// unrender lazily; it's not a critical UI task
scheduleIdleTask(() => {
mark('unrender')
let { isIntersecting } = this.get()
if (!isIntersecting) {
2018-01-31 06:17:01 +01:00
this.set({hide: true})
}
stop('unrender')
})
}
})
let { intersectionObserver } = this.get()
intersectionObserver.observe(this.refs.node)
2018-01-31 06:17:01 +01:00
},
data: () => ({
hide: false
}),
2018-01-31 06:17:01 +01:00
computed: {
shouldHide: ({ isIntersecting, isCached, hide }) => {
2018-01-31 06:17:01 +01:00
if (isCached) {
return true // if it's cached, always unrender immediately until proven it's intersecting
}
return !isIntersecting && hide
}
},
methods: {
observe
}
}
</script>