<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
安裝路由模組:
路由模組不是react自帶模組,需要安裝第3方模組:
yarn add react-router-dom@5
路由相關元件:
路由模式元件:包裹整個應用,一個React應用只需要使用一次
localhost:3000/#/first
)localhost3000/first
)導航元件:用於指定導航連結, 最終Link會編譯成a標籤
路由規則定義元件:指定路由規則和對應匹配成功後要渲染的元件
Route:
各元件關係示意圖:
定義路由的模式:
為了日後讓當前專案中所有的元件都受到路由控制,定義在index.js中,在最頂層定義路由模式。src/index.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; import './utils/init' // 引入路由相關元件 路由模式元件,告訴當前專案,我們要使用的路由模式 // HashRouter hash路由模式 // BrowserRouter history路由模式,上線時,需要對nginx進行設定 import { BrowserRouter as Router, HashRouter } from 'react-router-dom' ReactDOM.render( <Router> <App /> </Router>, document.getElementById('root') )
定義路由規則:
路由規則元件可以定義在src/index.js
檔案中,也可以定義在App元件中。
本次定義在src/App.js
檔案中。
import React, { Component } from 'react' // Route 定義路由規則 路由地址和匹配成功後要渲染的元件 import { Route } from 'react-router-dom' // 匹配成功後渲染的元件 import Home from './views/Home' import About from './views/About' class App extends Component { render() { return ( <div> <h3>App元件</h3> <hr /> {/* 定義路由規則 */} <Route path="/home" component={Home} /> <Route path="/about" component={About} /> </div> ) } } export default App
描述:
使用 Link 或 NavLink 元件完成宣告式導航的定義、
Link/NavLink 區別:
如果當前的路由規則和 Navlink 中的 To 所寫的規則一致則新增 class 樣式,
預設名稱為 active,可以通過 activeClassName 來修改匹配成功後樣式名稱。
使用:
import React, { Component } from 'react' // Route 定義路由規則 路由地址和匹配成功後要渲染的元件 // Link 導航元件,它編譯生成後的html標籤只能是 a // NavLink 導航元件,它編譯生成後的html標籤只能是 a,但是它有啟用樣式(位址列中的地址和to屬性匹配,就有內建樣式名) import { Route, Link, NavLink } from 'react-router-dom' // 匹配成功後渲染的元件 import Home from './views/Home' import About from './views/About' class App extends Component { render() { return ( <div> <h3>App元件</h3> <div> {/* <Link to="/home">Home</Link> --- <Link to="/about">About</Link> */} {/* NavLink 匹配規則,預設為模糊匹配 嚴格匹配:exact 修改啟用樣式名稱:activeClassName='aaa' */} {/* <NavLink exact activeClassName='aa' to="/">Home</NavLink> --- */} <NavLink exact to="/">Home</NavLink>--- <NavLink to="/about">About</NavLink> </div> <hr /> {/* 定義路由規則 */} {/* 匹配預設為模糊匹配,而且它還會一直匹配到沒有規則元件為止 嚴格匹配:exact */} <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> </div> ) } } export default App
利用 Switch 嚴格匹配路由:
import React, { Component } from 'react' // Route 定義路由規則 路由地址和匹配成功後要渲染的元件 // Link 導航元件,它編譯生成後的html標籤只能是 a // NavLink 導航元件,它編譯生成後的html標籤只能是 a,但是它有啟用樣式(位址列中的地址和to屬性匹配,就有內建樣式名) // Switch 多個路由規則只匹配一個 import { Route, Link, NavLink, Switch } from 'react-router-dom' // 匹配成功後渲染的元件 import Home from './views/Home' import About from './views/About' class App extends Component { render() { return ( <div> <h3>App元件</h3> <div> {/* <Link to="/home">Home</Link> --- <Link to="/about">About</Link> */} {/* NavLink 匹配規則,預設為模糊匹配 嚴格匹配:exact 修改啟用樣式名稱:activeClassName='aaa' */} {/* <NavLink exact activeClassName='aa' to="/">Home</NavLink> --- */} <NavLink exact to="/">Home</NavLink>--- <NavLink to="/about">About</NavLink> </div> <hr /> {/* 定義路由規則 */} {/* 匹配預設為模糊匹配,而且它還會一直匹配到沒有規則元件為止 嚴格匹配:exact */} <Switch> <Route path="/about" component={About} /> {/* 注意這個規則要放在最後,否則所有路由都會走 home 頁面 */} <Route path="/" component={Home} /> </Switch> </div> ) } } export default App
重定向和404:
import React, { Component } from 'react' // Route 定義路由規則 路由地址和匹配成功後要渲染的元件 // Link 導航元件,它編譯生成後的html標籤只能是 a // NavLink 導航元件,它編譯生成後的html標籤只能是 a,但是它有啟用樣式(位址列中的地址和to屬性匹配,就有內建樣式名) // Switch 多個路由規則只匹配一個 // Redirect 重定向 使用它,一定要用到Switch,否則有死迴圈的問題 import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom' // 匹配成功後渲染的元件 import Home from './views/Home' import About from './views/About' // import Detail from './views/Detail' import Notfound from './views/Notfound' class App extends Component { render() { return ( <div> <h3>App元件</h3> <div> <NavLink exact to="/">Home</NavLink>--- <NavLink to="/about">About</NavLink> </div> <hr /> <Switch> {/* 如果你想用對於匹配渲染成功後的元件使用程式設計式導航,你預設情況下,你只能在規則匹配成功後的元件本身中使用,它的子元件都不行 */} <Route path="/home" component={Home} /> <Route path="/about" component={About} /> {/* 重定向 */} <Redirect exact from="/" to="/home" /> {/* 以上的路由沒有一個匹配成功的,則用404頁面 path屬性不要寫 */} <Route component={Notfound} /> </Switch> </div> ) } } export default App
App.jsx:
import React, { Component } from 'react' import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom' // 匹配成功後渲染的元件 import Home from './views/Home' import About from './views/About' // import Detail from './views/Detail' import Notfound from './views/Notfound' class App extends Component { render() { return ( <div> <h3>App元件</h3> <div> <NavLink exact to="/">Home</NavLink>--- <NavLink to="/about">About</NavLink> </div> <hr /> <Switch> {/* 如果你想用對於匹配渲染成功後的元件使用程式設計式導航,你預設情況下,你只能在規則匹配成功後的元件本身中使用,它的子元件都不行 */} <Route path="/home" component={Home} /> <Route path="/about" component={About} /> {/* 重定向 */} <Redirect exact from="/" to="/home" /> {/* 以上的路由沒有一個匹配成功的,則用404頁面 path屬性不要寫 */} <Route component={Notfound} /> </Switch> </div> ) } } export default App
home元件:
import React, { Component } from 'react' import Btn from './Btn' class Home extends Component { jumpUrl = () => { // 寫法1 // this.props.history.push('/about') // 寫法2 this.props.history.push({ pathname: '/about' }) } render() { return ( <div> <h3>首頁展示</h3> <button onClick={this.jumpUrl}>home元件中回關於</button> <Btn {...this.props} /> </div> ) } } export default Home
btn元件:
import React, { Component } from 'react' class Btn extends Component { jumpUrl = () => { this.props.history.push('/about') } render() { return <button onClick={this.jumpUrl}>在btn元件中回關於</button> } } export default Btn
注意:
到此這篇關於React路由規則定義與宣告式導航及程式設計式導航分別介紹的文章就介紹到這了,更多相關React路由規則內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45