在 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 错误页面。
 
                             
                 
                