react 路由
一、 react路由的基本使用
-
安装
react-router-dom
,在入口文件index.js中引入HasRouter组件,并将要使用的到路由的组件进行包裹
-
在子组件中引入Link,Route
-
Link用来配置路由的跳转路径
-
Route用来设置展示的组件
-
component用于设置匹配的路径展示的组件
-
path设置匹配的路径
-
exact 属性用于让Router中的path与Link中的to完全匹配
-
Switch标签的作用是将包裹在其中的Router中path重复的进行剔除,只留下唯一的Router
// app.js
import Nav from './components/Nav'
import Home from './components/Home'
import {Link, Route} from 'react-router-dom'
function App() {
return (
<p><Link to='/home'>home</Link></p>
<p><Link to='/nav'>nav</Link></p>
<p><Route exact component={Home} path='/home'></Route></p>
<p><Route exact component={Nav} path='/nav'></Route></p>
<Switch>
<Route exact component={Home} path='/home'></Route>
<Route exact component={Home} path='/'></Route>
<Route exact component={Nav} path='/nav'></Route>
<Route exact component={Nav} path='/nav'></Route>
<Route exact component={Nav} path='/nav'></Route>
</Switch>
export default App;
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import {HashRouter} from 'react-router-dom'
ReactDOM.render(
<React.StrictMode>
<HashRouter><App /></HashRouter>
</React.StrictMode>,
document.getElementById('root')
路由入门小案例
当前存在Home、About两个组件,我们希望在页面上的导航栏中实现点击对应标签,即可在页面上显示对应组件的内容。
Home组件:
import React, { Component } from 'react'
export default class Home extends Component {
render() {
return (
<h3>我是Home的内容</h3>
About组件:
import React, { Component } from 'react'
export default class About extends Component {
render() {
return (
<h3>我是About的内容</h3>
App组件
省略import...
export default class App extends Component {
render() {
return (
<div class="row">
<div class="col-xs-offset-2 col-xs-8">
<div class="page-header"><h2>React Router Demo</h2></div>
<div class="row">
<div class="col-xs-2 col-xs-offset-2">
<div class="list-group">
<a class="list-group-item" to='/about'>About</a>
<a class="list-group-item" to='/home'>Home</a>
<div class="col-xs-6">
<div class="panel">
<div class="panel-body">
步骤一:下载路由组件库
install i react-router-dom
步骤二:引用Link标签,替代<a>标签进行跳转:
需要注意的是<Link>其实本质上也是<a>标签,只是说它阻止了a标签默认的跳转动作,但保留了其修改浏览器URL路径的能力。
import {Link,Router, Route} from 'react-router-dom'
export default class App extends Component {
render() {
return (
<div class="row">
<div class="col-xs-offset-2 col-xs-8">
<div class="page-header"><h2>React Router Demo</h2></div>
<div class="row">
<div class="col-xs-2 col-xs-offset-2">
<div class="list-group">
使用Link标签代替 a 标签,这一步是用于实现第一步:浏览器URL的变更
<Link class="list-group-item" to='/about'>About</Link>
<Link class="list-group-item" to='/home'>Home</Link>
<div class="col-xs-6">
<div class="panel">
<div class="panel-body">
步骤三:定义路由对应要跳转的组件:
这一步也比较好理解,前端路由器(会在步骤四配置)会自动检测到浏览器的url发生了变化,此时就会拿新的url地址到路由表中进行匹配,步骤三定义的就是和url匹配成功的路由,将显示对应哪个组件。
import {Link,Router, Route} from 'react-router-dom';
export default class App extends Component {
render() {
return (
<div class="row">
<div class="col-xs-offset-2 col-xs-8">
<div class="page-header"><h2>React Router Demo</h2></div>
<div class="row">
<div class="col-xs-2 col-xs-offset-2">
<div class="list-group">
使用Link标签代替 a 标签,这一步是用于实现第一步:浏览器URL的变更
<Link class="list-group-item" to='/about'>About</Link>
<Link class="list-group-item" to='/home'>Home</Link>
<div class="col-xs-6">
<div class="panel">
<div class="panel-body">
在App.js中,定义路由,路由规定了path对应跳转的组件
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
步骤四:在最外层的index.js中配置前端路由器
这里可以使用Router组件,但我们一般是使用功能更为强大的BrowerRouter或者HashRouter。
import React from 'react'
import ReactDOM from 'react-dom'
// 注意,我们一般不直接引入Router,而是引入 BrowserRouter 或者 HashRouter
import {BrowserRouter} from 'react-router-dom'
import App from './App'
ReactDOM.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById('root'))
.路由组件与一般组件
import React, { Component } from 'react';
import { Link,Route } from 'react-router-dom'
import Home from './pages/Home'
import About from './pages/About'
import Header from './components/Header'
import 'bootstrap/dist/css/bootstrap.min.css'
import 'bootstrap/dist/js/bootstrap'
export default class App extends Component {
render() {
return (
<div>
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<Header a={1}></Header> {/* 一般组件写法 */}
</div>
</div>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
{/* 原生html 要靠<a>跳转不同的页面 */}
{/* <a className="list-group-item" href="./about.html">About</a>
<a className="list-group-item active" href="./home.html">Home</a> */}
{/* 在React中靠路由链接实现切换组件 */}
<Link className="list-group-item" to="/home">Home</Link>
<Link className="list-group-item" to="/about">About</Link>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
{/* 注册路由 路由组件写法 */}
<Route path="/home" component={Home}/>
<Route path="/about" component={About}/>
</div>
</div>
</div>
</div>
</div>
)
}
}
Header 组件代码
import React, { Component } from 'react'
export default class Header extends Component {
render() {
console.log('一般组件',this.props)
return (
<div className="page-header"><h2>React Router Demo</h2></div>
)
}
}
路由组件与一般组件props接收的数据对比图:
路由组件与一般组件的不同之处
1.写法不同:
一般组件: <Demo/>
路由组件: <Route path="/demo" component={Demo}/>
2.存放位置不同:
一般组件: components
路由组件: pages
3.接收到的props不同:
一般组件: 写组件标签时传递了什么,就能收到什么
路由组件: 接收带三个固定的属性
history:
go: ƒ go(n)
goBack: ƒ goBack()
goForward: ƒ goForward()
push: ƒ push(path, state)
replace: ƒ replace(path, state)
location:
pathname: "/home"
search: ""
state: undefined
match:
params: {}
path: "/home"
url: "/home"
包含了LInk跳转以及js触发跳转并传参。
这是项目的目录结构,主要的代码都在src目录下,src下面新建一个containers文件夹放我们的一些组件,router文件夹是配置路由用的。
按照顺序来写:detail文件夹下的代码
import React from 'react'
class Detail extends React.Component {
render() {
return (
<p>Detail,url参数:{this.props.params.id}</p>
在多个组件中使用相同的 Hook 不会共享 state。自定义 Hook 是一种重用状态逻辑的机制,所以每次使用自定义 Hook 时,其中的所有 state和副作用都是完全隔离的。自定义 Hook 本质上只是一个对代码逻辑进行抽取的函数,严格意思上来说,它本身并不是 React 的特性。需求:在组件创建和销毁的时候都进行打印。就可以将这部分的逻辑抽取成一个自定义的 Hook。自定义 Hook 的名称应该始终以 use 开头,除此之外不需要具有任何其他特殊的标识。在其内部可以调用其他的 Hook。
在交互式监视模式下启动测试运行程序。 有关更多信息,请参见关于的部分。
yarn build
构建生产到应用程序build文件夹。 它在生产模式下正确捆绑了React,并优化了构建以获得最佳性能。
最小化构建,文件名包含哈希。 您的应用已准备好进行部署!
有关更多信息,请参见有关的部分。
yarn eject
注意:这是单向操作。 eject ,您将无法返回!
如果您对构建工具和配置选择不满意,则可以随时eject 。 此命令将从项目中删除单个构建依赖项。
相反,它将所有配置文件和传递依赖项(webpack,Babel,ESL
react并没有提供像Vue专门创建路由的页面,react路由需要先安装,然后导入才能使用,下面是react路由从安装到实现的详细步骤,一起来看看吧!
开始前的准备:本案例需要先改造一下react项目的index.js文件
,关闭严格模式,路由才可正常跳转,否则会出现导航栏显示已跳转但是页面未跳转的情况!!
两种常用的路由模式:BrowserRouter和HashRouter声明当前要用是一个非hash的模式的路由包裹整个应用一个React应用只需要使用一次HashRouter,hash模式的路由一个有#(HashRouter),一个一带#(BrowserRouter)(推荐)Link指定导航链接,完成路由跳转to属性指定路由地址,最终被渲染为a标签Routes提供一个路由出口,满足条件的路由组件,会渲染到组件内部Route用于指定路由组件和路由地址path:路由组件对应的路径;
1.React Router4.0基本概述:
React Router4.0(以下简称 RR4)遵循React的设计理念,即万物皆组件。所以 RR4 只是一堆 提供了导航功能的组件(还有若干对象和方法),具有声明式(声明式编程简单来讲就是你只需要关心做什么,而无需关心如何去做,可组合性的特点。
RR4 采用单代码仓库模型架构(monorepo),这意味者这个仓库里面有...
import ReactDOM from 'react-dom'
HashRouter 表示一个路由的跟容器,将来,所有的路由相关的东西,都要包裹在 HashRouter 里面,而且,一个网站中,只需要使用一次 HashRouter 就...
cnpm install -g create-react-app (仅第一次创建项目前需要)
cnpm install react-router-dom@5.2.0 --save(安装6.0以下版本,因为6.0以上版本某些属性已经被迭代)
3.新建两个页面