幻灯片Material-UI无法读取“未定义”的属性样式

时间:2019-10-08 07:39:52

标签: reactjs typescript material-ui

我最近在我的项目中实现了Material-UI Slide,并想问问是否有人可以向我解释为什么这样编写代码会起作用:

<div class="container" (mouseenter)="boxHide[3]=false" ...
    <div class="xyz" [hidden]="boxHide[3]">
        <button (click)="clickButton(3)">click me</button>

但是当我在幻灯片中移动section.map时无法编译。我还要为即将出现的部分设置动画。

{selectedItem && selectedItem.modal && selectedItem.modal.body ? (
    selectedItem.modal.body.map((section, key) => (
      <Section section={section} key={key} />
    ))
  ) : (
    <Slide
      direction={animate === 'stepIn' ? 'right' : 'left'}
      in={animate === 'idle'}
    >
      <Grid container={true} spacing={3}>
        {items.map((item, key) => (
          <Grid item={true} xs={6} md={4} lg={3} key={key}>
            <MaterialCard
              key={key}
              onClick={onCardClicked(item)}
              className={classes.card}
            >
              <CardActionArea className={classes.cardArea}>
                <CardMedia
                  image={item.image || undefined}
                  component="img"
                />

                <CardContent className={classes.cardContent}>
                  <Typography
                    component="p"
                    className={classes.cardContentTypographyHeader}
                  >
                    <Hyphenated language={de}>{item.label}</Hyphenated>
                  </Typography>

                  {item.description ? (
                    <Typography
                      component="p"
                      className={classes.cardContentTypography}
                    >
                      <Hyphenated language={de}>
                        {item.description}
                      </Hyphenated>
                    </Typography>
                  ) : null}
                </CardContent>
              </CardActionArea>

              {selectedItem && selectedItem.id === item.id ? (
                <>
                  <div className={classes.cardSelectedOverlay} />
                  <Done className={classes.cardSelectedOverlayIcon} />
                </>
              ) : null}
            </MaterialCard>
          </Grid>
        ))}
      </Grid>
    </Slide>

该代码适用于每张卡,但其中包含模态的卡除外。模态包含例如文字,文字输入。当我单击其中带有模态的卡片时,出现此错误:

Error Message

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

Slide's children prop的文档中,您可以找到:

  

单个子内容元素。

     

⚠️需要能够拥有裁判。

Slide uses React.cloneElement为单个孩子添加裁判和道具。如果有多个子级,或者如果children是一个数组(即使该数组仅包含一个子级),则Slide将得到您遇到的错误,因为未定义children.props且它是尝试引用children.props.style

下面是一个小例子,可以帮助您更好地了解错误原因:

import React from "react";
import ReactDOM from "react-dom";

const MockSlide = ({ children }) => {
  if (children.props) {
    return (
      <div>
        {children}
        children.props is defined
      </div>
    );
  }
  return (
    <div>
      {children}
      children.props is not defined
    </div>
  );
};
const sectionArray = [
  "An array also causes problems (even if only one element)"
];
function App() {
  return (
    <div className="App">
      <MockSlide>
        <div>Single child works fine</div>
      </MockSlide>
      <br />
      <br />
      <MockSlide>
        <div>Multiple children</div>
        <div>causes problems with Slide</div>
      </MockSlide>
      <br />
      <br />
      <MockSlide>
        {sectionArray.map(section => {
          return <div>{section}</div>;
        })}
      </MockSlide>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

Edit Slide single child requirement

一种可能的解决方案是将Slide中的所有内容包装在单个<div>元素中。