Как динамически загрузить Компонент в реагировать?

Я работаю над проектом Reactjs + React-motion, в "модальном окне" (скажем), я бы хотел монтировать или загружать компонент динамически, если это возможно?

Мое решение до сих пор: я не смог найти способ, поэтому кажется, что легче разместить компонент на месте и скрыть его, затем переключить класс или стиль при изменении состояния, открывая скрытый компонент и только после "модального" окно "Переход заканчивается".

Ниже приведен код, где легче понять, что я пытаюсь сделать. Там нет обработчиков событий, и большая часть кода была удалена, но onRest (обратный вызов события, когда анимация заканчивается), а также рендер fn.

class HomeBlock extends React.Component {

    constructor (props) {
        ...

    }

    ...

    motionStyleFromTo () {

        return {
            ...
        };

    }

    onRest () {

        // this is triggered when the Motion finishes the transition

    }

    render () {

        return (
            <Motion onRest={this.onRestCallback.bind(this)} style={this.motionStyleFromTo()}>
                {style =>
                    <div className="content" style={{
                        width: `${style.width}px`,
                        height: `${style.height}px`,
                        top: `${style.top}px`,
                        left: `${style.left}px`
                        }}>
                        [LOAD COMPONENT HERE]
                    </div>
                }
            </Motion>
        );

    }

}

export default HomeBlock;

2 ответа

Решение

Вы можете достичь этого довольно легко. В этом примере я рендеринг компонента динамически на основе проп:

class MyComponent extends React.Component {
  propTypes: {
    display: React.PropTypes.bool
  },
  render() {
    return (
       <div>
         {this.props.display ? <ChildComponent /> : null}
       </div>
    )
  }
}

В вашем случае вы можете использовать внутреннее состояние компонента для монтирования или размонтирования компонента.

К вашему сведению, в некоторых случаях вы предпочитаете или должны использовать стиль, чтобы скрыть компоненты, а не уничтожать их. Об этом есть больше в документации React. Смотрите раздел "Stateful Children" здесь: https://facebook.github.io/react/docs/multiple-components.html

Вы можете сделать это с помощью внедрения зависимостей и концепции контейнера зависимостей. Я предоставил пример кода на этой странице

https://gist.github.com/SamanShafigh/a0fbc2483e75dc4d6f82ca534a6174d4

Итак, предположим, у вас есть 4 компонента, которые называются D1, D2, D3. Вам нужно создать механизм внедрения зависимостей и механизм контейнера зависимостей. Это очень простая реализация

Представьте, что у вас есть такой конфигурационный файл, который определяет ваши компоненты

export default [
  {
    name:'D1',
    path:'D1'
  },
  {
    name:'D2',
    path:'D2'
  },
  {
    name:'D3',
    path:'D3'
}];

Тогда вы можете иметь контейнер компонента примерно так

import componentsConfig from 'ComponentsConfig';

let components = {};

for (var i = 0; i < componentsConfig.length; i++) {
  let componentConfig = componentsConfig[i];
  // Check if component is not already loaded then load it
  if (components[componentConfig.name] === undefined) {
    components[componentConfig.name] = require(`${componentConfig.path}`).default;
  }
}

export default components;

Наконец, в том месте, где вы хотите загрузить свои компоненты, вы можете использовать контейнер компонентов для динамической загрузки ваших компонентов или, другими словами, вы можете внедрить свои компоненты

import React, { Component } from 'react';
import ComponentContainer from './ComponentContainer';

class App extends Component {
  render() {
    let components = ['D1', 'D2', 'D3'];

    return (
      <div>
        <h2>Dynamic Components Loading</h2>
        {components.map((componentId) => {
          let Component = ComponentContainer[componentId];
          return <Component>{componentId}</Component>;
        })}
      </div>
    );
  }
}

export default App;
Другие вопросы по тегам