1、包容性路由。多个<Route>
可以同时进行匹配和渲染,例如:如果路由有/food 和 /food/1 那么在匹配 /food 的时候两个都能匹配到。而react-router v4以后的版本就是以包容性路由为基础。例如:如果路由有/food 和 /food/1 那么在匹配 /food 的时候两个都能匹配到。
2、排他性路由。属于自上向下的匹配方式,只要匹配成功一个,就不会再继续向下匹配。vue的路由实现方式就属于是排他性路由。
vue-router与react-router在使用方式上虽然有较大差异,但是其实提供的功能是大同小异的,下面我们来详细的对比下看看。
1、引入方式
a.vue必须要通过 Vue.use() 明确地安装路由功能;也可以将Vue.use()和vue-router的引入都放在独立模块中,(比如:router/index.js中,再在main.js中引入router/index.js)。
b.react只需要在index.js中直接进行部分配置即可使用。
2、router的基础组件
a.vue-router的常用组件主要是keep-alive、router-link和router-view。
b.react-router的常用组件主要是<switch />、<Route />和<CacheRoute />。
Route组件定义了URL路径与组件的对应关系。
CacheRoute
的组件将会得到一个名为 cacheLifecycles
的属性,里面包含两个额外生命周期的注入函数 didCache
和 didRecover
,分别用在组件 被缓存
和 被恢复
时触发。类比于vue-router中keep-alive实现的效果。3、路由的配置
a.vue-router路由的属性配置。
{ path:"/two/:id", component:Two, }
vue-router的大概目录
b.react-router的路由配置。
不同于vue-router的使用对象来配置路由,react-router配置路由的方式可以使用Object,也可以使用jsx进行路由的配置。
不需要像vue那样麻烦的用到一个单独的文件夹,react只需要在index.js中部分配置即可
4、路由模式
a.vue-router主要分为hash和history两种模式
b.react-router是建立在history之上的,常用的history有browserHistory、hashHistory和createMemoryHistory三种模式
example.com/some/path
这样真实的 URL 。服务器需要做好处理 URL 的准备。处理应用启动最初的 /
这样的请求应该没问题,但当用户来回跳转并在 /accounts/123
刷新时,服务器就会收到来自 /accounts/123
的请求,这时你需要处理这个 URL 并在响应中包含 JavaScript 应用代码。#
)部分去创建形如 example.com/#/some/path
的路由。和另外两种history的一点不同是你必须创建它,这种方式便于测试。
5、react路由有两个重要的属性:children和render,这两个有什么区别?
a.Route 可以写行间render,render={()=>{return }}
b.也可以写行间children={()={return }}
c.不管匹配与否children都执行
d.render优先级比children高
6、通过路由传递参数
a.react的路由参数传递
//在定义路由的时候 <Route path=‘/path/:自己起个名字‘ component={Path}/>
<Link to="/path/你要传的参数">通配符</Link>
this.props.match.params.你起的名字 |
---|
// 路由定义 <Route path=‘/query‘ component={Query}/> // 跳转的时候 <Link to={query}>query</Link> // 另一个页面使用的时候 this.props.location.query 这里的this.props.location.query === ‘我是通过query传值‘ |
---|
state传参(刷新页面数据丢失,同query差不多,只是属性不一样,而且state传的参数是加密的,query传的参数是公开的)
// Route定义 <Link to={state}>state</Link> // 使用的时候 var state = { // 另一个页面获取值的时候 this.props.location.state 这里的this.props.location.state === ‘我是通过query传值‘ |
---|
直接通过url拼接传参
// 跳转方式this.props.history.push(`/child02?${a=1}`) // 获取参数this.props.location.search // "?a=1" |
---|
b.vue的路由参数传递
//在定义路由的时候 { //在使用的时候 this.$router.push({ path: `/describe/${id}` }) //接收页面获取值 this.$route.params.id |
---|
//在使用的时候 this.$router.push({ name: ‘Describe‘, params{id: id} }) //接收页面获取值 this.$route.params.id |
---|
query传参,传餐的时候在url显示?key=value&key=value
//在使用的时候 this.$router.push({ path: ‘/describe‘, query: { id: id } }) //接收页面获取值 |
---|
1、在之前的版本中,React Router 也提供了类似的 onEnter
钩子,但在 React Router 4.0 版本中,取消了这个方法。
2、vue的路由守卫主要分为全局守卫和组件守卫两部分
a.全局守卫
router.beforeEach
类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用)
const router = new VueRouter({ }) //与全局前置守卫的方法参数是一样的 |
---|
b.组件内守卫
beforeRouteUpdate
—— 当前路由改变,但是该组件被复用时调用
针对beforeRouterEnter不能获取到this的问题
//beforeRouteEnter守卫不能访问this, beforeRouteEnter (to, from, next) { |
---|
3、完整的导航解析流程
beforeEach
守卫。beforeRouteUpdate
守卫(2.2+)。beforeEnter
。beforeRouteEnter
。beforeResolve
守卫(2.5+)。afterEach
钩子。beforeRouteEnter
守卫中传给next
的回调函数。1、依据各自框架的风格,有各自的引入方式;
2、提供了不同的基础组件,但是使用方式却是大同小异,实现的功能也基本相同;
3、配置方式不同,但是最后结合起来其实都是数据和组件的结合;
4、传递参数的方式基本相同,react在url中拼接参数的方式更类似于原生的从URL中获取参数;
5、react移除了路由守卫,vue依旧保留,但是react的路由守卫其实也可以通过react的高阶组件来进行手动实现。
总的来说,vue-router和react-router实际上是依据各自框架以及生态系统来进行具体的实现。呈现给开发者的功能事实上是大同小异的,但是整体的风格和依赖还是以当前框架为基准。无论使用哪个框架,他的生态系统都足够丰富,足以支撑我们的各种想法的实现。
参考文献:https://cn.vuejs.org/v2/guide/routing.html
http://react-guide.github.io/react-router-cn/
原文:https://www.cnblogs.com/marui01/p/13215468.html