reactjs - 如何使用 react、redux 和 firestore 进行分页
问题描述
我很困惑如何构建无限滚动的代码。如果有人知道如何逐页(如谷歌)实现分页,那也是可以接受的。我看过很多关于无限滚动分页的教程,但没有一个使用 redux。
这是我渲染 Firestore 文档的 Layout 组件。
const Layout = (props) => {
const classes = useStyles();
const [checked, setChecked] = React.useState(false);
const handleChange = () => {
setChecked((prev) => !prev);
};
React.useEffect(async () => {
await props.fetchPrograms("all", "mostPopular");
}, []);
const renderCards = () => {
if (!props.programs.programs) {
return [1, 2, 3, 4, 5, 6].map((item) => {
return <Skeleton key={item} />;
});
} else {
if (props.programs.programs.length > 0) {
return props.programs.programs.map((program, index) => {
return <Card key={index} program={program} />;
});
} else {
return (
<div style={{ display: "flex" }}>
<NoProgramFound />
</div>
);
}
}
};
const breakpoints = {
default: 3,
950: 2,
620: 1,
};
const renderSort = () => {
if (!props.programs.programs) {
return null;
}
return <GroupedSelect />;
};
return (
<React.Fragment>
<Masonry
breakpointCols={breakpoints}
className="my-masonry-grid"
columnClassName="my-masonry-grid_column"
>
{renderCards()}
</Masonry>
</React.Fragment>
);
};
const mapStateToProps = (state) => {
return {
programs: state.programs,
};
};
export default connect(mapStateToProps, { fetchPrograms })(Layout);
用于从 firestore 获取数据的动作创建者文件是
export const fetchPrograms =
(byCategory, byProgram, bool) => async (dispatch) => {
try {
const category = byCategory[0].toLowerCase() + byCategory.slice(1);
let docs = null;
if (category === "all") {
if (byProgram === "mostPopular") {
// ALL AND POPULAR
docs = await db
.collection("programs")
.orderBy("registrationCount", "desc")
.get();
} else if (byProgram === "mostRecent") {
// ALL AND RECENT
docs = await db
.collection("programs")
.orderBy("createdAt", "desc")
.get();
}
} else {
if (byProgram === "mostPopular") {
// CATEGORY AND MOST POPULAR
docs = await db
.collection("programs")
.orderBy("registrationCount", "desc")
.where("category", "==", category)
.get();
} else if (byProgram === "mostRecent") {
docs = await db
.collection("programs")
.orderBy("createdAt", "desc")
.where("category", "==", category)
.get();
}
}
await docs.forEach((item) => {
itemArray.push(item.data());
});
await dispatch({ type: FETCH_PROGRAMS, payload: itemArray });
history.push("/");
} catch (error) {
console.log(error.message);
history.push("/error");
}
};
解决方案
推荐阅读
- google-cloud-platform - Google Cloud Run:连接两个服务
- reactjs - 如何在 react 和 bootstrap 上将模式重定向到 url?
- flutter - 为什么 GeneratedPluginRegistrant.registerWith(this) 在 Flutter MainActivity.kt 中出现错误?
- security - Vault - 如何通过 API 请求获取机密列表
- javascript - 有没有办法将 textarea 值连接或附加到电子邮件?
- arrays - 电子表格中的新行以使用 Google 表格中的行 ID 号添加列
- javascript - Javascript将数组拆分为n个子数组,块的大小无关紧要
- php - 如何在 php 中键入提示可能未定义的变量?
- sql - 确定日期排名 | 大查询
- vue.js - 如何在不添加我自己的 prop 的情况下将内置的 Vuetify 组件 prop 从其父级应用到 SFC 的根元素?