react-router-dom 版本要在 v6 以上
npm install react-router-dom -S
import { BrowserRouter } from "react-router-dom";
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById("root")
);
注意:
路由模式
hash 模式: HashRouter
histroy 模式: BrowserRouter
其中 hash 模式 url 路径上显示 # ,histroy 模式需要后端配合配置
在 App.js 中,通过 Link 或者 NavLink 组件,进行导航跳转
import React from "react";
import { Link, Route, Routes } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
function App(props) {
console.log(props);
return (
<div>
<div>
{/* link 导航 */}
{/* 也使用 NavLink,相比link 它多了一个点击时的 active 类,可以设置点击时样式 */}
<Link to="/child1">Link: go to child1</Link> |{" "}
<Link to="/child2">Link: go to child2</Link>
</div>
<div>
{/* 定义路由出口 */}
<Routes>
{/* 根组件默认展示 */}
{/* <Route path="/" element={<Child1 />} /> */}
{/* 路由重定向 */}
<Route path="/" element={<Navigate to="/Child1" />} />
<Route path="/child1" element={<Child1 />} />
<Route path="/child2" element={<Child2 />} />
</Routes>
</div>
</div>
);
}
export default App;
在 App.js 中,通过 react-router-dom 中的 useNavigate() 方法,进行编程式导航跳转
注意:withRouter 在 react-router-dom v6 版本中已被弃用
import React from "react";
import { Route, Routes, useNavigate } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
function App() {
const navigate = useNavigate();
return (
<div>
<div>
{/* 编程式导航导航 */}
<button
onClick={() => {
navigate("/child1");
}}
>
onClick: go to child1
</button>
<button
onClick={() => {
navigate("/child2");
}}
>
onClick: go to child2
</button>
</div>
<div>
{/* 定义路由出口 */}
<Routes>
{/* 根组件默认展示 */}
{/* <Route path="/" element={<Child1 />} /> */}
{/* 路由重定向 */}
<Route path="/" element={<Navigate to="/Child1" />} />
<Route path="/child1" element={<Child1 />} />
<Route path="/child2" element={<Child2 />} />
</Routes>
</div>
</div>
);
}
export default App;
此方式跳转会删除历史记录,使用和传参方式和 navigate() 相同,只是增加 {replace: true}参数
Link组件也可以使用 replace 方式,只需要在Link标签上添加 replace 属性即可
navigate('/child1/child1B',{replace: true})
// 历史记录 前进
navigate(1)
// 历史记录 后退
navigate(-1)
// 历史记录 后退两步
navigate(-2)
在一级路由 App.js 中,拥有子路由的路由需要在 path 最后加上 /*
import React from "react";
import { Link, Route, Routes, Navigate } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
function App(props) {
console.log(props);
return (
<div>
<div>
<Link to="/child1">Link: go to child1</Link> |{" "}
<Link to="/child2">Link: go to child2</Link>
</div>
<div>
{/* 定义路由出口 */}
<Routes>
{/* 根组件默认展示 */}
{/* <Route path="/" element={<Child1 />} /> */}
{/* 路由重定向 */}
<Route path="/" element={<Navigate to="/Child1" />} />
<Route path="/child1/*" element={<Child1 />} />
<Route path="/child2" element={<Child2 />} />
</Routes>
</div>
</div>
);
}
export default App;
import React, { Component } from "react";
import { Link, Route, Routes } from "react-router-dom";
import Child1A from "./Child1A";
import Child1B from "./Child1B";
export default class Child1 extends Component {
render() {
return (
<div>
<div>
<Link to="/child1/child1A">Link: go to Child1A</Link> |{" "}
<Link to="/child1/child1B">Link: go to Child1B</Link>
</div>
<div>
{/* 定义路由出口 */}
<Routes>
{/* 路由重定向 */}
{/* <Route path="/" element={<Navigate to="/Child1A" />} /> */}
{/* 根组件默认展示 */}
<Route path="/" element={<Child1A />} />
<Route path="child1A" element={<Child1A />} />
<Route path="child1B" element={<Child1B />} />
</Routes>
</div>
</div>
);
}
}
import React from "react";
import { Link, Route, Routes, Navigate } from "react-router-dom";
import Child1 from "./components/Child1";
import Child2 from "./components/Child2";
import Child1A from "./components/Child1A";
import Child1B from "./components/Child1B";
function App() {
return (
<div>
<div>
<Link to="/child1">Link: go to child1</Link> |{" "}
<Link to="/child2">Link: go to child2</Link>
</div>
<div>
{/* 定义路由出口 */}
<Routes>
<Route path="/" element={<Navigate to="/Child1/child1A" />} />
<Route path="/child1" element={<Child1 />}>
<Route path="child1A" element={<Child1A />} />
<Route path="child1B" element={<Child1B />} />
</Route>
<Route path="/child2" element={<Child2 />} />
</Routes>
</div>
</div>
);
}
export default App;
import React, { Component } from "react";
import { Link, Outlet } from "react-router-dom";
export default class Child1 extends Component {
render() {
return (
<div>
<div>
<Link to="/child1/child1A">Link: go to Child1A</Link> |{" "}
<Link to="/child1/child1B">Link: go to Child1B</Link>
</div>
<div>
{" "}
<Outlet />
</div>
</div>
);
}
}
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上找到一个类似的问题
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的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
我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和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个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。