为什么在我的 Django 应用程序 multi-page 中只有第一个 React 组件呈现?

Why is only the first React component rendering in my multi-page in Django app?

我试图在我的 Django 应用程序的 React 前端中将辅助组件呈现给不同的 URL。 URLs 似乎设置正确,因为页面标题会相应更改并且不会引发任何错误,但页面本身是空白的。我的组件正在通过在组件目录中的 index.js 中导入来加载。

#index.js
import App from './components/App';
import Viz from './components/Viz';
#urls.py
from django.urls import path
from . import views
urlpatterns = [
    path('', views.index),
    path('viz/', views.getviz)
]

为了测试的简单性,我制作了组件的副本,所以我知道它可以工作。

// App.js
import React, { Component, Fragment } from 'react';
import ReactDOM from 'react-dom';

import Header from './layout/Header';
import Dashboard from './splits/Dashboard';
import Alerts from './layout/Alerts';

import { Provider } from 'react-redux';
import { Provider as AlertProvider } from 'react-alert';
import AlertTemplate from 'react-alert-template-basic';

import store from '../store';

//Alert Options
const alertOptions = {
    timeout: 3000,
    position: 'bottom center'
}

class App extends Component {
    render() {
        return (
            <Provider store={store}>
                <AlertProvider template={AlertTemplate} {...alertOptions}>
                    <Fragment>
                        <Header />
                        <Alerts />
                        <div className="container">
                            <Dashboard />
                        </div>
                    </Fragment>
                </AlertProvider>
            </Provider>
        );
    }
}

ReactDOM.render(<App />, document.getElementById('app')) 

与其他文件的唯一区别是替换了组件名称和元素 ID,分别从 App/app -> Viz/viz 更改。我将其用作我的 index.html,仅切换了元素 ID:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <title>viz</title>
</head>
<body>
    <div id="app"></div>
    {% load static %}
    <script src="{% static "frontend/main.js" %}"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body>
</html>

我意识到 只有 组件 放在第一个 index.js 正在加载(我尝试将它们切换到哪个证实了这一点),所以我想在加载多个组件而不是一个组件时我需要做一些额外的事情 - 但我无法弄清楚。有什么想法吗?

根据@TonyN 评论的建议,我设法使 react-router 方法运行良好。

我将 App.js 重组为 Router 的家,并将我的组件放入如下:

import React, { Component, Fragment } from 'react';
import ReactDOM from 'react-dom';
import UploadPage from './UploadPage';
import Viz from './Viz';
import { BrowserRouter as Router, Routes, Route, Link, Redirect } from 'react-router-dom'


export default class App extends Component {
  render() {
    return (
      <div>
        <Router>
            <Routes>
                <Route exact path='/' element={ <UploadPage />} />
                <Route exact path='/viz' element={ <Viz /> } />
            </Routes>
        </Router>
      </div>
    )
  }
}

ReactDOM.render(<App />, document.getElementById('app'))

这让我只剩下一张渲染图。只有其他更新是 django 端的 urls:

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index),
    path('viz', views.index)
]

我现在对这种互动有了更好的理解,所以感谢您为我指明了正确的方向。

这个 video tutorial 也帮助我实现了它,所以我也会把它留在这里。