react router v6 版本的路由实现
喜爱就点赞呗
装置
pnpm add react-router-dom
残缺代码
# App.tsx
function App() {
return (
<div className="App">
<nav style={{margin: 10}}>
<Link to="/" style={{padding: 5}}>
Home
</Link>
<Link to="/about" style={{padding: 5}}>
About
</Link>
<Link to="/list" style={{padding: 5}}>
About
</Link>
</nav>
<Routes>
<Route path="/" element={<Home txt="2333" />}></Route>
<Route path="about" element={<About />}></Route>
<Route path="*" element={<NoMatch />} />
<Route path="list" element={<List />}>
<Route path="/list" element={<ListLink />}></Route>
<Route path=":id" element={<ListId />}></Route>
</Route>
</Routes>。</div>
);
}
Api
办法 | 意义 |
---|---|
useParams | 返回以后参数 依据门路读取参数 |
useNavigate | 返回以后路由 代替原有 V5 中的 useHistory |
useOutlet | 返回依据路由生成的 element |
useLocation | 返回以后的 location 对象 |
useRoutes | 同 Routers 组件一样,只不过是在 js 中应用 |
useSearchParams | 用来匹配 URL 中? 前面的搜寻参数 |
根本路由实现
其中 Home, 和 About 的代码就不进行展现了
<Route path="/" element={<Home />}></Route>
<Route path="about" element={<About />}></Route>
则是定义路由
地址 | 组件 |
---|---|
localhost:3000/ | Home 组件 |
localhost:3000/about | About 组件 |
不过这些很快就能分分明, 不过须要深刻理解的是嵌套路由
上面的代码次要也是 list 为主
404 路由
<Route path="*" element={<NoMatch />} />
当 Routes 中寻找不到的时候, 咱们在最初一个路由中增加正则就能够指定 404 了
重定向
应用导航组件重定向
咱们能够通过应用 React Router 的 Navigate 组件来执行申明性重定向。在上面的示例中,每当用户导航到 ” 对于 ” 页时,导航组件都将以申明形式执行重定向:
const About = () => {
const shouldRedirect = true;
return (
<>
<h2>About</h2>
{shouldRedirect && <Navigate replace to="/home" />}
</>
);
};
如果咱们想在路由级别对此进行治理,咱们也能够应用以下代替解决方案:
# App.tsx
<Route
path="about"
element={
shouldRedirect ? (<Navigate replace to="/home" />) : (<About />)
}
/>
应用重定向导航钩子
const About = () => {
const shouldRedirect = true;
const navigate = useNavigate();
React.useEffect(() => {if (shouldRedirect) {navigate('/home');
}
});
return (
<>
<h2>About</h2>
</>
);
};
每当组件出现时,React 的 useEffect Hook 都会运行,并将以编程形式执行重定向。
嵌套路由 (list) 的实现
<Route path="list" element={<List />}>
<Route path="/list" element={<ListLink />}></Route>
<Route path=":id" element={<ListId />}></Route>
</Route>
上方代码次要组成是这样的,
当咱们拜访
http://localhost:3000/list
<List>
<ListLink></ListLink>
</List>
当咱们拜访
http://localhost:3000/list/1
<List>
<ListId />
</List>
残缺代码
List.tsx
Outlet 嵌套路由相似 {children}
import {Outlet} from 'react-router-dom';
class List extends React.Component {constructor(props: React.FC) {super(props);
}
render() {
return (<div style={{ padding: 20}}>
<h2>Blog</h2>
<Outlet />
</div>
);
}
}
ListLink.tsx
const lists = {
"1": {
title: "第一篇文章",
desc: "test1",
},
"2": {
title: "第二篇文章",
desc: "test2",
},
};
class ListLink extends React.Component {constructor(props: React.FC) {super(props);
}
render() {
return (
<ul>
{Object.entries(lists).map(([key, { title}]) => (<li key={key}>
<Link to={`/list/${key}`}>
<h3>{title}</h3>
</Link>
</li>
))}
</ul>
);
}
}
ListId.tsx
useParams 获取路由参数
export default function ListId() {
const lists: Record<
string,
{
title: string;
description: string;
}
> = {
"1": {
title: "第一篇博客文章",
description: "第一篇博客文章,是对于 Vue3.0 的",
},
"2": {
title: "第二篇博客文章",
description: "Hello React Router v6",
},
};
const {id} = useParams();
const blog = lists[id as string];
const {title, description} = blog;
return (<div style={{ padding: 20}}>
<h3>{title}</h3>
<p>{description}</p>
</div>
);
}
路由对立治理及路由拦挡计划
这篇文章曾经写的很好了, 就不反复阐明了
react-router v6 路由对立治理及路由拦挡计划
参考
React Router v6 使用指南
React Router 6: Redirect