Пользовательский интерфейс материала слайда не может прочитать стиль свойства "undefined" - PullRequest
1 голос
/ 08 октября 2019

Я недавно внедрил Material-UI Slide в свой проект и хотел спросить, может ли кто-нибудь объяснить мне, почему код работает, когда я пишу так:

{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>

Но не удается скомпилировать, когда япереместите файл section.map внутри слайда. Я хочу анимировать секцию, которая появится.

<Slide
    direction={animate === 'stepIn' ? 'right' : 'left'}
    in={animate === 'idle'}
  >
    {selectedItem && selectedItem.modal && selectedItem.modal.body ? (
      selectedItem.modal.body.map((section, key) => (
        <Section section={section} key={key} />
      ))
    ) : (
      <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 Ответ

1 голос
/ 08 октября 2019

В документации для дочерней опоры Slide вы можете найти:

Один дочерний элемент содержимого.

⚠️ Требуется иметь возможность хранить ссылку.

Slide использует 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> элемент.

...