用路由更改换出组件时,ReactJS路由器+组件层次结构

如何解决用路由更改换出组件时,ReactJS路由器+组件层次结构

TLDR:我正在尝试弄清楚如何布置嵌套的路线和我的组件,以便可以根据路线替换一个组件。

用超级简单的术语来说,我正在尝试构建一个应用程序,使教师可以看到他们在大学教授的课程。

应用程序的路由为:

  1. /dashboard:呼叫后端以检查教师的帐户上是否设置了认的大学,如果没有,则显示一个大学选择器对话框,教师可以在其中选择一个认的大学。有了认的大学(例如COLLEGE1)后,请重新路由到下一条路线(下一个要点)
  2. /dashboard/college/COLLEGE1获取大学教授的课程的元数据。
  3. /dashboard/college/COLLEGE1/class/CLASS1显示COLLEGE1中单个类的元数据。通过单击项目符号2中的课程可以访问此路由。

这是静态交互时的样子的粗略模拟(我为每个组件上了颜色,因此您在响应时更容易引用它们):

Rough mocks of interaction

但是,我只是无法弄清楚嵌套路由+组件层次结构,这会让我明白这一点。

到目前为止,我的层次结构是:

<Home>
    <Header/>
        <!-- content in header -->
    </Header>
    <MainContent>
        <!-- Either loading,for e.g. to fetch permissions -->
        <Loading />

        <!-- OR display navigation + content -->
        <MainContentPage>
            <!-- show navigation pane on left,and then choose from report / T and Cs / Contact -->
            <Navigation>
                <CurrentCollegeInfo />
                <DashboardLink />
                <TermsAndConditionsLink />
                <ContactUsLink />
            </Navigation>

            <ReportPage>
                <!-- Either Loading -->
                <Loading />
                
                <!-- OR have user select default college -->
                <DefaultCollegePickerPopup />
            
                <!-- OR show college report or class details -->
                <CollegeReportPage />
                <ClassDetailsPage />    

                <!-- OR error pages: Not Found,500,etc. -->
                <ErrorPage />
            </ReportPage>

            <TermsAndConditionsPage />
            <ContactUsPage />

        </MainContentPage>
    </MainContent>
</Home>

如何在此处插入路由管理(顺便说一句,我正在使用react-router库),以便在ReportPage组件中:

  1. 路线是/dashboard(从后端加载认大学或要求用户选择一个学院时)
  2. 或者是/dashboard/college/COLLEGE1获取大学报告
  3. 还是/dashboard/college/COLLEGE1/class/CLASS1获取类详细信息?

这是否不可能,我宁愿找出另一种流程?

解决方法

因此,如果我理解正确,您想根据用户所在的端点使用react-router加载不同的组件吗?这是100%可能的。您只需将要针对特定​​路线显示的组件作为组件属性传递。

您还可以在路径中使用参数,因此在您的示例中,您有/dashboard/COLLEGE1 ...我假设您需要动态地设置它以允许任何大学。这是通过将参数放置在路径中来完成的,例如/dashboard/:somevariablename

<Route
    // exact

    path={"/dashboard"}
    // path={"/dashboard/:collegeId"}
    // path={"/dashboard/:collegeId/classes/:classId"}

    component={ComponentToPass}
/>

如果您为用户可以访问的每个可能的组件/页面创建一个Route,并将其包装在<Switch>组件中,它将仅显示一个组件。不过,您也可以跳过<Switch>并向端点添加多条路由。

我假设您需要在相应的组件中使用collegeId和classId。如果您正在使用功能性React,请使用const { VARNAME } = useParams()来检索您正在使用的参数。如果您使用的是基于类的react,则只需调用this.props.match.VARNAME。 -两者显然都在要显示/使用的组件内部使用。

因此,稍微修改一下代码(可以在专用的路由组件中完成),这是一个简单的示例。

import {HashRouter,Switch,Route} from "react-router-dom"
import DefaultCollegePickerPopup from './wherever'
import CollegeReportPage from './wherever'
import ClassDetailsPage from './wherever'

function RouterComponent(props) {

    return (
        <HashRouter>
            <Switch>

                <Route 
                    exact 
                    path={"/dashboard"}
                    component={DefaultCollegePickerPopup} 
                />
                <Route 
                    exact 
                    path={"/dashboard/:collegeId"} 
                    component={CollegeReportPage}
                />
                <Route 
                    exact 
                    path={"/dashboard/:collegeId/class/:classId"} 
                    component={ClassDetailsPage} 
                />
                
            </Switch>
        </HashRouter>
    )
}
function CollegeReportPage(props) {
    const { collegeId } = useParams();

    return (
    <div>College report for {collegeId}</div>
    )
}

class CollegeReportPage extends React.Component {
    render() {
        const { collegeId } = this.props.match
        return (
            <div>College report for {collegeId}</div>
        )
    }
}

如果您还没有看过,我会的。它提供了大量有用的信息。

https://reactrouter.com/web/guides/quick-start

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?