前面我们先了解一下 路由是什么? 路由分类有哪些?内置API有哪些?
可能有点枯燥,不喜欢看的直接跳过!
- 单页Web应用(single page web application,SPA)。
- 整个应用只有一个完整的页面。
- 点击页面中的链接不会刷新页面,只会做页面的局部更新。
- 数据都需要通过ajax请求获取, 并在前端异步展现。
- 一个路由就是一个映射关系(key:value)
- key为路径, value可能是function或component
- react的一个插件库。
- 专门用来实现一个SPA应用。
- 基于react的项目基本都会用到此库。

win + R
cmd 打开

cd/react项目文件目录

安装:
npm i react-router-dom -S

很好,你已经完成了,安装!
接下来是使用路由的步骤文件

在
src路径下新建views文件,页面组件新建在这里面

在
src路径下新建router文件夹,在这里配置路由

在
router路径下新建index.jsx文件夹,在这里配置路由

// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页 关于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
// 创建路由
const routes = [
{
path: "/",
element: (<HomeView></HomeView>)
},
{
path: "/about",
element: (<AboutView ></AboutView >)
},
];
// 使用useRoutes 创建
export default function RouterView() {
// 创建路由
const elem = useRoutes(routes);
// 返回接口
return elem;
}
完整代码:

以上配置是路由
基础配置:
这样还是看不到效果的,要配置导航使用路由
路径:src / App.jsx
import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom";
Router: 路由
RouterView: 路由组件 ,导入路由文件
HashRouter: 哈希路由
NavLink: 导航链接
全部代码:
import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom";
function App() {
return (
<Router>
<NavLink to="/">首页</NavLink>  || 
<NavLink to="/about">关于</NavLink>  || 
<RouterView />
</Router>
);
}
export default App;


这里我新建了一个组件 ProductView.jsx
import { useParams } from "react-router-dom"
const { id } = useParams()
<h1>产品参数:{id}</h1>

传参:
<NavLink to="/product/123">产品123</NavLink>  || 
<NavLink to="/product/456">产品456</NavLink>  || 

效果:

src / router / index.jsx// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页 关于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
// 组件嵌套组件
import Private from "./Private";
// 创建路由
const routes = [
{
path: "/",
element: <HomeView></HomeView>
},
{
path: "/about",
element: <AboutView></AboutView>
},
{
path: "/product/:id",
element: <ProductView></ProductView>
},
{
path: "/admin",
element: <AdminView />
// 配置子路由
children: [
{
path: "",
element: <DashView></DashView>
},
{
path: "orderlist",
element: <OrderList></OrderList>
}
]
},
// 使用useRoutes 创建
export default function RouterView() {
// 创建路由
const elem = useRoutes(routes);
// 返回接口
return elem;
}
新建文件 以下图:
views / AdminView.jsx文件:
import { NavLink, Outlet } from "react-router-dom";
function AdminView() {
return (
<div>
<h3>管理页面</h3>
<NavLink to="">管理页面</NavLink> || 
<NavLink to="orderlist">概览页面</NavLink>
<Outlet />
</div>
);
}
export default AdminView;
NavLink :导航链接
Outlet: 子组件容器
views / DashView.jsx文件:
function DashView() {
return ( <div>
<h3>概览页面内容</h3>
</div> );
}
export default DashView;
views / OrderList.jsx文件:
function OrderList() {
return (<div>
<h3>管理页面内容</h3>
</div>);
}
export default OrderList;
效果图:

App.jsx文件 导航配置:
代码:
import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom"
function App() {
return (<Router>
<NavLink to="/">首页</NavLink >  || 
<NavLink to="/about">关于</NavLink>  || 
<NavLink to="/admin">admin页面</NavLink>  || 
<NavLink to="/product/123">产品123</NavLink>  || 
<NavLink to="/product/456">产品456</NavLink>  || 
<NavLink to="/about?redirect=hello">产品hello</NavLink>  || 
<NavLink to="/about?redirect=word">产品word</NavLink>  || 
<RouterView></RouterView>
</Router>);
}
export default App;
传参:?redirect= “ 传的查询参数 ”
AboutView.jsx 文件:代码:
import { useSearchParams, NavLink, useNavigate, useLocation } from "react-router-dom"
function AboutView() {
// 获取about查询参数redirect的值
const [SearchParams] = useSearchParams()
// 获取redirect的值
const redirect = SearchParams.get('redirect')
// 渲染
return (<div>
{/* // 传递查询参数 */}
<h1>About页面查询参数:-{redirect}</h1>
</div>);
}
// 导出组件
export default AboutView;
用于 性能优化。
lazy方法,subspense组件
router / LazyLoad.jsx// 动态加载组件
import { lazy, Suspense } from "react";
// 动态加载组件 方法
function LazyLoad(url) {
// 配置动态加载组件路径
const Element = lazy(() => import(url));
return (
// 返回组件,Suspense:懒加载组件
<Suspense fallback={<h3>加载中. . . </h3>}>
{/* 内容组件 */}
<Element />
</Suspense>
);
}
// 导出方法
export default LazyLoad;
router / index.jsx文件使用:// 导入懒加载组件方法
import LazyLoad from "./LazyLoad";
element: LazyLoad("../views/HomeView")
router / index.jsx文件 代码:// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页 关于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
// 创建路由
const routes = [
{
path: "/",
element: ("../views/HomeView")
},
{
path: "/about",
element: ("../views/AboutView")
},
{
path: "/product/:id",
element: ("../views/ProductView")
},
{
path: "/admin",
element: <Private><AdminView /></Private>,
// 配置子路由
children: [
{
path: "",
element: <DashView></DashView>
},
{
path: "orderlist",
element: <OrderList></OrderList>
}
]
},
];
// 使用useRoutes 创建
export default function RouterView() {
// 创建路由
const elem = useRoutes(routes);
// 返回接口
return elem;
}
按需加载

类似于Vue里的路由守卫:未登陆 不能打开一些页面
有权限返回子组件,没有权限跳转到登录
router/Private.jsx本地存储
有 token,就有权限,
没有token,就没有权限
import {Navigate} from "react-router-dom"
// 权限路由
function Private(props) {
if(localStorage.getItem("token")) {
return <>{props.children}</> ;
}else {
return <Navigate to="/" />
}
}
export default Private;
权限组件包裹着 内容组件
element: < Private>< AdminView /></ Private>,
// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页 关于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
import Private from "./Private";
import LazyLoad from "./LazyLoad";
// 创建路由
const routes = [
{
path: "/",
element: LazyLoad("../views/HomeView")
},
{
path: "/about",
element: LazyLoad("../views/AboutView")
},
{
path: "/product/:id",
element: LazyLoad("../views/ProductView")
},
{
path: "/admin",
element: <Private><AdminView /></Private>,
// 配置子路由
children: [
{
path: "",
element: <DashView></DashView>
},
{
path: "orderlist",
element: <OrderList></OrderList>
}
]
},
];
// 使用useRoutes 创建
export default function RouterView() {
// 创建路由
const elem = useRoutes(routes);
// 返回接口
return elem;
}

src / views / NoMatch.jsx :import { NavLink } from "react-router-dom"
function NoMatch() {
return (<div>
<h1>你的页面被😽偷走了!</h1>
<NavLink to="/">首页</NavLink>
</div>);
}
export default NoMatch;
src / router / index.jsx :// 配置404页面
{
path: “*”,
element:
}
path 值为 *
// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页 关于
import NoMatch from "../views/NoMatch";
import HomeView from "../views/HomeView";
// import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
// 导入权限组件
import Private from "./Private";
// 导入懒加载组件方法
import LazyLoad from "./LazyLoad";
// 创建路由
const routes = [
{
path: "/",
element: LazyLoad("../views/HomeView")
},
{
path: "/about",
element: LazyLoad("../views/AboutView")
},
{
path: "/product/:id",
element: LazyLoad("../views/ProductView")
},
{
path: "/admin",
element: ( <Private><AdminView /></Private>),
// 配置子路由
children: [
{
path: "",
element: <DashView/>
},
{
path: "orderlist",
element: <OrderList/>
}
]
},
// 配置404页面
{
path: "*",
element: <NoMatch />
}
];
// 使用useRoutes 创建
export default function RouterView() {
// 创建路由
const elem = useRoutes(routes);
// 返回接口
return elem;
}

组件
< HashRouter> 哈希路由
< BrowserRouter> 浏览器路由
< NavLink> 导航链接
选中会有active 类名
< Link>导航链接
< OutLet>子路由容器
方法
useRoutes使用路由配置
useParams() 路由参数
useSearchParams() 获取查询参数

Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba
路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。
我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几
我正在使用rails3和cucumber,除了这个小问题,一切都很顺利GivenIamonthe"editautomobile"pageNoroutematches{:controller=>"automobiles",:action=>"edit"}(ActionController::RoutingError)现在路径在paths.rb中设置为edit_automobile_path在routes.rb中我有汽车作为资源,我搭建了它所以请告诉我我遗漏了什么,清楚地定义了路线并且匹配,因为我运行了rake路线并看到了路线。请指出正确的方向 最佳答案
有什么方法可以为url/path助手提供默认值吗?我有一个可选范围环绕我的所有路线:#config/routes.rbFoo::Application.routes.drawdoscope"(:current_brand)",:constraints=>{:current_brand=>/(foo)|(bar)/}do#...allotherroutesgohereendend我希望用户能够使用这些URL访问网站:/foo/some-place/bar/some-place/some-place为了方便起见,我在我的ApplicationController中设置了一个@current
我如何将像“root_path”这样的Rails路由助手作为类方法添加到像my_model.rb这样的类中?所以我的课是这样的:ClassMyModeldefself.fooreturnself.root_pathendendMyModel.foo以上不起作用,因为ClassMyModel不响应root_path这是我所知道的:我可以使用includeRails.application.routes.url_helpers,但这只会将模块的方法添加为实例方法我试过扩展Rails.application.routes.url_helpers但它没用请随时给我上课:)
尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg