簡體   English   中英

如何在reactjs中動態加載組件?

[英]How to load Component dynamically in reactjs?

我正在一個“模式窗口”(比如說)中進行一個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;

您可以輕松實現這一目標。 在此示例中,我將基於prop動態渲染組件:

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

在您的情況下,您可能希望使用內部組件狀態來安裝或卸載組件。

僅供參考,在某些情況下,您可能更喜歡或需要使用樣式來隱藏組件而不是破壞它們。 React文檔中有更多有關此的內容。 請參閱此處的“有狀態的孩子”部分: 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM