最终的结果需要排序和显示“达到了广告”的结果也获取更多的结果时,没有点击按钮滚动窗口。我只是添加了“加载更多”按钮进行测试。
现有的实现不会在结果的顶部显示“reach-up-ads”,并且在单击“load more”按钮时加载相同的数据。
前端
useEffect(()=>{
fetchPosts();
}, [skip])
const loadMore = () => {
setSkip(posts?.length);
}
const fetchPosts = async () => {
const { data } = await getMobilePosts(skip);
const filterData = await data?.filter(obj => obj.adPromote == "free-ad" || obj.adPromote == "reach-up-ad")
.sort((f,p)=>{
if (f.adPromote === 'reach-up-ad' && p.adPromote !== 'reach-up-ad') {
return -1;
} else if (f.adPromote !== 'reach-up-ad' && f.adPromote === 'reach-up-ad') {
return 1;
}
return 0;
})
.map(obj => {
return {
...obj,
title: `${obj.title} (${obj.features.condition})`,
location: `Posted On ${new Date(obj.createdAt).toDateString()}
}
});
setPosts(existing => [...existing, ...filterData]);
}
return (
<div>
{posts?.map((data, i) => {
return (
<ExchangeItemWideCard
key={i}
id={data._id}
title={data.title}
location={data.location}
/>
)
})}
<Button onClick={loadMore}>Load more</Button>
</div>
)
** Mongoose **
export async function getMobilePosts(skips: any) {
try{
const skip = skips ? Number(skips) : 0;
const DEFAULT_LIMIT = 10;
return await Post.find({expiredAt: {$gte: currentDate},status: 'live'},
"features.subCategory features.condition swapType.type swapType.price createdAt features.mainCategory title location.district location.location photos adPromote status description postedBy notes")
.skip(skip)
.limit(DEFAULT_LIMIT)
.sort({ _id: -1 });
} catch(error: any) {
throw new Error(error as any);
}
}
1条答案
按热度按时间erhoui1w1#
我发现这个简单的解决方案不使用任何NPM包。
info
场景是这样的,当用户滚动到选定的div区域时,只从后端mongoDB数据库获取数据,然后用户滚动应该获取更多数据。我使用
IntersectionObserver
和useRef
来定位div位置,然后使用addEventListener
来设置滚动事件。最终代码看起来像这样。