reactPC端项目构建TS,react@18.2.0+antd+vite+axios+redux+sass+ts资源-CSDN文库

react PC端项目构建,react@18.2.0+antd+vite+axios+redux+sass完全版代码下载:

reactPC端项目构建,react@18.2.0+antd+vite+axios+redux+sass资源-CSDN文库

phphook同步异步reactrouter6惯例路由器hook详解 AJAX

react移动端项目构建TS,react@18.2.0+react-vant+vite+axios+redux+sass+ts完全版代码下载:

react移动端项目构建TS,react@18.2.0+react-vant+vite+axios+redux+sass+ts资源-CSDN文库

react移动端项目构建,react@18.2.0+react-vant+vite+axios+redux+sass完全版代码下载:

react移动端项目构建,react@18.2.0+react-vant+vite+axios+redux+sass资源-CSDN文库

一、react-router简介

react-router 是一个用于处理 React 运用程序中路由管理的库,它供应了一种大略而强大的办法来实现单页面运用程序(SPA)中的路由掌握。
通过

react-router,可以轻松地定义运用程序的不同路由,利用户能够在运用程序中浏览不同的页面或视图。

二、路由器组件

<BrowserRouter>:适用于支持 HTML5 history API 的环境,如 Web 浏览器basename:用于为所有位置设置基准 URL。
常日用于运用程序支配在子目录的情形下children:用于渲染 BrowserRouter 组件的子组件。
常日用于包裹运用程序的其他组件futurere:预加载和延迟加载的配置信息。
window:用于指定在哪个全局工具上实行路由操作,常日用于在做事端渲染时指定全局工具<HashRouter>:适用于不支持 HTML5 history API 的环境,会在 URL 中利用哈希值来仿照路由。
basename:用于为所有位置设置基准 URL。
常日用于运用程序支配在子目录的情形下children:用于渲染HashRouter组件的子组件。
常日用于包裹运用程序的其他组件futurere:预加载和延迟加载的配置信息。
window:用于指定在哪个全局工具上实行路由操作,常日用于在做事端渲染时指定全局工具<Router>:基本路由器组件,常作为其他路由器组件的根本,根据须要进行定制化配置basename:用于为所有位置设置基准 URL。
常日用于运用程序支配在子目录的情形下children:children 属性用于渲染Router组件的子组件。
常日用于包裹运用程序的其他组件location:当前的路由位置navigationType:用于指定导航类型,可能的取值包括 POP, PUSH 和 REPLACE,用于指示路由的导航办法。
navigator:用于指定导航器,卖力处理路由的导航操作。
static:用于指示是否为静态路由,静态路由常日用于做事器端渲染(SSR)等场景。
<MemoryRouter>:MemoryRouter 不会操作浏览器的 URL,而是将路由信息存储在内存中,适用于非浏览器环境,如测试、做事器渲染等。
basename:用于为所有位置设置基准 URL。
常日用于运用程序支配在子目录的情形下children:用于渲染MemoryRouter组件的子组件。
常日用于包裹运用程序的其他组件initialEntries:初始路由条款标数组initialIndex:表示在 initialEntries 数组中哪个索引对应的路由该当作为初始路由future:预加载和延迟加载的配置信息。
<StaticRouter>:用于做事器端渲染(SSR),在做事器端渲染 React 运用程序时利用。
basename:用于为所有位置设置基准 URL。
常日用于运用程序支配在子目录的情形下children:用于渲染StaticRouter组件的子组件。
常日用于包裹运用程序的其他组件location:当前的路由位置

三、路由匹配器组件

<Routes>:定义运用程序的路由配置的顶级路由组件children:children 属性用于渲染Routes组件的子组件。
常日用于包裹运用程序的其他组件location:当前的路由位置<Route>组件用于在运用程序中定义路由规则,以指定当用户访问特定路径时要渲染的组件。
path:表示路由的路径。
当 URL 与 path 匹配时,干系的路由规则将被触发。
index:指示是否这是一个索引路由。
如果设置为 true,则表示这是一个索引路由,常日用于指示默认的子路由。
children:表示当前路由的子元素,常日是其他组件或路由干系内容。
caseSensitive:指示路由匹配是否区分大小写。
id:路由的唯一标识符。
loader:用于在须要时加载组件或数据。
action:用于实行路由干系的操作。
element:表示当前路由的渲染元素。
hydrateFallbackElement:表示在做事器端渲染时的回退元素。
errorElement:表示在路由发生缺点时的元素。
Component:表示当前路由对应的 React 组件。
HydrateFallback:表示在做事器端渲染时的回退组件。
ErrorBoundary:表示用于处理路由缺点的缺点边界组件。
handle:表示路由的处理函数。
shouldRevalidate:用于确定是否该当重新验证路由。
lazy:用于<Await>:异步组件children:用于根据 Promise 解析结果呈现不同的内容。
errorElement:React 节点,用于指定在 Promise 谢绝时呈现的内容。
resolve:表示须要等待解析的 Promise 工具或数据。
<Link>:通过单击或点击该页面导航到另一个页面to:表示链接的目标位置,可以是一个字符串或者包含 pathname、search 和 hash 属性的工具,用于构建目标URL。
preventScrollReset:指定是否阻挡链接点击后的滚动位置重置。
relative:导航相对位置的办法,可以是 "route" 或 "path"。
reloadDocument:指定是否在点击链接后重新加载文档。
replace:指定是否利用更换导航。
state:要通报的状态数据。
unstable_viewTransition:指定是否利用不稳定的视图过渡。
<NavLink>:分外类型的<Link>,它知道自己是“活动”、“挂起”还是“正在转换”,除了<Link>中有的属性,还包括以下属性className:普通的className类似,只不过过可以通报函数,根据状态定制className,如:({ isActive, isPending, isTransitioning })=>{}style:普通的style类似,只不过过可以通报函数,根据状态定制className,如:({ isActive, isPending, isTransitioning })=>{}children:普通的style类似,只不过过可以通报函数,根据状态定制className,如:({ isActive, isPending, isTransitioning })=>{}end:用于改变激活和挂起状态的匹配逻辑,只匹配到 <NavLink>的 to 路径的“末端”caseSensitive:指示路由匹配是否区分大小写。
<Navigate>:以编程办法触发页面导航,而不是依赖于用户的点击或其他交互操作。
to:表示导航目标的位置。
这可以是一个字符串或一个工具,详细取决于您要导航到的位置。
replace (可选):一个布尔值,表示是否用导航更换当前历史记录中的条款,而不是添加新的历史记录条款。
state (可选):用于在导航之间通报状态的工具。
relative (可选):表示相对路由的类型,可能是 boolean 或 number。
<Outlet>:在父路由元素中利用 <Outlet> 来呈现其子路由元素context:用于通报高下文信息给Outlet组件。

五、路由Hook

useHref:用于天生给定路由路径的 HREF 属性值

import {useHref} from "react-router-dom";const Home = () => { const href = useHref('/list'); return (<a href={href}>Go to Destination</a>);};export default Home;useLocation:用于获取当前页面的位置信息,可以访问当前页面的路径、搜索参数和哈希值等信息

import {useLocation} from "react-router-dom";const Home = () => { console.log(useLocation()) return (<>home页</>);};export default Home;useNavigate:编程式路由导航,无需利用<Link>组件或history工具

import {useNavigate} from "react-router-dom";const Home = () => { const navigate = useNavigate(); const goRouter = () => { navigate('/list', { replace: true,//是否更换导航 state: {}, //页面间通报数据,history.state preventScrollReset: false, //一个布尔值,用于指示是否阻挡在页面导航时重置滚动位置,需利用数据路由器合营ScrollRestoration组件利用 relative: "parent", //指定相对导航的办法。
可以是"parent", "child", 或者"sibling",用于相对付当前路由的父级、子级或同级进行导航。
unstable_flushSync: false, //用于指示是否在导航时同步刷新。
如果设置为true,则会在导航时同步刷新,而不是延迟到下一个渲染周期。
unstable_viewTransition: false, //用于指示是否在导航时利用视图过渡。
如果设置为true,则会在导航时利用视图过渡效果 }) } return (<> <button onClick={() => navigate('/list')}>页面跳转1</button> <button onClick={goRouter}>页面跳转2</button> <button onClick={() => navigate(-1)}>返回</button> </>);};export default Home;
useRoutes:等同于<Routes>组件,用来定义路由,工具具有与普通 <Route> 元素相同的属性

import {Navigate, useRoutes} from "react-router-dom";import Home from "@pages/home/home.jsx";/ id: 'id',//路由的唯一标识符。
path: '/', //路由的路径。
element: <></>, //React 元素,用于渲染路由内容。

children: [{}], //子路由 index: false,//指示这是一个索引路由,索引路由是指当用户访问运用程序的根路径时所匹配的路由,常用于子路由 /const routes = [{ path: '/', element: <Navigate to="/home" replace/>,}, { path: '/home', element: <Home/>,}, { path: '/home1', children:[{ index: true, element: <h1>home1页</h1>, }]}];const RootRouter = () => useRoutes(routes);export default RootRouter;
useParams:获取当前URL 匹配的动态参数,须要在路由中配置参数

import {Navigate, useRoutes} from "react-router-dom";import Home from "@pages/home/home.jsx";import List from "@pages/list/list.jsx";const routes = [{ path: '/', element: <Navigate to="/home" replace/>,}, { path: '/home', element: <Home/>,}, { path: '/list/:id', element: <List/>}];const RootRouter = () => useRoutes(routes);export default RootRouter;

import {useNavigate} from "react-router-dom";const Home = () => { const navigate = useNavigate(); const goRouter = ()=>{ navigate('/list/1') } return (<> <button onClick={goRouter}>跳转list</button> </>);};export default Home;

import {useParams} from "react-router-dom";const List = () => { console.log(useParams()) return (<>列表页</>);};export default List;useOutlet、useOutletContext:useOutlet创建Outlet、useOutletContext获取Outlet高下文。

import {Navigate, useRoutes} from "react-router-dom";import Home from "@pages/home/home.jsx";import List from "@pages/list/list.jsx";const routes = [{ path: '/', element: <Navigate to="/home" replace/>,}, { path: '/home', element: <Home/>, children: [{ path: 'list', element: <List/> }]}];const RootRouter = () => useRoutes(routes);export default RootRouter;

import {Outlet, useOutlet} from "react-router-dom";const Home = () => { const UseOutlet = useOutlet({parent:'home'}); return (<> <div>Home页</div> {/<Outlet context={{parent:'home'}} />/} {UseOutlet} </>);};export default Home;

import {useOutletContext} from "react-router-dom";const List = () => { console.log(useOutletContext()) return (<>列表页</>);};export default List;useSearchParams:处理URL查询参数

import {useNavigate} from "react-router-dom";const Home = () => { const navigate = useNavigate(); const goRouter = ()=>{ navigate('/list?name="张三"&id=9999&name="李四"') } return (<> <button onClick={goRouter}>跳转list</button> </>);};export default Home;

import {useParams, useSearchParams} from "react-router-dom";const List = () => { let [searchParams, setSearchParams] = useSearchParams(); console.log(searchParams.get('name')); //只获取第一个name查询参数 // console.log(searchParams.sort()) 查询参数排序 // console.log(searchParams.toString()) 查询参数转字符串 // console.log(searchParams.getAll('name')) 获取所有name查询参数 // searchParams.forEach((value, key, parent)=>{}) 循环查询参数 // console.log(searchParams.has('name')) 查询参数是哦福存在 // console.log(searchParams.set('name','李四')) 设置查询参数 // console.log(searchParams.append('id','9999')) 增加查询参数 // console.log(searchParams.delete('name','李四')) 删除查询参数 // setSearchParams({name:'李四',id:'哈哈哈'}) 设置查询参数 return (<>列表页</>);};export default List;useMatch:用于匹配的 Hook。

import {useMatch, useMatches} from "react-router-dom";const List = () => { const match = useMatch('/list'); return (<>列表页</>);};export default List;useBeforeUnload:用于处理页面即将卸载时的操作的 Hook,等同于window.onbeforeunload

import {useBeforeUnload} from "react-router-dom";const Home = () => { useBeforeUnload(()=>{ localStorage.setItem('pageId','list') }) return (<> <button>跳转list</button> </>);};export default Home;useLinkClickHandler:自定义 <Link>导航的click事宜

import { useHref, useLinkClickHandler,} from "react-router-dom";const StyledLink = styled("a", { color: "fuchsia" });const Link = React.forwardRef( ({onClick, replace = false, state, target, to, ...rest}, ref ) => { let href = useHref(to); let handleClick = useLinkClickHandler(to, { replace, state, target, }); return ( <StyledLink {...rest} href={href} onClick={(event) => { onClick?.(event); if (!event.defaultPrevented) { handleClick(event); } }} ref={ref} target={target} /> ); });useLinkPressHandler:自定义 <Link> 导航的press事宜

import { TouchableHighlight } from "react-native";import { useLinkPressHandler } from "react-router-native";function Link({ onPress, replace = false, state, to, ...rest}) { let handlePress = useLinkPressHandler(to, { replace, state, }); return ( <TouchableHighlight {...rest} onPress={(event) => { onPress?.(event); if (!event.defaultPrevented) { handlePress(event); } }} /> );}useNavigationType:返回当前导航类型或用户如何访问当前页面,弹出、推送或更换

import {useNavigationType} from "react-router-dom";const List = () => { console.log(useNavigationType()) return (<>列表页</>);};export default List;useResolvedPath:根据当前位置的路径名解析 pathname 给定 to 值中的位置

import {useResolvedPath} from "react-router-dom";const List = () => { console.log(useResolvedPath('/list')) return (<>列表页</>);};export default List;useAsyncError:用于处理异步缺点的 Hook,需搭配组件<Await>利用

import {Await, useAsyncError} from "react-router-dom";import {Suspense} from "react";function ErrorElement() { const error = useAsyncError(); return ( <p>页面出错了:{error.message}</p> );}const Home = () => { const asyncLoadData =()=>{ return new Promise((resolve, reject) => { // 异步操作,比如要求数据 setTimeout(() => { reject({message:'异步要求失落败'}) }, 2000) }); } return (<> <div>home页</div> <Suspense fallback={<div>加载中.....</div>}> <Await resolve={asyncLoadData()} errorElement={<ErrorElement />}> <div>加载成功</div> </Await> </Suspense> </>);};export default Home;useAsyncValue:用于处理异步值的 Hook,,需搭配组件<Await>利用

import {Await, useAsyncError, useAsyncValue} from "react-router-dom";import {Suspense} from "react";function SuccessElement(){ const result = useAsyncValue(); return ( <p>页面要求成功:{result.message}</p> );}function ErrorElement() { const error = useAsyncError(); return ( <p>页面出错了:{error.message}</p> );}const Home = () => { const asyncLoadData =()=>{ return new Promise((resolve, reject) => { // 异步操作,比如要求数据 setTimeout(() => { resolve({message:'要求成功'}) }, 2000) }); } return (<> <div>home页</div> <Suspense fallback={<div>加载中.....</div>}> <Await resolve={asyncLoadData()} errorElement={<ErrorElement/>}> <SuccessElement/> </Await> </Suspense> </>);};export default Home;useInRouterContext:判断组件是否在<Router>的高下文中呈现

六、常用方法

json(data, init):new Response()的简化,json({ some: "thing" }, { status: 200 })generatePath(originalPath,params):快速天生路由路径,一样平常用于动态参数的路由,generatePath('/users/:id', { id: '42' })isRouteErrorResponse(error):判断是否是缺点路由相应,useAsyncError()resolvePath(to, fromPathname):将给定 To 值解析为具有绝对 pathname 值的实际 Path 工具,如果想知道To的确切路径可以利用该方法,resolvePath('/home')matchPath(pattern,pathname):类似useMatch,返回匹配到的route path。
matchRoutes(routes,locationArg,basename):返回匹配到的route 工具。
renderMatches(matches):将matchRoutes匹配到的router工具渲染成react元素。
createSearchParams({params):创建路由的搜索参数,返回URLSearchParams工具,等同于new URLSearchParams

const url = new URL("https://example.com?foo=1&bar=2");const params1 = createSearchParams(url.search);const params3 = new URLSearchParams(url.search);const params2 = url.searchParams;console.log(params2.get('foo'),params1.get('foo'),params3.get('foo'))createRoutesFromElements(reactNode):将路由<Route>创创建的路由转成工具

import {createRoutesFromElements, Navigate, Route, useRoutes} from "react-router-dom";import Home from "@pages/home/home.jsx";import List from "@pages/list/list.jsx";const routes = createRoutesFromElements(<> <Route path="/" element={<Navigate to="/home" replace/>}></Route> <Route path="/home" element={<Home/>}></Route> <Route path="/list" element={<List/>}></Route></>)// const routes = [{// path: '/',// element: <Navigate to="/home" replace/>,// }, {// path: '/home',// element: <Home/>,// }, {// path: '/list',// element: <List/>,// }];const RootRouter = () => useRoutes(routes);export default RootRouter;