vue中如何判断元素进入可视区和离开可视区
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
最近开发中遇到一个问题,页面中有一个上拉加载下拉刷新的列表,列表中每条数据都有一个ehcarts的折线,当列表数据多的话echarts也会随着增加,必然会造成性能消耗,于是想到了采用这个技术,
话不多说直接贴代码:
1. 创建自定义指令
首先,创建一个自定义指令来封装 Intersection Observer 的逻辑。这样你可以在多个组件中复用这段代码。
// src/directives/intersect.js
export default {
mounted(el, binding) {
const options = {
root: null,
rootMargin: '0px',
threshold: 0.1, // 触发回调的阈值(0-1之间)
};
const callback = (entries, observer) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
// 元素进入可视区
binding.value(true, entry);
} else {
// 元素离开可视区
binding.value(false, entry);
}
});
};
const observer = new IntersectionObserver(callback, options);
observer.observe(el);
el._observer = observer;
},
unmounted(el) {
if (el._observer) {
el._observer.disconnect();
delete el._observer;
}
},
};
2. 注册自定义指令
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import intersect from '@/directives/intersect';
const app = createApp(App);
app.directive('intersect', intersect);
app.mount('#app');
3. 在 Vue 组件中使用自定义指令
<template>
<div v-intersect="handleIntersect" class="observed-element">
观察的元素
</div>
</template>
<script>
import intersect from '@/directives/intersect';
export default {
directives: {
intersect,
},
methods: {
handleIntersect(isIntersecting, entry) {
if (isIntersecting) {
console.log('元素进入可视区', entry);
} else {
console.log('元素离开可视区', entry);
}
},
},
};
</script>
<style scoped>
.observed-element {
height: 100px;
background-color: lightblue;
margin-bottom: 200vh; /* 确保元素初始状态在视口外 */
}
</style>
- 自定义指令:
intersect
是一个 Vue 自定义指令,用于在元素挂载到 DOM 上时创建一个 Intersection Observer,并在元素被卸载时断开观察。 - 回调函数:在
intersect
指令的回调函数中,当元素进入或离开可视区时,会触发回调并传递isIntersecting
状态和entry
对象。 - 组件使用:在组件中,通过
v-intersect="handleIntersect"
使用这个指令,并在handleIntersect
方法中处理元素进入和离开可视区的逻辑。
这样你就可以在 Vue 3 组件中判断元素是否在可视区内以及何时离开可视区了
GitHub 加速计划 / vu / vue
207.52 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:1 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 3 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 3 个月前
更多推荐
已为社区贡献1条内容
所有评论(0)