Skip to content

Instantly share code, notes, and snippets.

@Akryum
Created December 15, 2019 14:40
Show Gist options
  • Save Akryum/ae7aa882d674f80fdf85837f3c8949e3 to your computer and use it in GitHub Desktop.
Save Akryum/ae7aa882d674f80fdf85837f3c8949e3 to your computer and use it in GitHub Desktop.

Revisions

  1. Akryum revised this gist Dec 15, 2019. No changes.
  2. Akryum created this gist Dec 15, 2019.
    19 changes: 19 additions & 0 deletions List.vue
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,19 @@
    <script>
    import { ref } from '@vue/composition-api'
    import { onScrollBottom } from '@/scroll'
    export default {
    setup () {
    function loadMore () {
    // ...
    }
    const el = ref()
    onScrollBottom(loadMore, el, 600)
    return {
    el,
    }
    }
    }
    </script>
    50 changes: 50 additions & 0 deletions scroll.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,50 @@
    import { onUnmounted, watch } from '@vue/composition-api'

    function getScrollParent (node) {
    if (node == null) {
    return null
    }

    if (node.scrollHeight > node.clientHeight) {
    if (node === document.documentElement) {
    return { emitter: document, scroller: document.documentElement }
    }
    return { emitter: node, scroller: node }
    } else {
    return getScrollParent(node.parentNode)
    }
    }

    export function onScrollBottom (handler, el, offsetFromBottom) {
    let scrollParent

    function onScroll () {
    const { scroller } = scrollParent
    if (scroller.scrollTop >= scroller.scrollHeight - scroller.clientHeight - offsetFromBottom) {
    handler()
    }
    }

    function addListeners () {
    removeListeners()
    if (!el.value) return
    scrollParent = getScrollParent(el.value)
    if (scrollParent) {
    scrollParent.emitter.addEventListener('scroll', onScroll)
    }
    }

    function removeListeners () {
    if (scrollParent) {
    scrollParent.emitter.removeEventListener('scroll', onScroll)
    }
    }

    watch(el, () => {
    addListeners()
    })

    onUnmounted(() => {
    removeListeners()
    })
    }