在上一篇react路由之旅中,我們簡單地配置了react,進行了react路由及相關知識的學習,引入以及實現一個局部跳轉的功能,接下來就是深入學習路由的嵌套以及傳參,這是工作中主要用要的。
我的react已經配置了redux(見我的redux之旅),所以這是在引入的插件里做的演示。
從App組件跳轉到NewRoute組件(需要簡單的路由跳轉,點擊自己預習)
(1)新建一個demo:
這里使用了render方式在一個文件中模擬了多個組件的效果 代碼只為講解使用在真實開發中盡量不要這樣寫代碼的。
這段代碼中,我們模擬了3層路由,路徑和界面如下:
代碼提供給大家
1 import React, { Component } from 'react' 2 3 import{ 4 HashRouter as Router,//路由會帶#號 5 Route, 6 NavLink 7 } from "react-router-dom" 8 9 export default class NewRoute extends Component { 10 render() { 11 return ( 12 <div> 13 <Router> 14 <Route path="/" render={()=>{ 15 return( 16 <div> 17 <p>這行顯示的是"/"的組件</p> 18 <Route path="/a" render={()=>{ 19 return( 20 <div> 21 <p>這樣顯示的是"/a"的組件</p> 22 <Route path="/a/b" render={()=>{ 23 return(<p>這行顯示的是"/a/b"的組件</p>) 24 }}></Route> 25 </div> 26 ) 27 }}></Route> 28 </div> 29 ) 30 }}></Route> 31 </Router> 32 </div> 33 ) 34 } 35 }
(2)用子組件形式實現上面的demo:
效果如下:
如果你對現在的頁面效果不滿意,可以添加多個link,並且在Switch中添加多個路由,真實還原網站。
(3)實際開發中:
App.js中代碼:
indexPage.js中代碼:
userPage.js中的代碼:
這是一套基本的業務流程,不僅涉及到界面跳轉,嵌套,還有網頁不存在的重定向,它們之間是向下調用的關系 App.js中 path = / 會調用 indexPage.js indexPage.js path = /user 會調用 userPage.js userPage.js path = /user/one 會調用最終顯示組件。
(4)我們打印一下shopPage的this,看看里面有什么:
想得到當前的路徑,用this.props.match.url是個不錯的選擇
(5)多級路由中地址的拼接:
拼接的作用,可以隨意切換組件間的調用,比如隨時在/b之前再插入一層地址,也可以直接整個組件移動到其它路徑之下。
我們現在在這里呢,復制了一份userPage界面,命名為userPage1,把他的路徑命名為c,並把b組件引入了userPage和userPage1:
userPage組件:
userPage1組件:
此時此刻,在各自的路徑下打開b組件的截圖:
(6)我們的組件,有時候只是一個模板,需要接受傳值,才能起到自己的作用,然后就說一下組件傳值:
路由傳值的常用方式:params(/)、hash(#)、search(?)、state
(7)params(/)
● 上面代碼中是在定義路由組件中
● 注意path地址中斜杠后面 :id
● 其中:冒號可以理解為即將聲明一個變量
● 變量的名字是id
拓展內容,參數正則匹配
● /:id?后面?號表示可有可無
● /name_:id前面加name必須匹配/name_XXX
● /:id(\d+)括號中的內容為正則,這里表示:id必須是數字才會匹配
取值需要在對應的component定義的組件 UserPage中使用 this.props.match.params.id 地址欄輸入上圖的地址(/id001)取到的結果就是 id001
在此為我的粗心表示歉意,直到我最后用state傳值菜發現,沒有給大家講Link,而是直接在瀏覽器的網址直接寫了數據,然后讓大家看的控制台,僅僅是取了一個數據,這次重新編輯給大家補上Link的代碼,大家心里想象截圖上有一個Link就好了,當然,沒有link,直接在網址里加入數據是沒錯的,只不過心里膈應,怕大家看不懂。如果你要把這行代碼補到 組件,記得外面包一層Router
<Link to={ ' /a/ ' + ' id001 ' } activeClassName='active'>點擊跳轉</Link>
1 <Link to={ 2 { 3 pathname:"/a", 4 hash:'#name=zhang', 5 query:{name: 'zhang'}, 6 state:{name:'zhang'} 7 } 8 }>點擊跳轉 9 </Link>
再次給各位姥爺磕頭!
(8)hash(#)
正常的path:
頁面給到值:
此時的控制台打印this
● 在regPage.js頁面中直接使用 this.props.location.hash 取值
● 打印結果是地址欄包括#號及后面所有的值
● 該方式需要在對鍵值對進行處理相對比較麻煩
(9)search(?)
用法優缺點問題與上面的hash十分類似
正常的path:
界面:
控制台:
(10)state
代碼是這樣的:
頁面是這樣的:
控制台:
在regPage.js組件中通過 this.props.location.state取值
總結:這次寫博客經歷了一次大改和一次補充,總的來說我這個人是懶的,克服困難,加油吧