Я пытаюсь создать боковое меню, которое принимает детей и отображает их. Боковое меню отображает дочерние элементы, но каждый дочерний элемент оборачивает все выходные данные рендеринга бокового меню. Я не могу найти способ остановить это.

Я пробовал без использования материального пользовательского интерфейса со стилями, но происходит то же самое.

Вот как он выводится с использованием базового рендеринга, используя return <div>{this.props.children}</div> или приведенный ниже код.

Выход инспектора

Код:

Главная страница

<SideMenu>
    <Tab id="Search" header="Search" icon={<SearchIcon />}>
        <p>Some text</p>
        <Foo />
    </Tab>
    <Tab  id="home" header="Home" icon={<SearchIcon />}>
        <h1>Some text again</h1>
        <Foo />
        <Bar />
    </Tab>
</SideMenu>

Боковое меню

import React from "react";
import PropTypes from "prop-types";

import {
  withStyles
} from "@material-ui/core";

import styles from "./styles";

class SideMenu extends React.Component {
  static propTypes = {
    classes: PropTypes.object.isRequired,
    children: PropTypes.any,
    // events
  };

  state = {

  }

  renderChildren(children) {
    return React.Children.map(children, p =>
      React.cloneElement(p, {})
    )
  }

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

    return (
      <div className={classes.sideMenuRoot}>
        <div className={classes.sideMenuTabPane}>
        </div>

        <div className={classes.sideMenuContent}>
          {this.renderChildren(children)}
        </div>
      </div>
    );
  }
}

export default withStyles(styles)(SideMenu);

Вкладка

import React from "react";
import PropTypes from "prop-types";

class Tab extends React.Component {
  static propTypes = {};

  state = {};

  render() {
    return null
  }
}

export default Tab;

0
Kennyist 29 Окт 2019 в 15:02
Я предполагаю, что ваш компонент Tab должен отображаться первым вместе со всеми реквизитами, такими как текст/значок или любые другие обратные вызовы. После этого вы можете просто вызвать props.children внутри вашего компонента sideMenu. Это не создаст никаких проблем.
 – 
Mohit
29 Окт 2019 в 15:57

1 ответ

Не думайте, что вам нужно сделать всю функцию renderChildren. Делал что-то подобное раньше, нужно только передать {детей}.

Главная страница:

<SideMenu>
    <Tab id="Search" header="Search" icon={<SearchIcon />} text="Some Text" />
    <Tab  id="home" header="Home" icon={<SearchIcon />} text="Some Text" />
</SideMenu>

Боковое меню:

import React from "react";
import PropTypes from "prop-types";

import {
  withStyles
} from "@material-ui/core";

import styles from "./styles";

class SideMenu extends React.Component {
  static propTypes = {
    classes: PropTypes.object.isRequired,
    children: PropTypes.any,
    // events
  };

  state = {

  }

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

    return (
      <div className={classes.sideMenuRoot}>
        <div className={classes.sideMenuTabPane}>
        </div>

        <div className={classes.sideMenuContent}>
          {children}
        </div>
      </div>
    );
  }
}

export default withStyles(styles)(SideMenu);

Tab:

import React from "react";
import PropTypes from "prop-types";

class Tab extends React.Component {
  static propTypes = {};

  state = {};

  render() {
    const { text } = this.props;
    return (
      <h1>{text}</h1>
    )
  }
}

export default Tab;
0
Akusas 29 Окт 2019 в 15:18
Я также пытаюсь передать других детей на каждую вкладку, а не только текст, к сожалению.
 – 
Kennyist
29 Окт 2019 в 16:17
Какие вещи? Будут ли все вкладки использовать их? Можно использовать имеющийся у вас компонент Tab и передавать им информацию, что может решить вашу проблему.
 – 
Akusas
29 Окт 2019 в 16:20