前言 | ❤️ 被人理解的感觉,就是有人提着灯笼,照见蹲在黑暗角落的你 ❤️ |
---|
现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序。因为它的用户体验更好、对服务器压力更小,所以更受欢迎。为了有效的使用单个页面来管理多页面的功能,前端路由应运而生。
1️⃣ 安装: yarn add react-router-dom
,如果没有安装yarn工具的,需要先全局安装一下yarn:npm install -g yarn
2️⃣ 导入路由的三个核心组件: Router / Route / Link
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
3️⃣ 使用 Router 组件包裹整个应用(重要)
<Router>
<div className="App">
// … 省略页面内容
</div>
</Router>
4️⃣ 使用 Link 组件作为导航菜单(路由入口)
<Link to="/first">页面一</Link>
5️⃣ 使用 Route 组件配置路由规则和要展示的组件(路由出口)
const First = () => <p>页面一的页面内容</p>
<Router>
<div className="App">
<Link to="/first">页面一</Link>
<Route path="/first" component={First}></Route>
</div>
</Router>
完整代码演示如下:
import React from 'react'
import ReactDOM from 'react-dom'
/*
react-router-dom 的基本使用:
1 安装: yarn add react-router-dom
*/
// 2 导入组件:
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
const First = () => <p>页面一的内容</p>
// 3 使用Router组件包裹整个应用
const App = () => (
<Router>
<div>
<h1>React路由基础</h1>
{/* 4 指定路由入口 */}
<Link to="/first">页面一</Link>
{/* 5 指定路由出口 */}
<Route path="/first" component={First} />
</div>
</Router>
)
ReactDOM.render(<App />, document.getElementById('root'))
// to属性:浏览器地址栏中的pathname(location.pathname)
<Link to="/first">页面一</Link>
// path属性:路由规则
// component属性:展示的组件
// Route组件写在哪,渲染出来的组件就展示在哪
<Route path="/first" component={First}></Route>
完整代码演示如下:
import React from 'react'
import ReactDOM from 'react-dom'
/*
常用组件说明
*/
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
// import { HashRouter as Router, Route, Link } from 'react-router-dom'
const First = () => <p>页面一的内容</p>
// 使用Router组件包裹整个应用
const App = () => (
<Router>
<div>
<h1>React路由基础</h1>
<div>
{/* 指定路由出口 */}
<Route path="/first" component={First} />
</div>
{/* 指定路由入口 */}
<Link to="/first">页面一</Link>
</div>
</Router>
)
ReactDOM.render(<App />, document.getElementById('root'))
完整代码演示如下:
import React from 'react'
import ReactDOM from 'react-dom'
/*
路由的执行过程
*/
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
const First = () => <p>页面一的内容</p>
const Home = () => <h2>这是Home组件的内容</h2>
// 使用Router组件包裹整个应用
const App = () => (
<Router>
<div>
<h1>React路由基础</h1>
<div>
{/* 指定路由出口 */}
<Route path="/first" component={First} />
<Route path="/home" component={Home} />
</div>
{/* 指定路由入口 */}
<Link to="/first">页面一</Link>
<br />
<Link to="/home">首页</Link>
</div>
</Router>
)
ReactDOM.render(<App />, document.getElementById('root'))
push(path)
:跳转到某个页面,参数path表示要跳转的路径;go(n)
:前进或后退功能,参数n表示前进或后退页面数量(比如:-1 表示后退到上一页);完整代码演示如下:
import React from 'react'
import ReactDOM from 'react-dom'
/*
编程式导航
*/
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
class Login extends React.Component {
handleLogin = () => {
// 使用编程式导航实现路由跳转
// ...省略其他功能代码
this.props.history.push('/home')
}
render() {
return (
<div>
<p>登录页面:</p>
<button onClick={this.handleLogin}>登录</button>
</div>
)
}
}
const Home = props => {
const handleBack = () => {
// go(-1) 表示返回上一个页面
props.history.go(-1)
}
return (
<div>
<h2>我是后台首页</h2>
<button onClick={handleBack}>返回登录页面按钮</button>
</div>
)
}
const App = () => (
<Router>
<div>
<h1>编程式导航:</h1>
<Link to="/login">去登录页面</Link>
<Route path="/login" component={Login} />
<Route path="/home" component={Home} />
</div>
</Router>
)
ReactDOM.render(<App />, document.getElementById('root'))
'/'
<Route path="/" component={Home} />
pathname
以path开头就会匹配成功;path
代表Route组件的path属性;pathname
代表Link组件的to属性(也就是 location.pathname);完整代码演示如下:
import React from 'react'
import ReactDOM from 'react-dom'
/*
模糊匹配模式
*/
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
const Home = () => <p>进入页面的时候,你能看到我吗?</p>
const Login = () => <p>我是Login组件的内容</p>
const App = () => (
<Router>
<div>
<h1>默认路由</h1>
<Link to="/first/a/b/c">登录页面</Link>
{/* 默认路由 */}
<Route path="/" component={Home} />
<Route path="/first" component={Login} />
</div>
</Router>
)
ReactDOM.render(<App />, document.getElementById('root'))
exact
属性,让其变为精准匹配模式;path
和pathname
完全匹配时才会展示改路由;完整代码演示如下:
import React from 'react'
import ReactDOM from 'react-dom'
/*
模糊匹配模式
*/
import { BrowserRouter as Router, Route, Link } from 'react-router-dom'
const Home = () => <p>进入页面的时候,你能看到我吗?</p>
const Login = () => <p>我是Login组件的内容</p>
const App = () => (
<Router>
<div>
<h1>默认路由</h1>
<ul>
<li>
<Link to="/">首页</Link>
</li>
<li>
<Link to="/login">登录页面</Link>
</li>
</ul>
{/* 默认路由,添加 exact 属性,就会让当前路由变为精确匹配 */}
<Route exact path="/" component={Home} />
<Route path="/login" component={Login} />
</div>
</Router>
)
ReactDOM.render(<App />, document.getElementById('root'))
推荐:给默认路由添加 exact 属性;
React 路由
可以有效的管理多个视图(组件)实现 SPA;Router 组件
包裹整个应用,只需要使用一次;Link
组件是入口,Route
组件是出口;props.history
实现编程式导航;exact
变精确匹配;React 路由
的一切都是组件,可以像思考组件一样思考路由;由于内容较多,所以我决定分开写啦,我会坚持一直更新呢!喜欢的朋友们记得点点赞哦!