代码之家  ›  专栏  ›  技术社区  ›  Let Me Tink About It

如何在React中使选择菜单相对于控制器按钮的位置?

  •  2
  • Let Me Tink About It  · 技术社区  · 7 年前

    我想实现一个 <Select /> 具有两个特征的组件。

    1. 我想隐藏窗体控件。如图1所示。我现在通过使用 display: 'none' . CodeSandbox Demo

    2. 我想让选择菜单直接出现在打开菜单的按钮下面。如图2所示。目前,它似乎完全位于窗口的左上角。 CodeSandbox Demo

    如何实现这两个功能?(答案的代码沙盒演示将非常有用。)

    图1。

    **Fig. 1.** Form control is hidden

    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。 下拉选择菜单显示在按钮的正下方

     **Fig. 2.** Dropdown select menu appears directly beneath button

    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);
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   derelict    7 年前

    而不是

    display: "none"
    

    尝试

    visibility: "hidden",
    width:'0',
    height:'0'