我想实现一个
<Select />
具有两个特征的组件。
-
我想隐藏窗体控件。如图1所示。我现在通过使用
display: 'none'
.
CodeSandbox Demo
-
我想让选择菜单直接出现在打开菜单的按钮下面。如图2所示。目前,它似乎完全位于窗口的左上角。
CodeSandbox Demo
如何实现这两个功能?(答案的代码沙盒演示将非常有用。)
图1。
https://codesandbox.io/s/j7xr2wmw7v
import React from "react";
import PropTypes from "prop-types";
import { withStyles } from "@material-ui/core/styles";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import Select from "@material-ui/core/Select";
import Button from "@material-ui/core/Button";
const styles = theme => ({
button: {
display: "block",
marginTop: theme.spacing.unit * 30
},
formControl: {
margin: theme.spacing.unit,
minWidth: 120,
display: "none"
}
});
class ControlledOpenSelect extends React.Component {
state = {
age: "",
open: false
};
handleChange = event => {
this.setState({ [event.target.name]: event.target.value });
};
handleClose = () => {
this.setState({ open: false });
};
handleOpen = () => {
this.setState({ open: true });
};
render() {
const { classes } = this.props;
return (
<form autoComplete="off">
<Button className={classes.button} onClick={this.handleOpen}>
Open the select
</Button>
<FormControl hidden className={classes.formControl}>
<InputLabel htmlFor="demo-controlled-open-select">Age</InputLabel>
<Select
open={this.state.open}
onClose={this.handleClose}
onOpen={this.handleOpen}
value={this.state.age}
onChange={this.handleChange}
inputProps={{
name: "age",
id: "demo-controlled-open-select"
}}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</form>
);
}
}
ControlledOpenSelect.propTypes = {
classes: PropTypes.object.isRequired
};
export default withStyles(styles)(ControlledOpenSelect);
图2。
下拉选择菜单显示在按钮的正下方
https://codesandbox.io/s/l4k8p7zxjq
import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import InputLabel from '@material-ui/core/InputLabel';
import MenuItem from '@material-ui/core/MenuItem';
import FormControl from '@material-ui/core/FormControl';
import Select from '@material-ui/core/Select';
import Button from '@material-ui/core/Button';
const styles = theme => ({
button: {
display: 'block',
marginTop: theme.spacing.unit * 2,
},
formControl: {
margin: theme.spacing.unit,
minWidth: 120,
},
});
class ControlledOpenSelect extends React.Component {
state = {
age: '',
open: false,
};
handleChange = event => {
this.setState({ [event.target.name]: event.target.value });
};
handleClose = () => {
this.setState({ open: false });
};
handleOpen = () => {
this.setState({ open: true });
};
render() {
const { classes } = this.props;
return (
<form autoComplete="off">
<Button className={classes.button} onClick={this.handleOpen}>
Open the select
</Button>
<FormControl className={classes.formControl}>
<InputLabel htmlFor="demo-controlled-open-select">Age</InputLabel>
<Select
open={this.state.open}
onClose={this.handleClose}
onOpen={this.handleOpen}
value={this.state.age}
onChange={this.handleChange}
inputProps={{
name: 'age',
id: 'demo-controlled-open-select',
}}
>
<MenuItem value="">
<em>None</em>
</MenuItem>
<MenuItem value={10}>Ten</MenuItem>
<MenuItem value={20}>Twenty</MenuItem>
<MenuItem value={30}>Thirty</MenuItem>
</Select>
</FormControl>
</form>
);
}
}
ControlledOpenSelect.propTypes = {
classes: PropTypes.object.isRequired,
};
export default withStyles(styles)(ControlledOpenSelect);