vue-router和react-router嵌套路由layout配置方案的區別

最近在學習react,在路由這一塊有點看不懂,第一感覺是靈活性很大,想怎么來就怎么來,但問題也來了,稍微復雜一點就GG了,不如vue的傻瓜式配置來的方便。

先說一下vue的路由配置方式,目錄結構如下(簡化了結構)

━ src├━ App.vue├━ layout.vue├━ router.js┕━ main.js

main.js的內容是官方標配,沒什么好說的,引入路由配置并加載

import router from './router'  // 引入路由配置
import App from './App.vue'
new Vue({router, // 加載路由配置render: h => h(App)
}).$mount('#app')

App.vue中添加一個router-view作為一級路由視圖

<template><div id="app"><router-view/></div>
</template>

router.js書寫路由配置

import Layout from './layout'
export default new VueRouter({mode: 'history',base: process.env.BASE_URL,routes: [{path: '/',component: Layout,children: [{path: 'about',component: () => import('./About.vue')},{path: 'about2',component: () => import('./About2.vue')}]},{path: '/404',name: '404',component: () => import('./404.vue')}]
})

layout.vue布局文件,中間添加一個router-view作為二級路由視圖

<template><div class="layout-container"><header><router-link to="/">Home</router-link><router-link to="/about">About</router-link><router-link to="/about2">About2</router-link><router-link to="/404">404</router-link></header><router-view class="layout-content"></router-view><footer></footer></div>
</template>

簡單的說一下,
App.vue就是根元素,路徑//404都將對應路由的組件渲染在App中的router-view位置,分別是layout.vue404.vue
路徑/下的子路由aboutabout2對應的完整路徑分別為/about/about2,當匹配這兩個路徑時,首先會在App根元素下渲染一級路由的組件,即layout.vue,然后再在一級路由組件(layout.vue)中的router-view位置渲染二級路由組件。

現在來看一下react-router的工作方式,一個簡單的路由如下(用的是react-router-dom,)
修改App.js,使用了Switch包裹,表示只渲染第一個匹配路由的組件

import React from 'react';
import { BrowserRouter, Route, Link } from "react-router-dom";const Layout = props => (<div className="layout-container"><header><Link to='/'>Home</Link><Link to='/about'>About</Link><Link to='/about2'>About2</Link><Link to='/404'>404</Link></header>{props.children}<footer></footer></div>
)
const About = props => (<div>this is About Page</div>
)
const About2 = props => (<div>this is About2 Page</div>
)
const Page404 = props => (<div>this is 404 Page <Link to="/">GO HOME</Link></div>
)const App = props => (<BrowserRouter><Switch><Route path='/404' component={Page404}></Route><Layout><Route path="about" component={About}></Route></Layout></Switch></BrowserRouter>
)
export default App;

對比vue,react-router一個很明顯的區別就是路由是直接寫在組件中的,這繼承了react的核心思想,一切皆為組件。

其實仔細想想,從感官層面來講,vue-router中的router-view也是一個特殊的組件,功能有點類似vue的動態組件<component />,通過匹配地址與路由,將對應的組件替渲染出來;react-router也是如此,有了Switch,react-router將匹配到的唯一路由對應的組件渲染出來,這樣一想,兩者其實很相似,區別在于vue將這一過程在內部封裝簡化了,而react則顯式的需要我們手動去書寫這一過程。

調試react-router可以發現,在404頁面和home頁面之間切換,頁面時發生變化了的,說明路由生效,但是點擊about頁面無任何變化,這就有點惆悵了,難道不支持嵌套路由???

其實并不是,如果把404路由放到Layout下面去的話(如下更改,下面簡稱代碼2,原來的簡稱代碼1),會發現404頁面也無法切換了

// 代碼2
const App = props => (<BrowserRouter><Switch><Layout><Route path="about" component={About}></Route></Layout><Route path='/404' component={Page404}></Route></Switch></BrowserRouter>
)

這是因為使用了Switch,它只會渲染第一個匹配的組件,那么代碼2中不管匹配到什么地址,Switch在渲染了Layout后就不在渲染其他的路由對應的組件了,那么加一層路由地址呢???(如下代碼3)

const App = props => (<BrowserRouter><Switch><Route path='/'><Layout><Route path='about' component={About}></Route></Layout></Route><Route path='/404' component={Page404}></Route></Switch></BrowserRouter>

結果還是不起作用,通過react-dev-tool發現,內部的路由組件根本沒有發生變化,其實到這里問題就已經很明顯了,加上之前的分析,react復雜路由之所以不生效就是因為路由匹配問題,不管是/404還是/about,在代碼3這種寫法下,路由匹配到<Route path='/'>這里的時候就截至了,不會再往下或往后繼續匹配,這讓我想起了ThinkPHP的路由,需要將靜態路由和長路由寫在前面,或者添加截至符號。react-router可以通過Routeexact屬性來達到完全匹配的效果。代碼修改如下(代碼4)

const App = props => (<BrowserRouter><Switch><Route exact path='/' component={Layout}></Route><Route path='/404' component={Page404}></Route><Layout><Route path='/about' component={About}></Route><Route path='/about2' component={About2}></Route></Layout></Switch></BrowserRouter>
)

代碼4可以實現4個頁面的切換,效果和vue一致。

總結:react的路由配置和vue相比,還是有很大區別的,vue的嵌套路由比較直觀,書寫也很方便,react的路由配置更貼近于傳統的路由配置方式。官方倒是有嵌套路由的案例,但是那個還沒有弄懂,代碼調試不通過,我看的那個應該是舊版的文檔,可能不適用新版的react-router。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281219.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281219.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281219.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟加更.NET7中文手冊,都有哪些新亮點?

11月8號發布了.NET7&#xff0c;從底層性能改進&#xff0c;到上層API升級&#xff0c;讓.NET7綜合性能再度提升&#xff01;同時發布了最新的C#11&#xff0c;也帶來了很多小驚喜。如何快捷學習最新的.NET7和C#11&#xff1f;答案只有一個&#xff0c;微軟官方中文文檔&#x…

jquery對json的各種遍歷

http://caibaojian.com/jquery-each-json.html轉載于:https://www.cnblogs.com/pxffly/p/8442448.html

中級工程師之路

前言&#xff1a;之前在問答中問了一個問題 畢業半年感覺沒什么進步該怎么辦&#xff1f; 這個問題一直讓我感覺比計較焦慮。于是在一個關于面試經驗的博客中找到了一些靈感。就是通過問題進行學習&#xff0c;對自身的知識體系進行整理和補充。以問題作為切入點&#xff0c;不…

Vue在渲染函數createELement和JSX中使用插槽slot

Vue對于插槽有兩個專門的APIvm.$slots和vm.$scopedSlots&#xff0c;分別是普通插槽和作用域插槽&#xff0c;使用JSX語法或渲染函數的時候&#xff0c;定義插槽將使用上述兩個API。 渲染函數createElement 普通插槽和作用域插槽在定義上相差不大&#xff0c;但是在使用方法上…

.NET Conf China 2022 第一批講師陣容大揭秘!整個期待了!

目光看過來2022年12月3-4日一場社區性質的國內規模最大的線上線下.NET Conf 2022技術大會即將盛大開幕目前大會正緊鑼密鼓地進行中第一批大咖講師及主題已確定小編迫不及待想和大家分享分享嘉賓很大咖分享內容很硬核戳戳小手期待ing孔令磊維宏股份 首席架構師 十多年數控領域研…

2017 Material design 第二章第六節《富有創造性的定制方案》

六、富有創造性的定制方案&#xff08;Creative customization&#xff09; 動效可以應用于不同的對象尺寸和不同的環境&#xff0c;這有助于設計美感和功能的統一。 icon的類型系統icons可以有雙重功能。 產品icons應該設計得精致、美觀。 Icons 系統icons一個系統icon也許存在…

(十四)Java springcloud B2B2C o2o多用戶商城 springcloud架構- Spring Cloud構建分布式電子商務平臺...

通過Spring Cloud構建PC微信APP云服務的云商平臺系統&#xff0c;其中包括B2B、B2C、C2C、O2O、新零售、直播電商等子平臺&#xff0c;之前我們講了很多關于Spring Cloud的概念文章&#xff0c;從本節開始&#xff0c;我們會以分布式微服務電子商務平臺為案例&#xff0c;逐步給…

C# 隊列(Queue)

概述隊列&#xff08;Queue&#xff09;代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時&#xff0c;則使用隊列。當您在列表中添加一項&#xff0c;稱為入隊&#xff0c;當您從列表中移除一項時&#xff0c;稱為出隊。Queue 類的方法和屬性Count 獲取 Queu…

vue完全編程方式與react在書寫和運用上的異同

在構建html元素時&#xff0c;vue傾向于模板方式&#xff0c;而react則完全使用javascript的編程能力&#xff0c;但vue也具備完全編程的能力&#xff08;與react一樣使用JSX和createElement渲染函數&#xff09;。所以&#xff0c;當vue使用完全編程方式時&#xff0c;與react…

Solr 配置文件之schema.xml

schema.xml這個配置文件的根本目的是為了通過配置告訴Solr怎樣建立索引。solr的數據結構例如以下&#xff1a;document&#xff1a;一個文檔、一條記錄 field&#xff1a;域、屬性solr通過搜索某個或某些field&#xff0c;返回若干個符合條件的document。或者按搜索的score排序…

wget整站抓取、網站抓取功能;下載整個網站;下載網站到本地

wget -r -p -np -k -E http://www.xxx.com 抓取整站 wget -l 1 -p -np -k http://www.xxx.com 抓取第一級 -r 遞歸抓取-k 抓取之后修正鏈接&#xff0c;適合本地瀏覽 http://blog.sina.com.cn/s/blog_669fb0c3010137bq.html wget -m -e robotsoff -k -E "http://…

Git標簽tag及tag遠程同步

Git給某個歷史版本打上標簽&#xff0c;這樣我們可以快速的眾多歷史版本中找到自己需要的版本&#xff0c;一般打標簽的版本都是發布版本&#xff0c;例如v1.0.0 標簽操作 創建標簽 # 輕量標簽 git tag tagname eg: git tag v1.4# 附注標簽 git tag -a tagname -m tag descr…

妙用SQL Server聚合函數和子查詢迭代求和

先看看下面的表和其中的數據&#xff1a;t_product該表有兩個字段&#xff1a;xh和price&#xff0c; 其中xh是主索引字段&#xff0c;現在要得到如下的查詢結果&#xff1a;從上面的查詢結果可以看出&#xff0c;totalprice字段值的規則是從第1條記錄到當前記錄的price之和。如…

記一次.NET某工控圖片上傳CPU爆高分析

一&#xff1a;背景 1.講故事今天給大家帶來一個入門級的 CPU 爆高案例&#xff0c;前段時間有位朋友找到我&#xff0c;說他的程序間歇性的 CPU 爆高&#xff0c;不知道是啥情況&#xff0c;讓我幫忙看下&#xff0c;既然找到我&#xff0c;那就用 WinDbg 看一下。二&#xff…

微信小程序項目實踐準備工作

微信小程序項目實踐準備工作一、了解微信小程序產品定位及功能介紹微信小程序是一種全新的連接用戶與服務的方式&#xff0c;它可以在微信內被便捷地獲取和傳播&#xff0c;同時具有出色的使用體驗。簡單的說&#xff0c;小程序是微信附屬產品&#xff0c;需要依賴微信&#xf…

VSCode 用戶自定義片段 snippet 基本語法說明

先上一個官方模板&#xff1a; "Print to console": {"prefix": "log","body": ["console.log($1);","$2"],"description": "Log output to console" }prefix 前綴&#xff0c;emmet 觸發條…

Python集合和函數

深淺拷貝&#xff1a;.copy()方法&#xff0c;淺拷貝值拷貝一層。列表中的列表和字典會深拷貝&#xff0c;其他類型會淺拷貝。列表中的列表和字典會隨著副本的修改而改變&#xff0c;其他類型不會隨著副本的改變為改變。ab不是復制&#xff0c;是兩個變量共享同一內存空間&…

從 WinDbg 角度理解 .NET7 的AOT玩法

一&#xff1a;背景 1.講故事前幾天 B 站上有位朋友讓我從高級調試的角度來解讀下 .NET7 新出來的 AOT&#xff0c;畢竟這東西是新的&#xff0c;所以這一篇我就簡單摸索一下。二&#xff1a;AOT 的幾個問題 1. 如何在 .NET7 中開啟 AOT 功能在 .NET7 中開啟 AOT 非常方便&…

.NET Core C#系列之XiaoFeng.ToCast萬能類型轉換器

數據類型相互轉換如&#xff1a;字符串轉整型&#xff0c;字符串轉日期首先要引用 XiaoFeng命名空間下邊三個擴展方法 就是類型轉換的方法最常用的就是 ToCast<T>方法/// <summary> /// 類型相互轉換 /// </summary> /// <typeparam name"T">…

利用 Git OpenSSH 查看/生成 本機 ssh 公鑰

查看本機公鑰 本機公鑰文件一般用戶目錄下的.ssh文件夾&#xff0c;文件夾下有三個文件&#xff0c;分別是 id_rsa 私鑰密碼id_rsa.pub 公鑰內容known_hosts 允許的host地址 使用文本編輯器查看文件id_rsa.pub文件即可 或者使用cat命令查看 # 任意位置打開 Git bash cd ~/.…