VueRouter和ReactRouter路由对比

本文详细对比了Vue Router和React Router在引入方式、基础组件、路由模式、子路由配置以及参数传递和路由守卫等方面的差异。Vue Router通过Vue.use()安装,常用组件有router-link和router-view,而React Router直接配置在index.js中,常用组件包括Route、Switch和CacheRoute。路由模式上,两者都有hash和history模式,React Router还有额外的BrowserRouter等。在子路由和参数传递上,两者有相似但不同的实现方式。路由守卫方面,Vue Router有全局和组件级别的守卫,React Router则通过不同的API实现类似功能。

本质区别

  • vue-router是全局配置方式,react-router是全局组件方式。
  • vue-router仅支持对象形式的配置,react-router支持对象形式和JSX语法的组件形式配置。
  • vue-router任何路由组件都会被渲染到<router-view/>位置,react-router子组件作为children被传入父组件,而根组件被渲染到<Router/>位置。

一、引入方式不一样

vue必须要通过 Vue.use() 明确地安装路由功能;也可以将Vue.use()和vue-router的引入都放在独立模块中,(比如:router/index.js中,再在main.js中引入router/index.js)

react只需要在index.js中直接进行部分配置即可使用

二、用到的基础组件

vue-router常用组件:keep-alive、router-view

// 定义点击后导航到哪个路径下;对应的组件内容渲染到router-view中

 <router-link :to="{name:'home', params: {id:1}}"> 
 <router-link :to="{path:'/home', query: {id:1}}"> 
 <router-view a=1><router-view/>

// 被keep-alive包裹住的组件,会被vue进行缓存。当组件在keep-alive内被切换时组件的
// activated、deactivated这两个生命周期钩子函数会被执行

react-router常用组件:<switch />、<Route />、<CacheRoute />

// switch组件用来将react的包容性路由转换为排他性路由,每次只要匹配成功就不会继续向下匹配。
// Route组件定义了URL路径与组件的对应关系。

// CacheRoute组件的作用与Route大致相同,使用 CacheRoute 的组件将会得到一个名
//为 cacheLifecycles 的属性,里面包含两个额外生命周期的注入函数 didCache 和 didRecover,
// 分别用在组件 被缓存 和 被恢复 时触发。类比于vue-router中keep-alive实现的效果。

// <Route>组件有三个支持组件渲染属性 render、children、component

	<Route path="path" render={() => <div>这是内联组件写法</div>} />
	//嵌套组合方式
	<Route path="path" render={ props => (
		<ParentComp>
			<Comp {...props} />
		</ParentComp>
	) />

// 当Route有children属性时,不管当前的路径是否与Route匹配,该函数都会执行,
// 同时,children属性也会接受所有由route传入的所有参数

<Route path="path" children={ props => (
		<div className={props.match? "active": ''}>
			<Link to="path" />
		</div>
	) 
/>


<Route path="path" component={Comp} />

三、 路由模式

vue-router主要有hash和history俩种模式:默认hash模式

// hash模式后边有 #
// 改变hash值不会重新加载页面
// hash改变会触发hashChange事件,只改变#后边的url片段, hash发生变化url会被
// 浏览器记录,从而可以使用浏览器的前进和后退

// history模式主要通过history Api的pushState() 和 replaceState()俩个方法来实现
// 刷新操作时会请求服务器,当前端请求地址和服务器不一致时,会报404

react-router是建立在history之上

// 1、BrowserRouter:浏览器的路由方式,也就是在开发中最常使用的路由方式
// 2、HashRouter:在路径前加入#号成为一个哈希值,Hash模式的好处是,
// 再也不会因为我们刷新而找不到我们的对应路径
// 3、MemoryRouter:不存储history,所有路由过程保存在内存里,不能进行前进后退,
// 因为地址栏没有发生任何变化
// 4、NativeRouter:经常配合ReactNative使用,多用于移动端
// 5、StaticRouter:设置静态路由,需要和后台服务器配合设置,比如设置服务端渲染时使用 

四、子路由

Vue-router

// router文件下下的index.js

/* 
  路由定义
*/
Vue.use(VueRouter)

const routes = [{
        path: '/test',
        name: 'test',
        component: () => import('../views/test'),
        children: [{
            path: 'children',
            name: 'children',
            component: () => import('../views/children')
        }]
}]
const router = new VueRouter({
    routes,
})
export default router;

React-Router

// 父组件中
import React, { Component } from 'react';
import children from './children.js'

class FatherPage extends Component {
    constructor(props) {
        super(props);
        this.state = {  }
    }
    render() { 
        return ( 
            <div>
                这是父页面的内容!
            <Switch>
              <Route path='/father/children' component={children}/>
            </Switch>
            </div> 
        );
    }
}
 
export default FatherPage;

五、路由传参跳转

1. Vue

动态路由和query属性传值 页面刷新参数不会丢失, params会丢失

动态路由

const routes = [
    {
        path: '/detail/:id',
        name: 'detail',
        component: Detail
    }
]

// 页面跳转
this.$router.push('/detail/' + id)

// 获取参数
this.$route.params.id

params传值(类似于post)(刷新页面数据会丢失)

const routes = [
    {
        path: '/detail',
        name: 'detail',
        component: Detail
    }
]

// 页面跳转
this.$router.push({
    name: detail,
    params: {
        id: 1
    }
})

// 获取参数
this.$route.params.id

query传值:类似于get(刷新页面不会丢失)

const routes = [
    {
        path: '/detail',
        name: 'detail',
        component: Detail
    }
]

// 页面跳转
this.$router.push({
    path: '/detail',
    query: {
        id: 1
    }
})

// 获取参数
this.$route.query.id

2.React

通配符传参(刷新页面数据不会丢失)

//定义路由

<Route path='/path/:id' component={Path}/>


//在路由点击跳转的时候

<Link to="/path/1">通配符</Link>
// 或者
this.props.history.push('/path/1');


//另一个页面接收传来的参数

this.props.match.params.id

query传参(刷新页面数据会丢失)

this.props.history.push({pathname:'/home', query: {id: '6666'}});
// 接收参数
this.props.location.query.id;

state传参(刷新页面数据会丢失)

this.props.history.push({pathname:'/hone', state:{id: '666'}})
// 接收
this.props.location.state.id;

直接通过url拼接传参

// 跳转方式
this.props.history.push(`/home?${a=1}`) 
// 获取参数
this.props.location.search // "?a=1"

六、路由守卫

vue:

全局守卫:每次路由跳转时都会触发

        全局前置守卫:路由跳转前,进行操作--router.beforeEach

        全局后置守卫:路由跳转后,进行一些操作--router.afterEach

路由独享守卫:可以再路由配置直接定义beforeEnter守卫

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

     组件内的守卫

  • beforeRouterEnter
  • beforeRouterUpdate
  • beforeRouterLeave
<think>Vue 3 React 都是现代前端开发中非常流行的框架,它们各自有不同的设计理念特点。下面我将从多个维度对两者进行详细对比。 ### 1. **设计理念** - **Vue 3**: 渐进式框架,核心库只关注视图层,易于上手,同时提供官方支持的路由、状态管理等库。Vue 的设计强调简单性灵活性,模板语法接近原生 HTML,使得开发者更容易理解编写。Vue 3 引入了 Composition API,提供了更灵活的逻辑复用方式。 - **React**: 声明式、组件化、一次学习,随处编写(支持 Web、移动端等)。React 的核心思想是“UI 即函数”,通过 JSX 将 HTML JavaScript 结合在一起。React 本身只关注视图层,状态管理、路由等由社区或第三方库提供(如 Redux、React Router)。 ### 2. **语法风格** - **Vue 3**: 主要使用基于 HTML 的模板语法(也支持 JSX),模板中可以直接使用指令(如 `v-if`, `v-for`)进行数据绑定逻辑控制。Vue 3 的 Composition API 允许在 `setup()` 函数中组织逻辑,类似于 React Hooks,但更灵活。 - **React**: 使用 JSX(JavaScript XML)将 HTML JavaScript 混合编写,允许在 JavaScript 中直接写 HTML 结构。React 的函数组件 Hooks(如 `useState`, `useEffect`)是现在的主流写法。 ### 3. **状态管理** - **Vue 3**: 使用 `reactive` `ref` 创建响应式数据,通过 `computed` `watch` 处理派生数据副作用。Vue 的响应式系统基于 Proxy,自动追踪依赖。 - **React**: 使用 `useState` 定义状态,`useEffect` 处理副作用(如数据获取、订阅等)。状态更新需要手动调用 setter 函数,React 通过比较状态引用来决定是否重新渲染。 ### 4. **组件通信** - **Vue 3**: - 父传子:Props - 子传父:自定义事件(`emit`) - 兄弟/跨级:Provide/Inject 或 Vuex/Pinia(状态管理库) - **React**: - 父传子:Props - 子传父:回调函数(通过 Props 传递) - 兄弟/跨级:Context API 或 Redux 等状态管理库 ### 5. **性能优化** - **Vue 3**: 响应式系统基于 Proxy,性能更好。编译时优化(如静态提升、补丁标记等)减少运行时开销。Vue 3 支持 Tree-shaking,只打包用到的 API。 - **React**: 使用 Virtual DOM Diffing 算法优化渲染。React 18 引入了并发模式(Concurrent Mode),允许中断渲染以优先处理高优先级任务。 ### 6. **生态系统** - **Vue 3**: 官方维护的路由(Vue Router)、状态管理(Pinia,Vuex 的继任者)、构建工具(Vite)。Vite 提供了极快的开发服务器启动热更新。 - **React**: 社区生态非常丰富,有 React Router路由)、Redux(状态管理)、Next.js(服务端渲染框架)等。Create React App 是官方推荐的脚手架,但 Vite 也支持 React。 ### 7. **TypeScript 支持** - **Vue 3**: 对 TypeScript 支持良好,Composition API 尤其适合 TypeScript。 - **React**: 从 v16 开始对 TypeScript 支持非常好,函数组件 Hooks 都能很好地与 TypeScript 集成。 ### 8. **学习曲线** - **Vue 3**: 模板语法对新手友好,文档清晰,易于上手。 - **React**: JSX 函数式编程概念可能需要一些适应,但一旦掌握,灵活性很高。 ### 代码示例对比 #### Vue 3 组件 (Composition API) ```vue <script setup> import { ref, computed } from 'vue' const count = ref(0) const doubled = computed(() => count.value * 2) function increment() { count.value++ } </script> <template> <button @click="increment">Count is: {{ count }}, doubled: {{ doubled }}</button> </template> ``` #### React 组件 (Hooks) ```jsx import { useState, useMemo } from 'react'; function Counter() { const [count, setCount] = useState(0); const doubled = useMemo(() => count * 2, [count]); const increment = () => setCount(c => c + 1); return ( <button onClick={increment}> Count is: {count}, doubled: {doubled} </button> ); } ``` ### 总结 - **Vue 3** 更适合希望快速上手的开发者,模板语法直观,响应式系统自动处理依赖,官方工具链完善。 - **React** 更适合喜欢 JavaScript 函数式编程的开发者,JSX 提供更大的灵活性,生态庞大。 选择哪个框架取决于团队偏好、项目需求个人风格。 §§相关问题§§: 1. Vue 3 的 Composition API React Hooks 有什么异同? 2. Vue 3 的响应式系统是如何实现的? 3. React 的 Virtual DOM Vue 3 的编译优化有何区别? 4. Vue 3 React 在状态管理方案上有什么不同?</think>### Vue 3 与 React 对比 #### 1. **核心设计理念** - **Vue 3**: 渐进式框架,强调 **"渐进式增强"**。核心库专注视图层,通过官方路由 (Vue Router)、状态管理 (Pinia) 等可增量集成。设计哲学注重 **开发者体验**,提供模板语法单文件组件 (.vue) 降低学习成本。 - **React**: 库而非框架,专注 **"UI 渲染"**。强调 **JavaScript 优先**(JSX),通过社区生态(如 Redux、React Router)扩展功能。核心原则是 **"函数式编程"** **不可变数据**。 #### 2. **语法风格** ```vue <!-- Vue 3 模板语法 (SFC) --> <template> <button @click="increment">{{ count }}</button> </template> <script setup> import { ref } from 'vue'; const count = ref(0); const increment = () => count.value++; </script> ``` ```jsx // React JSX 语法 import { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return <button onClick={() => setCount(c => c + 1)}>{count}</button>; } ``` - **Vue**:类 HTML 模板 + 指令(`v-if`/`v-for`),逻辑与视图分离 - **React**:JSX(JavaScript + HTML 混合),逻辑与视图耦合 #### 3. **响应式系统** - **Vue 3**: 基于 **Proxy** 的自动依赖追踪 ```js import { reactive, watchEffect } from 'vue'; const state = reactive({ count: 0 }); watchEffect(() => console.log(state.count)); // 自动跟踪依赖 ``` - **React**: 基于 **状态快照** 的手动依赖声明 ```jsx import { useState, useEffect } from 'react'; const [count, setCount] = useState(0); useEffect(() => console.log(count), [count]); // 需显式声明依赖 ``` #### 4. **逻辑复用** - **Vue 3**: **Composition API**(`setup()` 或 `<script setup>`) ```vue <script setup> // 复用逻辑 function useCounter(initial) { const count = ref(initial); const increment = () => count.value++; return { count, increment }; } const { count, increment } = useCounter(0); </script> ``` - **React**: **Hooks**(`useState`, `useEffect` 等) ```jsx // 复用逻辑 function useCounter(initial) { const [count, setCount] = useState(initial); const increment = () => setCount(c => c + 1); return [count, increment]; } function MyComponent() { const [count, increment] = useCounter(0); return <button onClick={increment}>{count}</button>; } ``` #### 5. **性能优化** | 特性 | Vue 3 | React 18 | |--------------|--------------------------------|------------------------------| | **编译优化** | 模板编译时静态提升/补丁标记 | JSX 运行时优化 (Fiber) | | **更新粒度** | 组件级自动依赖追踪 | 虚拟 DOM Diff 算法 | | **异步渲染** | Suspense + Async Component | Concurrent Mode + Suspense | #### 6. **生态系统** - **Vue**: 官方全家桶(Vue Router、Pinia、Vite)高度集成 工具链:Vite(极速热更新)、Vitest、Volar 扩展 - **React**: 社区主导(Redux、React Router、MUI) 工具链:Create React App(官方)、Next.js(SSR) #### 7. **TypeScript 支持** - **Vue 3**: 原生 TS 支持 + `<script setup lang="ts">` + Volar 插件 - **React**: 完善的支持(TSX + `@types/react`) --- ### 总结建议: - **选 Vue 3 若**: 需要更低学习曲线、模板语法偏好、自动响应式、官方集成方案。 - **选 React 若**: 偏好 JSX 灵活性、函数式编程、大型社区生态、跨平台需求(React Native)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值