标签:使用 console ott upd 设计 server dir == off
在Vue.js中实现一个列表无限下拉刷新功能,最好的实现方式应该是利用自定义指令,Vue除了核心功能默认内置的指令 (v-model 和 v-show),在仍然需要对普通 DOM 元素进行底层操时,推荐使用自定义指令。Vue指令为我们提供了以下几个钩子函数,
const MyDirective = {
bind(el, binding, vnode, prevVnode) {},
inserted() {},
update() {},
componentUpdated() {},
unbind() {}
}
我们这样来设计指令的使用方式
它有三个入参,即:
判断一个container元素的内容是否滚动到底部,成立条件为scrollHeight - scrollTop <= clientHeight
。如果想让内容距离底部 xxx distance时加载,则 scrollHeight - scrollTop - distance <= clientHeight
。
【这三个属性都是container容器元素的属性,而不是滚动内容元素的属性】。容器元素高度一定是固定的,而不是由内容撑开,这样才会有滚动条出现,当然overflow肯定不能为hidden。
element.getBoundingClientRect()
.指令的js代码:
export default {
inserted(el, binding) {
const domHeight = el.clientHeight;
let distance = Number(binding.arg)
if (Number.isNaN(distance)) distance = 0
const { immediate } = binding.modifiers
const cb = binding.value
if (el.scrollHeight === 0) {
console.log(`scollheigt == ${el.scrollHeight}, 请检查overflow属性`);
}
const handleScroll = () => {
if (el.scrollHeight - el.scrollTop - distance <= domHeight) {
console.log(el.scrollTop ,‘bottom!‘);
cb()
}
}
el[‘ifsScope‘] = { handleScroll }
el.addEventListener(‘scroll‘, handleScroll)
if (immediate) {
const observer = new MutationObserver(handleScroll)
observer.observe(el, { childList: true, subtree: true })
handleScroll()
}
},
unbind(el) {
let { handleScroll } = el[‘ifsScope‘]
el.removeEventListener(‘scroll‘, handleScroll)
}
}
然后使用局部注册的方式使用:
import infiniteScroll from ‘./iScroll.js‘
const vm = new Vue({
el: ‘#app‘,
directives: { infiniteScroll },
})
标签:使用 console ott upd 设计 server dir == off
原文地址:https://www.cnblogs.com/zoujiyun/p/13204078.html