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.mzph.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 ~/.…