在没有路由器组件的情况下使用react

MrG*_*Man 4 javascript reactjs

如果我想使用不是单个页面的reactjs来创建Web应用程序。我是否应该将所有的React代码编译到一个文件中并将其加载到应用程序的所有页面上,然后使用我公开的函数来呈现必要的组件?

html文件示例

<div id="Clock" data-react="Clock"></div>
<div id="HelloWorld" data-react="HelloWorld"></div>
Run Code Online (Sandbox Code Playgroud)

index.js的示例

import React from 'react';
import ReactDOM from 'react-dom';
import Clock from './Clock';
import HelloWorld from './HelloWorld';
import OtherComponent from './OtherComponent';

const APPS = {
    Clock,
    HelloWorld,
    OtherComponent
};

const MyReactRender = react => {

    let component = react.getAttribute('data-react');
    let App = APPS[component];

    if(App != undefined) {
        ReactDOM.render(<App />, document.getElementById(component));
    }
}

document.querySelectorAll('[data-react]').forEach(MyReactRender);
Run Code Online (Sandbox Code Playgroud)

Fél*_*ier 5

我会看到两种提高质量和难度的方法。在这两种情况下,您都可以使用良好的旧的anchor元素将页面重定向到与不同模板对应的URL。

  • 手动检查divs ID是否存在

在这种情况下,每个模板都包含相同的javascript捆绑包,其中包含应用程序中的所有内容以及一个ID对应于特定组件的单个元素。这个想法是检查页面中是否存在某个元素,然后激活相应的react组件(如果存在)。

if (document.getElementById('component-root')) {
  ReactDOM.render(<Component />, document.getElementById('component-root'));
}
Run Code Online (Sandbox Code Playgroud)

从好的方面来说,它很容易实现。不利的一面是,捆绑包将永远变得越来越大,每次添加新的“页面”时,ifs的列表就会增加。

  • 将模块分成实际的捆绑包

存在不同的捆绑软件管理器,但是我建议使用Webpack创建仅包含应用程序特定部分的多个捆绑软件。然后,每个模板仅包含相应的div元素以及该特定的bundle。


<head><script src="/js/clock.js"></head>
<body><div id="root-clock"></div></body>
Run Code Online (Sandbox Code Playgroud)
<head><script src="/js/otherComponent.js"></head>
<body><div id="root-other-component"></div></body>
Run Code Online (Sandbox Code Playgroud)

如何使用webpack打包多个捆绑软件不在此答案的范围内,但请参见此处