javascript - 如何在可扩展行内传递来自 firestore 的文本数据并获取要在 setState 内传递的文档 ID?
问题描述
在 Firestore 中,我有这个字段title
,createdDate
和text
. 如何在 mui 数据表title
中显示字段。createdDate
然后text
将显示在展开的行内。我怎样才能做到这一点?
const columns = ["Title", "Created Date"];
const [blogs, setBlogs] = useState([]);
useEffect(() => {
const unsubscribe = firestore
.collection("blogs")
.onSnapshot((snapshot) => {
const arr = [];
snapshot.forEach((doc) => {
const data = doc.data();
arr.push({
text: parse(data.text),
Title: data.title,
"Created Date": new Date(
data.createdDate.seconds * 1000
).toDateString(),
});
});
setBlogs(arr);
setIsLoading(true);
});
return () => {
unsubscribe();
};
}, []);
const options = {
filter: true,
expandableRows: true,
renderExpandableRow: (rowData, rowMeta) => {
console.log(); //how do I render the `text` here from firestore?
},
};
返回内部:我尝试将blogs
数据放入内部,但它不起作用。没有数据显示。
<MUIDataTable
title={"List"}
columns={columns}
data={blogs}
options={options}
/>
解决方案
只需像这里一样移动你的听众setBlogs
内部:onSnapshot
useEffect(() => {
const unsubscribe = firestore
.collection("blogs")
.onSnapshot((snapshot) => {
const arr = [];
snapshot.forEach((doc) => {
const data = doc.data();
arr.push({
text: parse(data.text),
Title: data.title,
"Created Date": new Date(data.createdDate.seconds * 1000).toDateString(),
});
setBlogs(arr);
});
setIsLoading(true);
});
return () => {
unsubscribe();
};
}, []);
如果它在onSnapshot
侦听器之外,您将始终将其设置blogs
为空数组,因为setBlogs
它将在onSnapshot
侦听器被触发之前执行。
这是他们可以使行更红和可扩展的方式:
import MUIDataTable, {ExpandButton} from "../../src/";
import TableRow from "@material-ui/core/TableRow";
import TableCell from "@material-ui/core/TableCell";
const options = {
filter: true,
filterType: 'dropdown',
responsive: 'standard',
expandableRows: true,
expandableRowsHeader: false,
expandableRowsOnClick: true,
isRowExpandable: (dataIndex, expandedRows) => {
if (dataIndex === 3 || dataIndex === 4) return false;
// Prevent expand/collapse of any row if there are 4 rows expanded already (but allow those already expanded to be collapsed)
if (expandedRows.data.length > 4 && expandedRows.data.filter(d => d.dataIndex === dataIndex).length === 0) return false;
return true;
},
rowsExpanded: [0, 1],
renderExpandableRow: (rowData, rowMeta) => {
const colSpan = rowData.length + 1;
return (
<TableRow>
<TableCell colSpan={colSpan}>
Custom expandable row option. Data: {JSON.stringify(rowData)}
</TableCell>
</TableRow>
);
},
onRowExpansionChange: (curExpanded, allExpanded, rowsExpanded) => console.log(curExpanded, allExpanded, rowsExpanded)
};
它来自这里的示例。只需确保您的数据结构是否可以与示例一起使用(也许您需要稍微采用它)。
推荐阅读
- c# - 为什么 EF Core 2.1 只为 2 个 FK 添加 1 个索引?
- reactjs - 从函数参数中调用的 setState 无法导致渲染
- reactjs - React - 具有不同入口点/部分的应用程序的最佳实践
- azure - 如何将 Hive 分区和分桶文件中的文件合并为一个大文件?
- php - 自定义令牌响应
- php - PHP Telegram bot:如何按顺序发送消息
- c# - 何时使用私有属性(无特殊逻辑)
- javascript - 引导模式未显示修复
- python - 如何将 for 循环中的列表添加到字典中的每个键?
- swift - 在 Swift 5 中找到使用 MVVM 处理分页 JSON 的更好方法