@Masterstvo

Как динамически добавить компонент в React?

Добрый день!

Уважаемые знатоки, подскажите пожалуйста каким образом можно динамически добавить React-компонент?

Скажем, стоит событие onclick на компоненте или его потомках. Нужно добавить новый компонент дочерним элементом в уже существующий компонент. appendChild не подходит, так как используется JSX и эта функция не может принимать объект в качестве аргумента. То есть, нужно по сути описать функцию appChild в примере ниже, ну или решить это как то еще!

Буду благодарен за помощь!

import React from 'react';
import ReactDOM from 'react-dom';
import Month from './Month';
import Content from './Content';

function appChild(){

}

ReactDOM.render(
        <div>
            <Month />
                   <div onClick='this.appChild.bind(this)'></div>
            <Content />
        </div>,
  document.getElementById('root')
);
  • Вопрос задан
  • 9397 просмотров
Решения вопроса 1
Сделайте под это дело отдельный компонент. Никаких appChild - это реакт.

class MyClickableComponent extends React.PureComponent {
  construct(props, context) { 
    super(props, context)

    this.state = {
      isOpen: false,
    }
  }

  handleClick = e => {
    this.setState({ isOpen: true })
  }

  render() {
   const { isOpen } = this.state

    return (
      <div>
        <div onClick={this.handleClick }>click on me</div>
        {isOpen && (
          <b>opened!</b>
        )}
      </div>
    )
  }
}


ReactDOM.render(
        <div>
            <Month />
                   <MyClickableComponent  />
            <Content />
        </div>,
  document.getElementById('root')
);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Google сразу выдает порядком вопросов, но в общем случае, если речь идет об однотипных компонентах, вот хороший ответ. Суть в нем сводится в том, что вы рендерите компоненты, на основе данных в state (это можеть бы так же и props, пришедшие из родителя..).

(перевел главный кусок с ответа по ссылке выше)

// ...
// SampleComponent - ваш однотипный компонент
// ...

class Test extends Component {
    constructor(props) {
        super(props)
        this.addChild = this.addChild.bind(this)
        this.state = {
            components: [
                {
                    id:1, name: 'Some Name'
                }
            ]
        }
    }

    addChild() {
        // Изменение стейта спровоцирует перерисовку
        this.setState(this.state.concat([
            {id:2,name:"Another Name"}
        ]))
    }
    render() {
        return (
            <div>
                <h1>App main component! </h1>
                <button onClick={this.addChild}>Add component</button>
                { // здесь будет отрисовано необходимое кол-во компонентов
                    this.state.components.map((item) => (
                        <SampleComponent key={item.id} name={item.name}/>
                    ))
                }
            </div>
        );
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы