React(7)—— SPA应用 - React路由机制 - react-router-dom
生活随笔
收集整理的這篇文章主要介紹了
React(7)—— SPA应用 - React路由机制 - react-router-dom
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、理解
- 1. SPA的理解
- 2. 路由的理解
- 2.1 什么是路由?
- 2.2 路由的分類
- 1. 前端路由
- 2. 后端路由
- 3. react-router-dom 的理解
- 二、react-router-dom相關API
- 1. 內置組件
- 2. 其它
- 三、路由的使用
- 1. 效果
- 2. 準備
- 3. 路由的基本使用
- 4. 實現
- index.js
- App.jsx
- 5. 路由組件與一般組件的區別
- 6. NavLink與封裝NavLink
- 7. Switch的使用
- 8. 解決多級路徑刷新頁面樣式丟失的問題
- 9. 路由的嚴格匹配與模糊匹配
- 10. Redirect的使用 【重定向】
- 四、嵌套路由使用
- 1. 最終效果
- 2. 注意
- 3. 實現
- Home/index.jsx
- 五、向路由組件傳遞參數數據
- 1. 效果
- 2. 具體方法
- 方法1. params參數
- Message/index.jsx
- Detail/index.jsx
- 方法2. search參數
- 方法3. state參數
- Message/index.jsx
- Detail/index.jsx
- 六、多種路由跳轉方式
- 1. 編程式路由導航
- 2. withRouter的使用
- 七、注意
- BrowserRouter與HashRouter的區別
一、理解
1. SPA的理解
2. 路由的理解
2.1 什么是路由?
2.2 路由的分類
1. 前端路由
2. 后端路由
3. react-router-dom 的理解
二、react-router-dom相關API
1. 內置組件
2. 其它
三、路由的使用
1. 效果
2. 準備
3. 路由的基本使用
< Link to="/xxxxx">Demo< /Link >
< Route path='/xxxx' component={Demo}/ >
4. 實現
index.js
這里用一個標簽將整個App包起來,保證使用的是同一個路由器
//引入react核心庫 import React from 'react' //引入ReactDOM import ReactDOM from 'react-dom' // import {BrowserRouter} from 'react-router-dom' //引入App import App from './App'ReactDOM.render(<BrowserRouter><App/></BrowserRouter>,document.getElementById('root') )App.jsx
import React, { Component } from 'react' import { Link,Route } from 'react-router-dom' import Home from './Home' import About from './About'export default class App extends Component {render() {return (<div><div className="row"><div className="col-xs-offset-2 col-xs-8"><div className="page-header"><h2>React Router Demo</h2></div></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="/about">About</Link><Link className="list-group-item" to="/home">Home</Link></div></div><div className="col-xs-6"><div className="panel"><div className="panel-body">{/* 注冊路由 */}<Route path='/about' component={About} /><Route path='/home' component={Home} /></div></div></div></div></div>)} }5. 路由組件與一般組件的區別
一般組件:<Demo/>
路由組件:<Route path="/demo" component={Demo}/>
一般組件:components
路由組件:pages
一般組件:寫組件標簽時傳遞了什么,就能收到什么
路由組件:接收到三個固定的屬性
6. NavLink與封裝NavLink
NavLink可以實現路由鏈接的高亮,通過activeClassName屬性指定樣式名,默認是"active"
<NavLink activeClassName="demo" className="list-group-item" to="/home">Home</NavLink>可以自己封裝一個NavLink【一般組件】
import React, { Component } from 'react' import {NavLink} from 'react-router-dom'export default class MyNavLink extends Component {render() {// console.log(this.props);return (<NavLik activeClassName="demo" className="list-group-item" {...this.props} />)} }標簽體內容是特殊的標簽屬性通過this.props.children可以獲取標簽體內容
使用
7. Switch的使用
這樣只要匹配到了第一個就不會再往下匹配了
8. 解決多級路徑刷新頁面樣式丟失的問題
9. 路由的嚴格匹配與模糊匹配
10. Redirect的使用 【重定向】
一般寫在所有路由注冊的最下方,當所有路由都無法匹配時,跳轉到Redirect指定的路由
具體編碼:
四、嵌套路由使用
1. 最終效果
2. 注意
3. 實現
Home/index.jsx
import React, { Component } from 'react' import { Route, NavLink,Redirect,Switch } from 'react-router-dom' import News from './News' import Message from './Message'export default class Home extends Component {render() {return (<div><h3>我是Home的內容</h3><div><ul className="nav nav-tabs"><li><NavLink className="list-group-item" to="/home/news">News</NavLink></li><li><NavLink className="list-group-item" to="/home/message">Message</NavLink></li></ul><Switch><Route path='/home/news' component={News} /><Route path='/home/message' component={Message} /><Redirect to='/home/news' /></Switch></div></div>)} }五、向路由組件傳遞參數數據
1. 效果
2. 具體方法
方法1. params參數
Message/index.jsx
import React, { Component } from 'react' import { Link, Route } from 'react-router-dom'; import Detail from './Detail';export default class Message extends Component {state = {messageArr: [{ id: '01', title: '消息1' },{ id: '02', title: '消息2' },{ id: '03', title: '消息3' },]}render() {const { messageArr } = this.state;return (<div><ul>{messageArr.map((msgObj) => {return (<li key={msgObj.id}>{/* 向路由組件傳遞params參數 */}<Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link></li>)})}</ul><hr />{/* 聲明接收params參數 */}<Route path="/home/message/detail/:id/:title" component={Detail}/></div>)} }Detail/index.jsx
import React, { Component } from 'react'export default class Detail extends Component {state = {detailData : [{ id: '01', content: '你好啊' },{ id: '02', content: '還不錯鴨' },{ id: '03', content: '顯示我吧' }]}render() {console.log(this.props)// 接收params參數const { id, title } = this.props.match.paramsconst findResult= this.state.detailData.find((dataObj) => {return dataObj.id === id})return (<div><ul><li>ID: {id }</li><li>Title: {title }</li><li>Content: { findResult.content}</li></ul></div>)} }方法2. search參數
方法3. state參數
Message/index.jsx
export default class Message extends Component {render() {const {messageArr} = this.statereturn (<div><ul>{messageArr.map((msgObj)=>{return (<li key={msgObj.id}>{/* 向路由組件傳遞params參數 */}{/* <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link> */}{/* 向路由組件傳遞search參數 */}{/* <Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link> */}{/* 向路由組件傳遞state參數 */}<Link to={{pathname:'/home/message/detail',state:{id:msgObj.id,title:msgObj.title}}}>{msgObj.title}</Link></li>)})}</ul><hr/>{/* 聲明接收params參數 */}{/* <Route path="/home/message/detail/:id/:title" component={Detail}/> */}{/* search參數無需聲明接收,正常注冊路由即可 */}{/* <Route path="/home/message/detail" component={Detail}/> */}{/* state參數無需聲明接收,正常注冊路由即可 */}<Route path="/home/message/detail" component={Detail}/></div>)} }Detail/index.jsx
import React, { Component } from 'react' // import qs from 'querystring'export default class Detail extends Component {render() {console.log(this.props);// 接收params參數// const {id,title} = this.props.match.params // 接收search參數// const {search} = this.props.location// const {id,title} = qs.parse(search.slice(1))// 接收state參數const {id,title} = this.props.location.state || {}const findResult = DetailData.find((detailObj)=>{return detailObj.id === id}) || {}return (<ul><li>ID:{id}</li><li>TITLE:{title}</li><li>CONTENT:{findResult.content}</li></ul>)} }六、多種路由跳轉方式
1. 編程式路由導航
借助this.prosp.history對象上的API對操作路由跳轉、前進、后退
- this.prosp.history.push(path, [state]) 將新條目推入歷史記錄堆棧
- this.prosp.history.replace(path, [state]) 替換歷史記錄堆棧上的當前條目
- this.prosp.history.go() 將歷史堆棧中的指針移動n個條目
- this.prosp.history.goBack() 等同于 go(-1)
- this.prosp.history.goForward() 等同于 go(1)
2. withRouter的使用
export default withRouter(Header)withRouter可以加工一般組件,讓一般組件具備路由組件所特有的API
withRouter的返回值是一個新組件
七、注意
BrowserRouter與HashRouter的區別
BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
HashRouter使用的是URL的哈希值。
BrowserRouter的路徑中沒有#,例如:localhost:3000/demo/test
HashRouter的路徑包含#,例如:localhost:3000/#/demo/test
(1) BrowserRouter沒有任何影響,因為state保存在history對象中。
(2) HashRouter刷新后會導致路由state參數的丟失!!!
總結
以上是生活随笔為你收集整理的React(7)—— SPA应用 - React路由机制 - react-router-dom的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式事务前看懂CAP、BASE
- 下一篇: 闭关修炼(十)单例设计