forked from cybrespace/pinafore
51 lines
1.4 KiB
HTML
51 lines
1.4 KiB
HTML
<div class="pseudo-virtual-list-item"
|
|
aria-hidden="{{hide}}"
|
|
pseudo-virtual-list-key="{{key}}"
|
|
style="height: {{shouldHide ? `${height}px` : ''}};"
|
|
ref:node>
|
|
{{#if !shouldHide}}
|
|
<:Component {component}
|
|
virtualProps="{{props}}"
|
|
virtualIndex="{{index}}"
|
|
virtualLength="{{length}}"
|
|
/>
|
|
{{/if}}
|
|
</div>
|
|
<script>
|
|
import { scheduleIdleTask } from '../../_utils/scheduleIdleTask'
|
|
import { mark, stop } from '../../_utils/marks'
|
|
|
|
export default {
|
|
oncreate () {
|
|
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() || {} // TODO: wtf svelte?
|
|
if (!isIntersecting) {
|
|
this.set({hide: true})
|
|
}
|
|
stop('unrender')
|
|
})
|
|
}
|
|
})
|
|
|
|
let { intersectionObserver } = this.get()
|
|
intersectionObserver.observe(this.refs.node)
|
|
},
|
|
computed: {
|
|
shouldHide: (isIntersecting, isCached, hide) => {
|
|
if (isCached) {
|
|
return true // if it's cached, always unrender immediately until proven it's intersecting
|
|
}
|
|
return !isIntersecting && hide
|
|
}
|
|
}
|
|
}
|
|
</script>
|