我正在尝试使用 构建延迟加载功能react-intersection-observer
,目标是仅加载框中的图像(如果它们在视口中)。
inView
,这会true
在滚动到最后一个元素时转向,并false
在最后一个元素离开视口时转向。如何解决此问题,使其仅渲染出视口中的框?
应用程序.js
export const AppContext = createContext();
function App() {
const { ref, inView, entry } = useInView({
rootMargin: "50px 0px",
initialInView: true
// triggerOnce: true,
});
return (
<AppContext.Provider value={{ ref, inView, entry }}>
<div className="App">
<Posts />
</div>
</AppContext.Provider>
);
}
export default App;
Post.js
import { useContext } from 'react'
import { AppContext } from '../App'
function Post({ post }) {
const { ref, inView } = useContext(AppContext)
return (
<div className="post" ref={ref}>
{inView ?
<img src={post.imgUrl} alt={post.title} className="post__img" loading="lazy" />
: <div className="post__img" />
}
<h1 className="post__title">{post.title}</h1>
</div>
)
}
export default Post
我更新了下面的 Codesandbox 链接以移至useInView
并Post.js
删除 Context API。现在可以了!
首先,您正在使用上下文,它保持单一状态,但在您的情况下,您希望分别跟踪所有帖子项目,
只需在 Post.js 的每个组件中引入useInView钩子,然后将其从 App.js 中删除
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句