【问题标题】:Component Alignment using Material-ui使用 Material-ui 进行组件对齐
【发布时间】:2020-11-03 20:13:03
【问题描述】:

m从反应开始,我正在使用材料 - ui来构建形式,我无法解决组件中的对齐细节,因为表单有很多字段,它会有点“凌乱”,所以我想看看它是否改善了组件的对齐方式。

细节是当有 2 列(xs = 1 和 xs = 5 - “6 列”)时,它不会给出与下面的行相同的对齐方式,当还有 2 两列时(xs = 2 和 xs = 4 - “6列”)。

我找到的最接近的研究是在这个链接上,但我仍然无法正确了解这个细节。

How do I layout forms in MaterialUI?

下面是项目代码的 sn-p 和打印,试图更好地说明问题。

 [return (
        <Form onSubmit={handleSubmit}>
            <Card className={classes.root}>
                <CardContent>
                    <Grid container alignContent='stretch' spacing={0}> {/*Início Primeiro Container ( Linha )*/}
                        <Grid item xs={1}>
                            <Controls.Input
                                name="conCodigo"
                                label="Código"
                                size={sizeBox}
                                value={values.conCodigo}
                                onChange={handleInputChange}
                            />
                        </Grid>
                        <Grid item xs={5}>
                            <Controls.Input
                                name="conNome"
                                label="Nome Contribuinte"
                                size={sizeBox}
                                value={values.conNome}
                                onChange={handleInputChange}
                                error={errors.conNome}
                            />
                        </Grid>

                        <Grid item xs={2}>
                            <Controls.Input
                                label="Fone 1"
                                name="conFone1"
                                size={sizeBox}
                                value={values.conFone1}
                                onChange={handleInputChange}
                                error={errors.conFone1}
                            />
                        </Grid>

                        <Grid item xs={2}>
                            <Controls.Input
                                label="Fone 2"
                                name="conFone2"
                                size={sizeBox}
                                value={values.conFone2}
                                onChange={handleInputChange}
                            />
                        </Grid>

                        <Grid item xs={2}>
                            <Controls.Input
                                label="Fone 3"
                                name="conFone3"
                                size={sizeBox}
                                value={values.conFone3}
                                onChange={handleInputChange}
                            />
                        </Grid>
                    </Grid> {/*Fim Primeiro Container */}
                    <Grid container alignContent='stretch' spacing={0}> 
                        <Grid item xs={4}>
                            <Controls.Input
                                label="Contato"
                                name="conContato"
                                size={sizeBox}
                                value={values.conContato}
                                onChange={handleInputChange}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                label="Fís./Jur."
                                name="conFisJur"
                                value={values.conFisJur}
                                onChange={handleInputChange}
                                options={contribuinteService.getFisJur()}
                            />
                        </Grid>
                        <Grid item xs={4}>
                            <Controls.Input
                                label="CPF/CNPJ"
                                name="conCpfCnpj"
                                size={sizeBox}
                                value={values.conCpfCnpj}
                                onChange={handleInputChange}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Input
                                label="Teste"
                                name="conCpfCnpj"
                                size={sizeBox}
                                value={values.conCpfCnpj}
                                onChange={handleInputChange}
                            />
                        </Grid>
                    </Grid>
                </CardContent>
            </Card>
            <Card className={classes.root}>
                <CardContent>
                    <Grid container> {/*Início Segundo Container */}
                        <Grid item xs={6}>
                            <Controls.Input
                                label="E-mail"
                                name="conEmail"
                                size={sizeBox}
                                value={values.conEmail}
                                onChange={handleInputChange}
                                error={errors.conEmail}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                name="conTipoDoac"
                                label="Tipo Doação"
                                size={sizeBox}
                                value={values.conTipoDoac}
                                onChange={handleInputChange}
                                options={contribuinteService.getTipoDoacao()}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                name="conCategoria"
                                label="Categoria"
                                size={sizeBox}
                                value={values.conCategoria}
                                onChange={handleInputChange}
                                options={contribuinteService.getCategoria()}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                name="conSexo"
                                label="Sexo"
                                size={sizeBox}
                                value={values.conSexo}
                                onChange={handleInputChange}
                                options={contribuinteService.getGenero()}
                            />
                        </Grid>
                    </Grid> {/*Fim Segundo Container */}
                </CardContent>
            </Card>]

... [1][1]:https://i.stack.imgur.com/nyWOm.png

【问题讨论】:

  • 屏幕插图中的图片贴错了,需要复制链接才能查看,抱歉英文,我用谷歌翻译写...

标签: reactjs material-ui


【解决方案1】:

您需要为您添加间距grid container 使您的列在布局中均匀。我看到你有 3 grid container 复制下面的代码,这应该可以修复布局。

 <Grid container alignContent='stretch' spacing={1}>
 <Grid container alignContent='stretch' spacing={1}> 
 <Grid container alignContent='stretch' spacing={1}>

【讨论】:

  • 感谢您的反馈,我之前也尝试过这种方式(使用 alignContent = 'stretch'),但不幸的是它与上一张图片中显示的相同,在此链接中:@987654321 @
  • 是的,该行如下所示:
  • 确保将&lt;Grid container alignContent='stretch' spacing={1}&gt;这一行添加到所有容器中。并在表单&lt;Form onSubmit={handleSubmit}&gt; 之前添加&lt;Container component="main" maxWidth="xl"&gt; 并在表单关闭标记&lt;/Container&gt; 之后关闭它们。
  • 好的,我今天就到此为止,明天我要做这个调整,非常感谢你的帮助。
【解决方案2】:

复制以下代码,然后重试。谢谢

[return (
      <Container component="main" maxWidth="xl">
   <Form onSubmit={handleSubmit}>
        <Card className={classes.root}>
            <CardContent>
                <Grid container alignContent='stretch' spacing={1}> {/*Início Primeiro Container ( Linha )*/}
                    <Grid item xs={1}>
                        <Controls.Input
                            name="conCodigo"
                            label="Código"
                            size={sizeBox}
                            value={values.conCodigo}
                            onChange={handleInputChange}
                        />
                    </Grid>
                    <Grid item xs={5}>
                        <Controls.Input
                            name="conNome"
                            label="Nome Contribuinte"
                            size={sizeBox}
                            value={values.conNome}
                            onChange={handleInputChange}
                            error={errors.conNome}
                        />
                    </Grid>

                    <Grid item xs={2}>
                        <Controls.Input
                            label="Fone 1"
                            name="conFone1"
                            size={sizeBox}
                            value={values.conFone1}
                            onChange={handleInputChange}
                            error={errors.conFone1}
                        />
                    </Grid>

                    <Grid item xs={2}>
                        <Controls.Input
                            label="Fone 2"
                            name="conFone2"
                            size={sizeBox}
                            value={values.conFone2}
                            onChange={handleInputChange}
                        />
                    </Grid>

                    <Grid item xs={2}>
                        <Controls.Input
                            label="Fone 3"
                            name="conFone3"
                            size={sizeBox}
                            value={values.conFone3}
                            onChange={handleInputChange}
                        />
                    </Grid>
                </Grid> {/*Fim Primeiro Container */}
                <Grid container alignContent='stretch' spacing={1}> 
                    <Grid item xs={4}>
                        <Controls.Input
                            label="Contato"
                            name="conContato"
                            size={sizeBox}
                            value={values.conContato}
                            onChange={handleInputChange}
                        />
                    </Grid>
                    <Grid item xs={2}>
                        <Controls.Select
                            label="Fís./Jur."
                            name="conFisJur"
                            value={values.conFisJur}
                            onChange={handleInputChange}
                            options={contribuinteService.getFisJur()}
                        />
                    </Grid>
                    <Grid item xs={4}>
                        <Controls.Input
                            label="CPF/CNPJ"
                            name="conCpfCnpj"
                            size={sizeBox}
                            value={values.conCpfCnpj}
                            onChange={handleInputChange}
                        />
                    </Grid>
                    <Grid item xs={2}>
                        <Controls.Input
                            label="Teste"
                            name="conCpfCnpj"
                            size={sizeBox}
                            value={values.conCpfCnpj}
                            onChange={handleInputChange}
                        />
                    </Grid>
                </Grid>
            </CardContent>
        </Card>
        <Card className={classes.root}>
            <CardContent>
                <Grid container alignContent='stretch' spacing={1}> {/*Início Segundo Container */}
                    <Grid item xs={6}>
                        <Controls.Input
                            label="E-mail"
                            name="conEmail"
                            size={sizeBox}
                            value={values.conEmail}
                            onChange={handleInputChange}
                            error={errors.conEmail}
                        />
                    </Grid>
                    <Grid item xs={2}>
                        <Controls.Select
                            name="conTipoDoac"
                            label="Tipo Doação"
                            size={sizeBox}
                            value={values.conTipoDoac}
                            onChange={handleInputChange}
                            options={contribuinteService.getTipoDoacao()}
                        />
                    </Grid>
                    <Grid item xs={2}>
                        <Controls.Select
                            name="conCategoria"
                            label="Categoria"
                            size={sizeBox}
                            value={values.conCategoria}
                            onChange={handleInputChange}
                            options={contribuinteService.getCategoria()}
                        />
                    </Grid>
                    <Grid item xs={2}>
                        <Controls.Select
                            name="conSexo"
                            label="Sexo"
                            size={sizeBox}
                            value={values.conSexo}
                            onChange={handleInputChange}
                            options={contribuinteService.getGenero()}
                        />
                    </Grid>
                </Grid> {/*Fim Segundo Container */}
            </CardContent>
        </Card>
       </Form>
      </Container>
)

【讨论】:

  • 我按照你说的做了,现在表现出来了,但他还是“固执”,(笑)他还是一样。我把 Form:
    ...
  • 最后我正常关闭了容器标签:
  • 太好了,很高兴这为您解决了问题。您介意通过单击向上箭头并标记它来支持我的解决方案吗?谢谢
  • 你好,很高兴能够为分数做出贡献,但是由于我在这里发的不多,所以我的分数很低,从我看到的消息来看,它们是有效的,但他们不会公开反映。
  • 但是尽管努力到现在,Layout内部还没有一定的对齐,我会简化程序,这样解决起来比较容易,我认为这很重要,它将来也会对某人有用。
【解决方案3】:

最后对齐工作了,问题是它有一个额外的布局,用于“级联”。在 100% 之前是 90%,所以它没有对齐,即使正确调整了布局,如上一个答案所示。

const useStyles = makeStyles(theme => ({
    root: {
        '& .MuiFormControl-root': {
            width: '100%',
            margin: theme.spacing(0)
        }
    },
}))

我将把代码留在这里,以便其他遇到问题的人有用。

由 3 个单独的文件组成以构成整个布局

模态:

import React from 'react'
import { Dialog, DialogTitle, DialogContent, makeStyles, Typography } from '@material-ui/core';
import Controls from "./controls/Controls";
import CloseIcon from '@material-ui/icons/Close';

const useStyles = makeStyles(theme => ({
    dialogWrapper: {
        padding: theme.spacing(0),
        position: 'absolute',
        top: theme.spacing(0)
    },
    dialogTitle: {
        paddingRight: '0px'
    }
}))

export default function Modal(props) {

    const { title, widthForm, children, openModal, setOpenModal } = props;
    const classes = useStyles();

    return (
        <Dialog open={openModal} maxWidth={widthForm} classes={{ paper: classes.dialogWrapper }}>
            <DialogTitle className={classes.dialogTitle}>
                <div style={{ display: 'flex' }}>
                    <Typography variant="h6" component="div" style={{ flexGrow: 1 }}>
                        {title}
                    </Typography>
                    <Controls.ActionButton
                        color="secondary"
                        onClick={()=>{setOpenModal(false)}}>
                        <CloseIcon />
                    </Controls.ActionButton>
                </div>
            </DialogTitle>
            <DialogContent dividers>
                {children}
            </DialogContent>
        </Dialog>
    )
}

使用表单:

import React, { useState } from 'react'
import { makeStyles } from "@material-ui/core";

export function useForm(initialFValues, validateOnChange = false, validate) {
    const [values, setValues] = useState(initialFValues);
    const [errors, setErrors] = useState({});

    const handleInputChange = e => {
        const { name, value } = e.target
        setValues({
            ...values,
            [name]: value
        })
        if (validateOnChange)
            validate({ [name]: value })
    }

    const resetForm = () => {
        setValues(initialFValues);
        setErrors({})
    }

    return {
        values,
        setValues,
        errors,
        setErrors,
        handleInputChange,
        resetForm

    }
}

const useStyles = makeStyles(theme => ({
    root: {
        '& .MuiFormControl-root': {
            width: '100%',
            margin: theme.spacing(0)
        }
    },
}))

export function Form(props) {

    const classes = useStyles();
    const { children, ...other } = props;
    return (
        <form className={classes.root} autoComplete="off" {...other}>
            {props.children}
        </form>
    )
}

以及带有字段本身的表单:

import React, { useState, useEffect, Divider } from 'react'
import { Grid, Container, FormGroup } from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
import Card from '@material-ui/core/Card';
import CardContent from '@material-ui/core/CardContent';
import CardActions from '@material-ui/core/CardActions';
import Controls from "../../components/controls/Controls";
import { useForm, Form } from '../../components/useForm';
import * as contribuinteService from "../../services/ContribuinteService";

const useStyles = makeStyles({
    root: {
      marginBottom: 5
    },
    bullet: {
      display: 'inline-block',
      margin: '0 2px',
      transform: 'scale(0.8)',
    },
    title: {
      fontSize: 14,
    },
    pos: {
      marginBottom: 12,
    },
    menuPaper: {
        maxHeight: 50
    }
  });

const initialFValues = {
    id: 0,
    conCodigo: '',
    conNome: '',
    conFone1: '',
    conFone2: '',
    conFone3: '',
    conEmail: '',
    conSexo: '',
    conTipoDoac: '',
    conCategoria: ''
}

export default function ContribuinteForm(props) {
    const { addOrEdit, recordForEdit, setOpenModal, sizeBox } = props
    const classes = useStyles();

    const validate = (fieldValues = values) => {
        let temp = { ...errors }
        if ('conNome' in fieldValues)
            temp.conNome = fieldValues.conNome ? "" : "O Nome é Obrigatório!"
        if ('conEmail' in fieldValues)
            temp.conEmail = (/$^|.+@.+..+/).test(fieldValues.conEmail) ? "" : "E-mail não é Válido."
        if ('conFone1' in fieldValues)
            temp.conFone1 = fieldValues.conFone1.length > 8 ? "" : "Mínimo 9 Dig requerido."
        setErrors({
            ...temp
        })

        if (fieldValues == values)
            return Object.values(temp).every(x => x == "")
    }

    const {
        values,
        setValues,
        errors,
        setErrors,
        handleInputChange,
        resetForm
    } = useForm(initialFValues, true, validate);

    const handleSubmit = e => {
        e.preventDefault()
        if (validate()) {
            addOrEdit(values, resetForm);
        }
    }

    useEffect(() => {
        if (recordForEdit != null)
            setValues({
                ...recordForEdit
            })
    }, [recordForEdit])

    return (
        <Form onSubmit={handleSubmit}>
            <Card className={classes.root}>
                <CardContent>
                    {/*Início Primeiro Container ( Linha )*/}
                    <Grid container alignContent='stretch' spacing={1}> 
                        <Grid item xs={1}>
                            <Controls.Input
                                name="conCodigo"
                                label="Código"
                                size={sizeBox}
                                value={values.conCodigo}
                                onChange={handleInputChange}
                            />
                        </Grid>
                        <Grid item xs={5}>
                            <Controls.Input
                                name="conNome"
                                label="Nome Contribuinte"
                                size={sizeBox}
                                value={values.conNome}
                                onChange={handleInputChange}
                                error={errors.conNome}
                            />
                        </Grid>

                        <Grid item xs={2}>
                            <Controls.Input
                                label="Fone 1"
                                name="conFone1"
                                size={sizeBox}
                                value={values.conFone1}
                                onChange={handleInputChange}
                                error={errors.conFone1}
                            />
                        </Grid>

                        <Grid item xs={2}>
                            <Controls.Input
                                label="Fone 2"
                                name="conFone2"
                                size={sizeBox}
                                value={values.conFone2}
                                onChange={handleInputChange}
                            />
                        </Grid>

                        <Grid item xs={2}>
                            <Controls.Input
                                label="Fone 3"
                                name="conFone3"
                                size={sizeBox}
                                value={values.conFone3}
                                onChange={handleInputChange}
                            />
                        </Grid>
                    </Grid> {/*Fim Primeiro Container */}
                    <Grid container alignContent='stretch' spacing={1}> 
                        <Grid item xs={4}>
                            <Controls.Input
                                label="Contato"
                                name="conContato"
                                size={sizeBox}
                                value={values.conContato}
                                onChange={handleInputChange}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                label="Fís./Jur."
                                name="conFisJur"
                                value={values.conFisJur}
                                onChange={handleInputChange}
                                options={contribuinteService.getFisJur()}
                            />
                        </Grid>
                        <Grid item xs={4}>
                            <Controls.Input
                                label="CPF/CNPJ"
                                name="conCpfCnpj"
                                size={sizeBox}
                                value={values.conCpfCnpj}
                                onChange={handleInputChange}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Input
                                label="Teste"
                                name="conCpfCnpj"
                                size={sizeBox}
                                value={values.conCpfCnpj}
                                onChange={handleInputChange}
                            />
                        </Grid>
                    </Grid>
                </CardContent>
            </Card>
            <Card className={classes.root}>
                <CardContent>
                    <Grid container alignContent='stretch' spacing={1}> {/*Início Segundo Container */}
                        <Grid item xs={6}>
                            <Controls.Input
                                label="E-mail"
                                name="conEmail"
                                size={sizeBox}
                                value={values.conEmail}
                                onChange={handleInputChange}
                                error={errors.conEmail}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                name="conTipoDoac"
                                label="Tipo Doação"
                                size={sizeBox}
                                value={values.conTipoDoac}
                                onChange={handleInputChange}
                                options={contribuinteService.getTipoDoacao()}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                name="conCategoria"
                                label="Categoria"
                                size={sizeBox}
                                value={values.conCategoria}
                                onChange={handleInputChange}
                                options={contribuinteService.getCategoria()}
                            />
                        </Grid>
                        <Grid item xs={2}>
                            <Controls.Select
                                name="conSexo"
                                label="Sexo"
                                size={sizeBox}
                                value={values.conSexo}
                                onChange={handleInputChange}
                                options={contribuinteService.getGenero()}
                            />
                        </Grid>
                    </Grid> {/*Fim Segundo Container */}
                </CardContent>
            </Card>
            <Card className={classes.root}>
                <CardContent>
                    <Grid container alignContent='stretch' spacing={1}>
                        <Grid item lg={12}>
                            <TextField id="standard-basic2" label="Observação 1" />
                        </Grid>
                    </Grid>
                    <Grid container alignContent='stretch' spacing={1}>
                        <Grid item lg={12}>
                            <TextField id="standard-basic2" label="Observação 2" />
                        </Grid>
                    </Grid>
                </CardContent>
            </Card>   
            <Card className={classes.root}>
                <CardActions>
                    <Grid container alignContent='stretch' spacing={1}> {/*Início Terceiro Container */}
                        <Grid item xs={12}>
                            <div>
                                <Controls.Button
                                    type="submit"
                                    text="Salvar" 
                                />
                                <Controls.Button
                                    text="Sair"
                                    color="default"
                                    onClick={()=>{setOpenModal(false)}}
                                />
                            </div>
                        </Grid>
                    </Grid> {/*Fim Terceiro Container */}
                </CardActions>
            </Card>
        </Form>
    )
}

最后是调整后屏幕的打印效果,非常感谢! enter image description here

【讨论】:

    猜你喜欢
    • 2016-03-22
    • 2023-04-01
    • 2020-05-06
    • 2021-01-29
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多