如何在reactjs中动态加载Component?

时间:2016-04-29 15:08:43

标签: javascript reactjs react-motion

我正在"模态窗口中工作Reactjs + React-motion项目" (让我们说)我想动态安装或加载组件,如果可能的话?

到目前为止我的解决方案:我无法找到方法,所以似乎更容易将组件安装到位并隐藏它,然后在状态更改时切换类或样式,显示隐藏的组件,仅在"模态窗口之后#34;过渡完成。

在下面分享一些代码,让我们更容易理解我想要做的事情。没有事件处理程序,大多数代码都被删除了,但是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 个答案:

答案 0 :(得分:3)

你可以很容易地实现这一目标。在这个例子中,我基于prop:

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

在您的情况下,您可能希望使用内部组件状态来安装或卸载组件。

仅供参考,有些情况下您可能更喜欢或需要使用样式来隐藏组件而不是销毁组件。在React文档中有更多关于此的内容。查看有状态的孩子&#39;部分:https://facebook.github.io/react/docs/multiple-components.html

答案 1 :(得分:0)

您可以使用依赖注入和依赖容器概念来实现。我在这个要点页面提供了一些示例代码

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;