javascript - 反应自定义钩子,计数器不断增加
问题描述
我正在使用带有钩子的 React,我正在尝试为交互观察者创建一个自定义钩子
对于此功能:Infinite Scroll in react
因为我想让它被多次重复使用,所以我想用它来发帖、评论等
这是我到目前为止得到的:
使用观察者钩子:
import React, { useState, useEffect } from 'react';
const useObserver = ({ element, callback }) => {
const [page, setPage] = useState(1);
console.log('props');
console.log(page);
const options = {
root: null,
rootMargin: '0px',
threshold: 1.0
};
const observerHandler = (entities) => {
console.log('handle observer');
const y = entities[0].boundingClientRect.y;
const target = entities[0];
if (target.isIntersecting) {
setPage((counter) => counter + 1);
}
};
useEffect(() => {
const observer = new IntersectionObserver(observerHandler, options);
if (element.current) {
observer.observe(element.current);
}
});
return [1];
};
export default useObserver;
我使用钩子的父组件:
import React, { useRef, useState, useEffect } from 'react';
import useObserver from './useObserver';
const Posts = ({ posts }) => {
// initiate posts loader
const loader = useRef(null);
const [page] = useObserver({ element: loader });
return (
<div id="post-list">
<h1> Post list </h1>
<div class="test" ></div>
<h1>Show posts</h1>
<div className="loading" ref={loader}>
<h1>Loader</h1>
</div>
</div>
);
};
我遇到的问题是useObserver 组件内部的状态页面总是增加并被连续调用多次,但是当用户滚动到该组件时它应该只调用一次
解决方案
尝试在 useEffect 中保留一个包含元素的数组
useEffect(() => {
const observer = new IntersectionObserver(observerHandler, options);
if (element.current) {
observer.observe(element.current);
}
},[element]); //when you specify an empty array it runs only once, an array with value will run when ever the value changes
推荐阅读
- javascript - 关闭推送内容的画布侧边栏?
- r - 在 tibble 列中查找最长的连续条纹
- java - 在 java 集成测试中查询 CosmosDB 时代码卡住了
- css - md-tab 样式(Angular 1.6)。甚至可能吗?
- javascript - 在 Ease-In 上禁用引导导航栏链接
- python - VS 代码调试 - 为什么 Bash 命令不一致?
- reactjs - React.useEffect 堆栈执行防止父级设置默认值
- php - 在 STRIPE 上发生 webhook 事件后使用 bot 编写消息
- python - 我有一个从文件加载值的函数,但它不起作用
- css - 使用 Bootstrap 4 在响应式站点上居中文本