【问题标题】:Conditionally render 404 route with React Router v4使用 React Router v4 有条件地渲染 404 路由
【发布时间】:2018-02-07 23:14:13
【问题描述】:

在我最父组件App 中,我实现了这样的路由:

<GetCustomerData />
<Switch>
    <Route path="/dashboard/:customerID" component={Dashboard} />
</Switch>

GetCustomerData 将客户数据作为 JSON 有效负载数组(包括客户 ID)。我们导航到具有相应 ID 的特定客户的 Dashboard 组件。

如果我们在 URL 中传递的客户 ID 在GetCustomerData 中的 JSON 有效负载中不存在,我想设置一个基本上抛出 404 组件的路由。

我看过一些教程说要执行以下操作:

 <Route path="*" component={NotFound} />

但这并没有真正检查 url 中的 customerID 参数。我该如何实现?

编辑: 在我的主要组件中,我以这种方式配置了浏览器路由:

ReactDOM.render(
    <BrowserRouter>
        <div className="main">
            <App />
        </div>
    </BrowserRouter>
    ,
    document.getElementById('react-app')
);

【问题讨论】:

    标签: reactjs react-router


    【解决方案1】:

    先设置404路由

    <Route path="/error" component={NotFound} />
    

    然后将您的GetCustomerDatadata 存储在状态数组中。目前尚不清楚数据来自何处或如何从您的示例中对其进行操作。如果将数据放入组件状态是一个问题,请创建一个单独的问题。

    如果您从 URL 中提取 id,则使用 props 中的 route 参数获取您的客户 id this.props.match.params.customerID

    一旦你有了数据和 id,你就可以在你的渲染方法中运行检查。

    if (this.state.data.includes(this.props.match.params.customerID)){
     return <whatYouExpectedToReturn/>
    }else{
     return <Redirect to='/error'/>;
    }
    

    【讨论】:

    • 数据负载(来自 API 调用)存储在 GetCustomerData 中。由于 if-check 是在 App 内部完成的,您认为将有效负载从 GetCustomerData 发送到 App 然后进行检查是个好主意吗?
    • 这取决于您要从哪里重定向。我会在 Dashboard 组件中执行此操作,因为这是 url 中唯一包含客户 ID 的地方。
    • 您能详细说明一下吗?我正在更新原始帖子,以便您更好地了解 App 组件的位置。
    • 也许文件结构的屏幕截图会更有帮助,文件树通常位于代码编辑器的左侧。
    • 详细说明,您应该有一个包含Dashboard 组件的文件。那是您在仪表板路线中引用的那个。然后你应该有一个你的NotFound 组件的文件。那是您在 404 路线中引用的那个。然后你有一个包含所有路由的路由器文件(我认为你称之为主路由)。我建议你把我写的 if-then 块放在你的 Dashboard 组件的 render 方法中,因为那是你想要重定向的地方。
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多