javascript - 减少此代码重复性的想法?
问题描述
这是相关组件的概要
export default () => {
const { currentUser, logout } = useAuth();
const [sideBarOpen, setSideBarOpen] = useState(false);
const theme = useTheme();
const classes = useStyles();
const isSmall = useMediaQuery(theme.breakpoints.down("sm"));
const history = useHistory();
const toggleSideBar = () => {
setSideBarOpen(!sideBarOpen);
};
const handleLogout = () => {
setSideBarOpen(!sideBarOpen);
logout();
history.push("/login");
};
return (
<AppBar position="static" className={classes.root}>
<Toolbar>
<Typography variant="h6" className={classes.title}>
Chatter
</Typography>
{isSmall ? (
<>
<IconButton color="inherit" onClick={toggleSideBar}>
<MenuIcon />
</IconButton>
<Drawer
anchor="right"
open={sideBarOpen}
onClose={toggleSideBar}
className={classes.sideBar}
>
<List className={classes.drawerList}>
<ListItemLink
primary="login"
to="/login"
icon={<LockOpenIcon />}
onClick={toggleSideBar}
/>
<Divider />
<ListItemLink
primary="signup"
to="/signup"
icon={<ArrowUpwardIcon />}
onClick={toggleSideBar}
/>
{currentUser && (
<Button
onClick={handleLogout}
color="primary"
variant="contained"
>
Logout
</Button>
)}
</List>
</Drawer>
</>
) : (
<>
<Link to="/signup">
<Button variant="contained" color="primary">
Sign up
</Button>
</Link>
<Button variant="contained" color="primary" onClick={handleLogout}>
{currentUser ? "Logout" : "Login"}
</Button>
</>
)}
</Toolbar>
</AppBar>
);
};
我想知道如何才能不重复移动和桌面的链接两次,因为它们有 2 个独立的导航,移动有侧边栏,更大的有合法的导航栏。也许有办法用材料ui做到这一点?也许有一个很好的解决方案,只需做出反应?任何帮助将不胜感激谢谢(现在只有 2 个链接,但稍后会有更多)
解决方案
会有不同的可能方法。您需要定义哪些探针、样式或代码必须不同,以及哪些部分可以重复使用。例如,我不确定是否ListItemLink
可以Link
在您的用例中结合使用,或者按钮是否应该看起来相同或具有不同的大小,...
分离组件
我试图解释导致解决方案的步骤。您可能想跳过一些步骤并得到相同的结果(但实际上我有时只是以这种方式开始编码):
- 首先,我会为大小分别制作两个单独的组件。
- 创建例如一个
GenericLink
组件和一个GenericButton
组件。 - 将所有代码添加到其中一种尺寸(例如大)所必需的,
GenericLink
并GenericButton
使其工作。 - 通过添加必要的属性和代码来“调试”其他大小,例如小,以使其工作。
- 实现必要的属性和条件(例如
size={'small'}
和icon={ size === 'small' ? null : <ArrowUpwardIcon />}
)
在某处,您现在可能已经为您的特定用例找到了一个好的解决方案,或者您发现它根本不起作用并且您确实需要单独的组件。
传递数据而不是 JSX
<Link ...>
您可以将列表存储为数组,而不是将每个组件写入 JSX:
const links = [
{ primary: "login", to: "login", icon: <LockOpenIcon />, onClick: toggleSideBar },
...
]
您可以将此数据传递给单独的组件,例如<GenericList list={ list } size={'small'} />
. 这样您就可以使用相同的数据来生成大列表和小列表。
推荐阅读
- mysql - 无法使用数据库 mysql-netbeans 中的 aes_encrypted 密码登录
- sql - 如何在键/值 PostgreSQL json 字段中搜索?
- c# - Redis 连接池的这种实现看起来是否正确?
- postgresql - 使用 jenkins 从 sftp 服务器将数据加载到 RDS Postgresql
- android - Android Compose:在图像上绘制透明圆圈
- amazon-web-services - 使 AWS RDS 可从 Lambda 函数访问
- angular - 从组件到列表/表格的大子级的角度模板
- sql-server - SQL Server“未指定列名” - 但它是
- javascript - 按选定行的材料 ui 数据表过滤器
- javascript - 将丢失的变量推送到 dataLayer 中,保持其他所有内容不变