import { Directive } from 'vue'; import { getScrollContainer, getScrollPosition } from '@/scripts/scroll'; export default { mounted(src, binding, vn) { if (binding.value === false) return; let isBottom = true; const container = getScrollContainer(src)!; container.addEventListener('scroll', () => { const pos = getScrollPosition(container); const viewHeight = container.clientHeight; const height = container.scrollHeight; isBottom = (pos + viewHeight > height - 32); }, { passive: true }); container.scrollTop = container.scrollHeight; const ro = new ResizeObserver((entries, observer) => { if (isBottom) { const height = container.scrollHeight; container.scrollTop = height; } }); ro.observe(src); // TODO: 新たにプロパティを作るのをやめMapを使う src._ro_ = ro; }, unmounted(src, binding, vn) { if (src._ro_) src._ro_.unobserve(src); }, } as Directive;