React 创建一个水平分隔线,中间有文本
React Create a Horizontal Divider with Text In between
我需要创建一个 React 组件,它是一个水平分隔线,中间有文本之类的内容。我在网上拥有的所有资源都无法帮助我完成这项工作。我尝试了一个 material-ui 分隔符,方法是创建一个分隔符组件并将我的文本放在中间,如下例所示:
<Divider>Or</Divider>
但是我得到错误:
hr is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.
我需要在下图中实现这一点:
我们将不胜感激。
下面是我的代码:
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import List from '@material-ui/core/List';
import Divider from '@material-ui/core/Divider';
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
}));
export default function ListDividers() {
const classes = useStyles();
return (
<List component="nav" className={classes.root} aria-label="mailbox
folders">
<Divider>Or</Divider>
</List>
);
}
这里是您可以执行的自定义示例:repro on stackblitz
import React, { Component } from "react";
import { render } from "react-dom";
import Hello from "./Hello";
import "./style.css";
const App = () => {
return <Divider>Or</Divider>;
};
const Divider = ({ children }) => {
return (
<div className="container">
<div className="border" />
<span className="content">
{children}
</span>
<div className="border" />
</div>
);
};
render(<App />, document.getElementById("root"));
和 CSS:
.container{
display: flex;
align-items: center;
}
.border{
border-bottom: 1px solid black;
width: 100%;
}
.content {
padding: 0 10px 0 10px;
}
使用 Material UI.
import React from "react";
import { makeStyles } from "@material-ui/core";
const useStyles = makeStyles(theme => ({
container: {
display: "flex",
alignItems: "center"
},
border: {
borderBottom: "2px solid lightgray",
width: "100%"
},
content: {
paddingTop: theme.spacing(0.5),
paddingBottom: theme.spacing(0.5),
paddingRight: theme.spacing(2),
paddingLeft: theme.spacing(2),
fontWeight: 500,
fontSize: 22,
color: "lightgray"
}
}));
const DividerWithText = ({ children }) => {
const classes = useStyles();
return (
<div className={classes.container}>
<div className={classes.border} />
<span className={classes.content}>{children}</span>
<div className={classes.border} />
</div>
);
};
export default DividerWithText;
您可以像下面这样导入和使用它
<DividerWithText>Or</DividerWithText>
结果
2022 年 3 月 29 日更新
现在可以使用 Material UI
https://mui.com/components/dividers/#dividers-with-text
有时您可能需要不同的间距
<Divider spacing={1}>Hello World</Divider>
或
<Divider spacing={2}>Hello World</Divider>
对于可配置的 spacing
这里是 Github Gist
如果您愿意,也可以在 codesandbox 中添加 playground
当前答案会导致中间有空格的任何文本换行:
如果发生这种情况,将 width: 100% 更改为 flexGrow: 1 应该可以解决问题:
border: {
borderBottom: "2px solid lightgray",
flexGrow: 1,
}
遗憾的是,目前在 MUI 中带有文本的 Divider
仅在 v5 中可用,它仍处于 alpha 阶段。如果您想尝试,可以下载 alpha 包,但请注意,它仍然非常不稳定,可能需要进行大量更改才能迁移到 v5,这不是很值得。
GitHub 讨论:https://github.com/mui-org/material-ui/issues/24036
我需要创建一个 React 组件,它是一个水平分隔线,中间有文本之类的内容。我在网上拥有的所有资源都无法帮助我完成这项工作。我尝试了一个 material-ui 分隔符,方法是创建一个分隔符组件并将我的文本放在中间,如下例所示:
<Divider>Or</Divider>
但是我得到错误:
hr is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.
我需要在下图中实现这一点:
我们将不胜感激。
下面是我的代码:
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import List from '@material-ui/core/List';
import Divider from '@material-ui/core/Divider';
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
}));
export default function ListDividers() {
const classes = useStyles();
return (
<List component="nav" className={classes.root} aria-label="mailbox
folders">
<Divider>Or</Divider>
</List>
);
}
这里是您可以执行的自定义示例:repro on stackblitz
import React, { Component } from "react";
import { render } from "react-dom";
import Hello from "./Hello";
import "./style.css";
const App = () => {
return <Divider>Or</Divider>;
};
const Divider = ({ children }) => {
return (
<div className="container">
<div className="border" />
<span className="content">
{children}
</span>
<div className="border" />
</div>
);
};
render(<App />, document.getElementById("root"));
和 CSS:
.container{
display: flex;
align-items: center;
}
.border{
border-bottom: 1px solid black;
width: 100%;
}
.content {
padding: 0 10px 0 10px;
}
使用 Material UI.
import React from "react";
import { makeStyles } from "@material-ui/core";
const useStyles = makeStyles(theme => ({
container: {
display: "flex",
alignItems: "center"
},
border: {
borderBottom: "2px solid lightgray",
width: "100%"
},
content: {
paddingTop: theme.spacing(0.5),
paddingBottom: theme.spacing(0.5),
paddingRight: theme.spacing(2),
paddingLeft: theme.spacing(2),
fontWeight: 500,
fontSize: 22,
color: "lightgray"
}
}));
const DividerWithText = ({ children }) => {
const classes = useStyles();
return (
<div className={classes.container}>
<div className={classes.border} />
<span className={classes.content}>{children}</span>
<div className={classes.border} />
</div>
);
};
export default DividerWithText;
您可以像下面这样导入和使用它
<DividerWithText>Or</DividerWithText>
结果
2022 年 3 月 29 日更新
现在可以使用 Material UI
https://mui.com/components/dividers/#dividers-with-text
有时您可能需要不同的间距
<Divider spacing={1}>Hello World</Divider>
或
<Divider spacing={2}>Hello World</Divider>
对于可配置的 spacing
这里是 Github Gist
如果您愿意,也可以在 codesandbox 中添加 playground
当前答案会导致中间有空格的任何文本换行:
如果发生这种情况,将 width: 100% 更改为 flexGrow: 1 应该可以解决问题:
border: {
borderBottom: "2px solid lightgray",
flexGrow: 1,
}
遗憾的是,目前在 MUI 中带有文本的 Divider
仅在 v5 中可用,它仍处于 alpha 阶段。如果您想尝试,可以下载 alpha 包,但请注意,它仍然非常不稳定,可能需要进行大量更改才能迁移到 v5,这不是很值得。
GitHub 讨论:https://github.com/mui-org/material-ui/issues/24036