Как мне создать форму с 2 столбцами с помощью React Material-UI?

#reactjs #material-ui

#reactjs #material-ui

Вопрос:

Я создаю форму react с помощью material-ui.

Я бы хотел, чтобы форма представляла собой фиксированный вид с 2 столбцами, а не поток, основанный на размере браузера, чтобы он всегда был таким:

 |First Name      |Last Name|
|Street Address  |City     |
  

И не заканчивается так

 |First Name      |Last Name|  Street Address  |City     |
  

https://codesandbox.io/s/0q7kw76nyl

 import React from "react";
import PropTypes from "prop-types";
import { withStyles } from "@material-ui/core/styles";
import TextField from "@material-ui/core/TextField";

const styles = theme => ({
  textField: {
    marginLeft: theme.spacing.unit,
    marginRight: theme.spacing.unit
  }
});

class TextFields extends React.Component {
  state = {
    firstName: "",
    lastName: "",
    street: "",
    city: ""
  };

  handleChange = name => event => {
    this.setState({ [name]: event.target.value });
  };

  render() {
    const { classes } = this.props;

    return (
      <form className={classes.container} noValidate autoComplete="off">
        <TextField
          id="first-name"
          label="First Name"
          className={classes.textField}
          value={this.state.firstName}
          onChange={this.handleChange("firstName")}
          margin="normal"
        />

        <TextField
          id="last-name"
          label="Last Name"
          className={classes.textField}
          value={this.state.lastName}
          onChange={this.handleChange("lastName")}
          margin="normal"
        />

        <TextField
          id="address-street"
          label="Street Address"
          className={classes.textField}
          value={this.state.street}
          onChange={this.handleChange("street")}
          margin="normal"
        />

        <TextField
          id="address-city"
          label="City"
          className={classes.textField}
          value={this.state.city}
          onChange={this.handleChange("city")}
          margin="normal"
        />
      </form>
    );
  }
}

TextFields.propTypes = {
  classes: PropTypes.object.isRequired
};

export default withStyles(styles)(TextFields);
  

Ответ №1:

Как и выше, вставка в divs отлично работает.

Вы также можете поместить их в макет сетки для дополнительной настройки.

Макет сетки имеет некоторые дополнительные функции, такие как интервал и выравнивание элементов, настраиваемая ширина элементов, вот документация.

 import Grid from '@material-ui/core/Grid'
<Grid container>
     <Grid item xs={6}> 
         ... 
     </Grid>
     <Grid item xs={6}>
         ...
     </Grid>
</Grid>
  

Ответ №2:

Вы можете использовать как контейнер сетки, так и элемент одновременно.

 <Grid container spacing={2} >
  <Grid container item xs={6} direction="column" >
    <TextField />
    <TextField />
    <TextField />
  </Grid>
  <Grid container item xs={6} direction="column" >
    <TextField />
    <TextField />
  </Grid>
</Grid>
  

Ответ №3:

Попробуйте разделить две группы на разделы следующим образом:

https://codesandbox.io/s/vy6k6w1jq3

 <div>
 <TextField/>
 <TextField/>
</div>
<div>
 <TextField/>
 <TextField/>
</div>
  

Комментарии:

1. Это выглядит чище и проще и работает в изолированной среде, но, как ни странно, по какой-то причине не остается неизменным на более сложной странице (они становятся вертикальными группами вместо горизонтальных!). Поэтому мне придется использовать сетки.

2. @opticyclic да, я надеялся, что более простого решения будет достаточно. Grid / Flexbox справились бы с задачей