javascript - 将组件的部分指定为子组件
问题描述
我想将我的 React 组件放在 DOM 中,如下所示:
<Table>
<FirstNameColumnHeader>First Name</FirstNameColumnHeader>
<LastNameColumnHeader>Last Name</LastNameColumnHeader>
...
<FirstNameRowContent>John</FirstNameRowContent>
<LastNameRowContent>Doe</LastNameRowContent>
</Table>
Table
像这样的东西在哪里:
<table>
<thead>
<tr>
<th>{ CONTENT OF FirstNameColumnHeader }</th>
<th>{ CONTENT OF LastNameColumnHeader }</th>
</tr>
</thead>
<tbody>
<tr>
<td>{ CONTENT OF FirstNameRowContent }</td>
<td>{ CONTENT OF LastNameRowContent }</td>
</tr>
</tbody>
</table>
所以它想有效地过滤Table
特定类型组件的子组件,然后我想在组件内的特定位置呈现它们。有什么方法可以优雅地在 React 中做到这一点。到目前为止,我想出的最好的方法是在内部使用上下文提供程序Table
并在子组件中使用它。
const DataTableContext = createContext({});
const useDataTableContext = () => useContext(DataTableContext);
const Table = ({ children }) => {
const [firstNameColumnHeader, setFirstNameColumnHeader] = useState(null);
return (
<DataTableContext.Provider value={{ setFirstNameColumnHeader }}>
{children}
<table>
<thead>
<tr>
<th>{ firstNameColumnHeader }</th>
...
</DataTableContext.Provider>
);
};
export const FirstNameColumnHeader = ({ children }) => {
const { setFirstNameColumnHeader } = useDataTableContext();
useEffect(() => {
setFirstNameColumnHeader(<>{children}</>);
}, []);
return null;
};
它看起来很笨重,并且在状态中存储了一个 JSX 组件,我认为这是一种不好的做法。有没有更好的方法来实现我想要的?我觉得我试图以错误的方式解决这个问题。
解决方案
我认为有一些方法可以实现您的目标,但我鼓励您考虑为什么要这样做。如果目标是制作一个灵活、可重用的表格组件,那么有很多可用的,您仍然可以自己制作。您决定的这种格式将使这种组件结构难以维护,甚至更难于人类理解。HTML 中的表格结构已经非常简单——行和单元格。为什么不保持一致的结构并让您的自定义组件呈现 TD?
<Table>
<Row>
<FirstNameCell />
</Row>
</Table>
推荐阅读
- sql - SQL Server:按用户 ID 分组 - 将 2 行合并为 1 行
- apache-fop - PDF 中未显示字形
- xmonad - 如何使 xmonad 在外部 HDMI 显示器上工作?
- regex - 在 PowerShell 中使用正则表达式替换多行字符串
- apache-kafka - 如何仅查看已提交的 kafka 消息
- moodle - 使用角色功能获取角色
- android - 如何保持textview低于进度条的进度?
- android - 为什么需要在电话重启时重新请求媒体投影权限
- jquery - 如何在日期范围选择器中禁用上个月
- java - 数据库或ORM设置的SQL行创建和修改时间?