使用Material-UI库反应渲染问题

时间:2019-12-31 03:49:53

标签: javascript reactjs material-ui

我在使用React材质库时遇到了问题。我的卡片是垂直呈现的,而不是水平并排呈现的。我试图弄乱react grid组件,但没有帮助。

输出: enter image description here

预期: enter image description here

以下是完美并排呈现卡片的原始代码:https://github.com/acm-uic/roll-call/blob/feature/home-page/src/App.tsx

  return (
    <React.Fragment>
      <CssBaseline />
      <AppBar position="relative">
        <Toolbar>
          <Typography variant="h6" color="inherit" noWrap>
            ACM Roll Call
          </Typography>
        </Toolbar>
      </AppBar>
      <main>
        {/* Hero unit */}
        <div className={classes.heroContent}>
          <Container maxWidth="sm">
            <Typography component="h1" variant="h2" align="center" color="textPrimary" gutterBottom>
              ACM Roll Call
            </Typography>
            <Typography variant="h5" align="center" color="textSecondary" paragraph>
            The Association for Computing Machinery Student Chapter at the University of Illinois at Chicago (ACM@UIC) is a community for all UIC students interested in computing, computing machinery and related technologies.
            </Typography>

          </Container>
        </div>
        <Container className={classes.cardGrid} maxWidth="md">
          {/* End hero unit */}
          <Grid container spacing={4}>
            {cards.map(card => (
              <Grid item key={card} xs={12} sm={6} md={4}>
                <Card className={classes.card} raised>
                  <CardMedia
                    className={classes.cardMedia}
                    image="https://avatars3.githubusercontent.com/u/20177515?s=280&v=4"
                    title="Image title"
                  />
                  <CardContent className={classes.cardContent}>
                    <Typography gutterBottom variant="h5" component="h2">
                      Event Name
                    </Typography>
                    <Typography>
                      This is a media card. You can use this section to describe the content.
                    </Typography>
                  </CardContent>
                  <CardActions>
                    <Button size="small" color="primary">
                      View
                    </Button>
                    <Button size="small" color="primary">
                      Edit
                    </Button>
                  </CardActions>
                </Card>
              </Grid>
            ))}
          </Grid>
        </Container>
      </main>
      {/* Footer */}
      <footer className={classes.footer}>
        <Typography variant="h6" align="center" gutterBottom>
          ACM Roll Call
        </Typography>
        <Typography variant="subtitle1" align="center" color="textSecondary" component="p">
          Attendance tracking for events and meetings
        </Typography>
      </footer>
      {/* End footer */}
    </React.Fragment>
  );

我修改了原始代码,因为我必须获取卡的数据。这是两个单独文件(Event.tsx和Events.tsx)中的修改版本:https://github.com/acm-uic/roll-call/tree/feature/printEvents/src/components

return (



<React.Fragment>
<CssBaseline />

  <Container className={classes.cardGrid} maxWidth="md">
    {/* End hero unit */}
    <Grid container spacing={4}>
      {cards.map(card => (
        <Grid item key={card} xs={12} sm={6} md={4}>
          <Card className={classes.card} raised>
            <CardMedia
              className={classes.cardMedia}
              image="https://avatars3.githubusercontent.com/u/20177515?s=280&v=4"
              title="Image title"
            />
            <CardContent className={classes.cardContent}>
              <Typography gutterBottom variant="h5" component="h2">

              {summary ? summary : 'Busy'}

              </Typography>
              <Typography>

        <div>  
            {start ? (start.dateTime ? start.dateTime : start.date) : <></>} | {end ? (end.dateTime ? end.dateTime : end.date) : <></>} | {location}
        </div>

              </Typography>
            </CardContent>
            <CardActions>
              <Button size="small" color="primary">

                
                View
              </Button>
              <Button size="small" color="primary">
                Edit
              </Button>
            </CardActions>
          </Card>
        </Grid>
      ))}
    </Grid>
  </Container>


</React.Fragment>
    );

2 个答案:

答案 0 :(得分:1)

您可以在网格上使用MUI的自动布局功能来帮助您自定义卡片渲染。

import React from 'react';
import { Grid } from '@material-ui/core';
import CardData from 'path to get your data'; // Data must be an array 

export default const Main = props => {
    return (
        <Grid container direction="row" justify="center" alignItems="center" spacing={3}>
            {
                CardData.map(data => (
                    <Grid item xs sm md lg key={data.key}>
                        <CustomCard data={data} />
                    </Grid>
                ))
            }
        </Grid>
    );
}

通过仅提供属性xs,md,sm,lg和xl而不进行编号,MUI会在同一行中为您尽可能平等地进行堆叠。因此,您需要做的就是调整卡片内容的大小,以允许在同一行中放置多个卡片。

答案 1 :(得分:0)

我下载了您的仓库并在我的机器上运行。它仅呈现AppBar,所以请让我知道如何获取要显示的数据。但是,我也查看了代码,发现一件事。 我们正在像这样遍历事件和渲染组件:

 {(this.state.events && this.state.events.items)
    ? this.state.events.items.map((ev, key) =>
        (<Event key={key} ev={ev} />)) //render material card for each event
    : (<></>)}

但是<Container /> and <Grid />组件是从<Event />组件渲染的。这意味着事件卡将包含在其自己的容器和网格中。我认为,这可能是导致此问题的原因。 如果我们将容器和网格从Event.tsx中拉出并放入Events.tsx内,则可能会对其进行修复。

例如

<Container>
<Grid ..>
this.state.events.items.map((ev, key) =>
            (<Event key={key} ev={ev} />)) //render material card for each event
        : (<></>)}
</Grid .. />
<Container />
相关问题