我想将一些TextFields包装在一个概述的容器中,我发现了这个answer。我想要的这项工作:
但是当我在一个内部文本字段中单击时,所有的texfields都被聚焦了:
这是我的代码:
import React from "react";
import ReactDOM from "react-dom";
import OutlinedDiv from "./OutlinedDiv";
import TextField from "@material-ui/core/TextField";
import Grid from "@material-ui/core/Grid";
function App() {
return (
<div className="App">
<OutlinedDiv label="DIV">
<Grid container justify="center" alignItems="center" spacing={3}>
<Grid item sm={4} xs={12}>
<TextField label="Text1" variant="outlined" />
</Grid>
<Grid item sm={4} xs={12}>
<TextField label="Text2" variant="outlined" />
</Grid>
<Grid item sm={4} xs={12}>
<TextField label="Text3" variant="outlined" />
</Grid>
<Grid item sm={4} xs={12}>
<TextField label="Text4" variant="outlined" />
</Grid>
<Grid item sm={4} xs={12}>
<TextField label="Text5" variant="outlined" />
</Grid>
<Grid item sm={4} xs={12}>
<TextField label="Text6" variant="outlined" />
</Grid>
</Grid>
</OutlinedDiv>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
我如何才能获得这种样式,并且在内部组件中单击时仅聚焦所选组件?
欢迎您对其他方法做出回应,并对div概述使用类似的解决方案。
谢谢。
答案 0 :(得分:2)
以下是一种不利用TextField
或FormControl
的方法,因此可以安全地用于包装其他输入。这将从OutlinedInput和InputLabel styles applied when within a FormControl中复制一些样式。
import React from "react";
import ReactDOM from "react-dom";
import InputLabel from "@material-ui/core/InputLabel";
import NotchedOutline from "@material-ui/core/OutlinedInput/NotchedOutline";
import { withStyles } from "@material-ui/core/styles";
const styles = {
root: {
position: "relative"
},
content: {
padding: "18.5px 14px"
},
inputLabel: {
position: "absolute",
left: 0,
top: 0,
// slight alteration to spec spacing to match visual spec result
transform: "translate(0, 24px) scale(1)"
}
};
const LabelledOutline = ({ classes, id, label, children }) => {
const [labelWidth, setLabelWidth] = React.useState(0);
const labelRef = React.useRef(null);
React.useEffect(() => {
const labelNode = ReactDOM.findDOMNode(labelRef.current);
setLabelWidth(labelNode != null ? labelNode.offsetWidth : 0);
}, [label]);
return (
<div style={{ position: "relative", marginTop: "8px" }}>
<InputLabel
ref={labelRef}
htmlFor={id}
variant="outlined"
className={classes.inputLabel}
shrink
>
{label}
</InputLabel>
<div className={classes.root}>
<div id={id} className={classes.content}>
{children}
<NotchedOutline notched labelWidth={labelWidth} />
</div>
</div>
</div>
);
};
export default withStyles(styles)(LabelledOutline);