反应 - 动态导入组件

LEJ*_*LEJ 13 javascript import components reactjs react-component

我有一个页面,根据用户输入呈现不同的组件.目前,我已对每个组件的导入进行了硬编码,如下所示:

    import React, { Component } from 'react'
    import Component1 from './Component1'
    import Component2 from './Component2'
    import Component3 from './Component3'

    class Main extends Component {
        render() {
            var components = {
                'Component1': Component1,
                'Component2': Component2,
                'Component3': Component3
            };
            var type = 'Component1';  // just an example
            var MyComponent = Components[type];
            return <MyComponent />
        }
    }

    export default Main
Run Code Online (Sandbox Code Playgroud)

但是,我一直在更改/添加组件.有没有办法可能有一个文件只存储组件的名称和路径,然后这些文件动态导入另一个文件?

LEJ*_*LEJ 17

我认为对于我想要实现的目标可能存在一些困惑.我设法解决了我遇到的问题,并在下面显示了我的代码,显示了我是如何解决它的.

单独的文件(ComponentIndex.js):

    let Components = {};

    Components['Component1'] = require('./Component1').default;
    Components['Component2'] = require('./Component2').default;
    Components['Component3'] = require('./Component3').default;

    export default Components
Run Code Online (Sandbox Code Playgroud)

主文件(Main.js):

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

    class Main extends Component {
        render () {
            var type = 'Component1'; // example variable - will change from user input
            const ComponentToRender = Components[type];
            return <ComponentToRender/>
        }
    }

    export default Main
Run Code Online (Sandbox Code Playgroud)

此方法允许我非常快速地添加/删除组件,因为导入在一个文件中,并且只需要一次更改一行.

  • 您还可以从'./Component1'导出{默认为Component1},然后从./ComponentIndex'导入*作为componentList,然后是componentList [type]。 (2认同)

小智 16

由于问题真的很老,所以答案可能还可以。但是现在,如果有人遇到同样的问题应该使用动态导入,以便只加载需要的组件并避免加载所有不同的组件。

const component = React.lazy(() => import('./component.jsx'));
Run Code Online (Sandbox Code Playgroud)

试试这里的例子:演示

  • 很好的答案,但值得注意的是 React.lazy 尚不可用于服务器端渲染。 (7认同)