Vue-Router和React-Routerd對比
*僅從設計理念、使用角度進行對比,不涉及實現原理。*
總的來說,二者的設計理念大致相同,但是由於對應的框架分別是VUE和React,使得它們的使用方式略有些細微的差別。下文的著重點就是對比它們的差別部分。
無論是vue-router還是react-router,它們的最基本的初衷就是實現前端路由。所謂前端路由,簡單來說,就是當瀏覽器的url產生變化時,不向伺服器進行請求,而是直接控制前端頁面產生變化,以期待前端在比如功能切換時,產生類似頁面跳轉等效果。
而這裡面最基本的,無論是vue-router還是react-router,都要提供一種配置方式,讓使用者可以**配置出url路徑和要展示的元件的對應關係**。這樣一來,使用者通過頁面點選或者其他方式觸發瀏覽器url變化時,VUE或者React系統就可以找到這個url對應的VUE元件或者React元件,從而有針對性地,將這個元件在頁面上渲染。
##### 典型程式碼:
###### vue-router
JS:
```
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
const router = new VueRouter({
routes
})
const app = new Vue({
router
}).$mount('#app')
```
HTML:
```
<div id="app">
<h1>Hello App!</h1>
<p>
<router-linkto="/foo">Go to Foo</router-link>
<router-linkto="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口-->
<!-- 路由匹配到的元件將渲染在這裡 -->
<router-view></router-view>
</div>
```
###### react-router
JS/JSX:
```
// modules/Foo.js
import React from 'react'
export default React.createClass({
render() {
return<div>Foo</div>
}
})
```
```
// modules/Bar.js
import React from 'react'
export default React.createClass({
render() {
return<div>Bar</div>
}
})
```
```
// index.js
// ...
render((
<Routerhistory={hashHistory}>
<Route path="/"component={App}>
{/* make them children of `App`*/}
<Route path="/foo"component={Foo}/>
<Route path="/bar"component={Bar}/>
</Route>
</Router>
), document.getElementById('app'))
```
```
// modules/App.js
// ...
render() {
return (
<div>
<h1>React RouterTutorial</h1>
<ulrole="nav">
<li><Linkto="/foo">Go To Foo</Link></li>
<li><Linkto="/bar">Go To Bar</Link></li>
</ul>
{/* 路由匹配到的元件將渲染在這裡 */}
{this.props.children}
</div>
)
}
// ...
```
兩個典型程式碼實際上是有區別的。看似都實現了根路由和兩個自定義路由,但是這裡用的react-router的典型程式碼實際上採用了子路由的方式,而vue-router僅用了並列級別的路由。之所以放這兩種不同的典型程式碼,實際上這樣更容易對比出二者的區別。
- 首先定義元件。定義Foo元件和Bar元件的方式的區別是VUE和React框架語法級別的區別,不在我們的討論範圍之內。
- 元件定義好之後,配置url和元件的對應關係。在典型程式碼中,vue-router定義了一個routes物件,它是一個陣列,陣列中每個物件表示該對應關係。而react-router定義採用了JSX方式,清晰地表示了這個對應關係,以及和/路由的父子關係。需要注意的是:VUE的路由配置要提供給new VueRouter()物件,這個物件要在全域性VUE物件初始化時提供;而React路由則需要配置給全域性<Router/>元件,雖然react-router也提供類似於vue-router典型程式碼中的物件陣列形式的配置方式,但是最終仍是要將配置傳遞給<Router/>。**一個是全域性配置(VUE),一個是全域性元件(React),這是兩者使用上的根本區別之一。**(vue-router並不提供像JSX這種類html的配置方式,它只能以物件方式提供路由配置,這也是框架系統不同所決定的)
- 子路由配置。vue-router在典型程式碼中並沒有體現如何配置子路由,其實就vue-router路由元件的使用來說,無論是哪個級別的路由元件,**都會被渲染到父元件<router-view/>元件標識的地方**。對於react-router,**根路由會被渲染到<Router/>指定的位置,而子路由則會作為子元件,將children物件以引數方式傳入父元件,由父元件將該物件指定渲染位置**。這也是為什麼在典型程式碼中vue-router沒有寫路由的父子關係而react-router的典型程式碼體現了父子路由關係的原因。
#### 使用時的不同點總結:
- vue-router是全域性配置方式,react-router是全域性元件方式。
- vue-router僅支援物件形式的配置,react-router支援物件形式和JSX語法的元件形式配置。
- vue-router任何路由元件都會被渲染到<router-view/>位置,react-router子元件作為children被傳入父元件,而根元件被渲染到<Router/>位置。
相關文章
- 對比Javascript和TypeScriptJavaScriptTypeScript
- 對比XcodeDebugMemoryGraph和FBMemoryProfilerXCode
- vite和webpack對比ViteWeb
- WinRunner和QTP對比QT
- TCP和UDP對比TCPUDP
- RabbitMQ和Erlang相容對比MQ
- Git和SVN的對比Git
- TIDB和MySQL效能對比TiDBMySql
- 對比Restful Api和RpcRESTAPIRPC
- Python 和 Ruby 的對比Python
- 影像對比度和亮度
- Go 與 C++ 的對比和比較GoC++
- 對比 Ubuntu 18.04 和 Fedora 28Ubuntu
- laravel octane和webman對比qpsLaravelWeb
- react和vue的渲染流程對比ReactVue
- 對比JavaScript中的Continue和BreakJavaScript
- Kotlin和Java的簡單對比KotlinJava
- PaddleFluid和TensorFlow基本使用概念對比UI
- Flutter和原生應用效能對比Flutter
- Angular 和 Vue.js 深度對比AngularVue.js
- Angular和Vue.js 深度對比AngularVue.js
- Django和Fastapi非同步效能對比DjangoASTAPI非同步
- Nginx 和 Gunicorn 效能對比測試Nginx
- Class和ClassLoader的getResource方法對比
- 對比Xcode Debug Memory Graph和FBMemoryProfilerXCode
- 驍龍480和麒麟710對比哪個效能好?驍龍480和麒麟710效能對比
- ReferenceField、EmbeddedDocumentField和LazyReferenceField的使用和總結對比
- 談一談對vue-router的簡單理解Vue
- Java HashMap和Go map原始碼對比JavaHashMapGo原始碼
- 五種IO模型介紹和對比模型
- 對比 Redis 中 RDB 和 AOF 持久化Redis持久化
- Java深度拷貝方式和效能對比Java
- Hyperledger Fabric和FISCO BCOS技術對比
- HostGator和SugarHosts主機對比評測
- 圖片相似度對比SSIM和PHash
- SQL 和 SPL 的有序運算對比SQL
- Bagging和Boosting的介紹及對比
- Spring Boot中如何使用JDBC讀取和寫入資料,JDBC和JPA的對比,JdbcTemplate和SimpleJdbcInsert的用法對比Spring BootJDBC