除了useRoutes钩子函数,还有其他方法可以处理404错误页面吗?

简介: 除了useRoutes钩子函数,还有其他方法可以处理404错误页面吗?

在 React Router 中,除了 useRoutes 钩子函数外,还有多种方法可以处理 404 错误页面,下面以 React Router v6 为例详细介绍:

1. 使用 Routes 组件结合 path="*"

这是 React Router v6 中比较常见且基础的处理 404 错误页面的方式。Routes 组件会匹配第一个符合条件的路由,如果没有匹配到任何已定义的路由,就会匹配 path="*" 的路由,从而渲染 404 页面。

import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

// 定义正常页面组件
const Home = () => <h1>Home Page</h1>;
const About = () => <h1>About Page</h1>;

// 定义 404 错误页面组件
const NotFound = () => <h1>404 - Page Not Found</h1>;

const App = () => {
    return (
        <Router>
            <Routes>
                <Route path="/" element={<Home />} />
                <Route path="/about" element={<About />} />
                {/* 处理 404 错误的路由 */}
                <Route path="*" element={<NotFound />} />
            </Routes>
        </Router>
    );
};

export default App;

2. 高阶组件(HOC)封装

通过创建高阶组件,可以将 404 错误处理逻辑封装起来,提高代码的复用性和可维护性。

import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';

// 定义正常页面组件
const Home = () => <h1>Home Page</h1>;
const About = () => <h1>About Page</h1>;

// 定义 404 错误页面组件
const NotFound = () => <h1>404 - Page Not Found</h1>;

// 高阶组件,用于包裹路由并处理 404
const withNotFound = (WrappedComponent) => {
    return () => (
        <Routes>
            {/* 正常路由 */}
            <Route element={<WrappedComponent />} />
            {/* 404 路由 */}
            <Route path="*" element={<NotFound />} />
        </Routes>
    );
};

const AppRoutes = () => (
    <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
    </Routes>
);

const AppWithNotFound = withNotFound(AppRoutes);

const App = () => (
    <Router>
        <AppWithNotFound />
    </Router>
);

export default App;

3. 自定义路由守卫组件

创建一个自定义的路由守卫组件,在该组件中判断当前路径是否匹配,如果不匹配则渲染 404 页面。

import React from 'react';
import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom';

// 定义正常页面组件
const Home = () => <h1>Home Page</h1>;
const About = () => <h1>About Page</h1>;

// 定义 404 错误页面组件
const NotFound = () => <h1>404 - Page Not Found</h1>;

// 自定义路由守卫组件
const RouteGuard = ({ children }) => {
    const location = useLocation();
    const validPaths = ['/', '/about'];
    const isMatch = validPaths.some(path => location.pathname === path);

    return isMatch ? children : <NotFound />;
};

const App = () => {
    return (
        <Router>
            <RouteGuard>
                <Routes>
                    <Route path="/" element={<Home />} />
                    <Route path="/about" element={<About />} />
                </Routes>
            </RouteGuard>
        </Router>
    );
};

export default App;

4. 使用 useNavigate 进行重定向

在某些情况下,可以在组件内部使用 useNavigate 钩子判断当前路径是否有效,如果无效则重定向到 404 页面。

import React, { useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, useLocation, useNavigate } from 'react-router-dom';

// 定义正常页面组件
const Home = () => <h1>Home Page</h1>;
const About = () => <h1>About Page</h1>;

// 定义 404 错误页面组件
const NotFound = () => <h1>404 - Page Not Found</h1>;

const AppRoutes = () => {
    const location = useLocation();
    const navigate = useNavigate();
    const validPaths = ['/', '/about'];

    useEffect(() => {
        if (!validPaths.some(path => location.pathname === path)) {
            navigate('/404');
        }
    }, [location.pathname, navigate]);

    return (
        <Routes>
            <Route path="/" element={<Home />} />
            <Route path="/about" element={<About />} />
            <Route path="/404" element={<NotFound />} />
        </Routes>
    );
};

const App = () => {
    return (
        <Router>
            <AppRoutes />
        </Router>
    );
};

export default App;

这些方法各有优缺点,你可以根据项目的具体需求和复杂度选择合适的方式来处理 404 错误页面。

相关文章
|
移动开发 前端开发 HTML5
分享136个HTML公司企业模板,总有一款适合您
分享136个HTML公司企业模板,总有一款适合您
373 0
|
存储 前端开发 JavaScript
【第39期】一文认识React的状态管理库
【第39期】一文认识React的状态管理库
370 0
|
设计模式 前端开发 开发者
css 三栏布局的实现
css 三栏布局的实现
222 0
|
小程序 开发者
关于UniApp启动到微信小程序工具提示找不到app.json
关于UniApp启动到微信小程序工具提示找不到app.json
1840 0
|
9月前
|
人工智能 数据可视化 搜索推荐
云市场伙伴动态 | 分析和商业智能平台领导者Tableau
云市场伙伴动态 | 分析和商业智能平台领导者Tableau
|
8月前
|
机器学习/深度学习 数据采集 人工智能
DeepSeek R1 最新全面综述:R1 为什么能让 LLM 像人一样思考?
DeepSeek R1 最新全面综述:R1 为什么能让 LLM 像人一样思考?
283 0
|
8月前
|
人工智能 自然语言处理 安全
Axcxept携手阿里云,打造日语“首选”LLM——EZO×Qwen2.5
Axcxept携手阿里云,打造日语“首选”LLM——EZO×Qwen2.5
|
安全 NoSQL Shell
服务器挖矿木马解决办法与预防措施
服务器挖矿木马在17年初慢慢大规模流行,hack利用网络入侵控制了大量的计算机,在移植矿山计划后,利用计算机的CPU和GPU计算力完成了大量的计算,获得了数字加密货币。17年慢慢爆炸后,挖矿木马慢慢变成互联网的主要危害之一。网站服务器如果被挖矿木马团伙攻陷,正常业务服务的性能将遭受严重影响,挖矿木马会被感染,也代表着网站服务器权限被hack攻陷,公司的机密信息可能会泄露,攻击者也可能同时彻底破坏数据。
705 0
服务器挖矿木马解决办法与预防措施
|
弹性计算 负载均衡 监控
阿里aca认证证书含金量怎么样,认证需要具备哪些能力
现如今人们想找到一个好工作是非常重要的,在我们的简历中有一个证书是非常重要的,阿里云aca认证证书就受到很多企业的关注,给大家介绍一下阿里云aca认证证书含金量怎么样吧
1363 0
阿里aca认证证书含金量怎么样,认证需要具备哪些能力
|
弹性计算 运维 Kubernetes
攻坚、变革、创新 | 阿里研究员千字细说阿里云的十年“计算”重构史
听阿里巴巴集团研究员、阿里云智能弹性计算负责人张献涛,阿里云智能资深技术专家、阿里云容器技术负责人易立,还原阿里云十年“计算”重构史。
攻坚、变革、创新 | 阿里研究员千字细说阿里云的十年“计算”重构史
下一篇
开通oss服务