前言
以前都是使用vue的脚手架或者是node.js中的路由配置,当用惯了这些后,在使用Umi发现路由怎么都配置不对,我淦!!!,这个游戏也太难了。配了半天也配不对,去官网研究了以下,发现是一个思维逻辑出现了错误。我们来看看。
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题描述
我们就拿vue来说。
import Vue from 'vue'
import Router from 'vue-router'
//import Login from '.././views/login.vue'
//import NotFound from '.././views/404.vue'
//import Home from '.././views/index.vue'
Vue.use(Router)
export default new Router({
mode: 'history',//去掉#号
routes: [
{
path: '/',
component: resolve => require(['../views/404.vue'],resolve)
},
{
path: '/login',
name: 'Login',
component: resolve => require(['../views/login.vue'],resolve)
},
{
path: '/404',
name: 'NotFound',
component: resolve => require(['../views/404.vue'],resolve)
},
]
})
这是一段vue路由的配置,学习过vue的同学都知道,在地址栏中输入对应的路由他会跳转并显示对应的组件。Vue路由匹配默认是严格模式的。
我们再来看看Umi的路由
routes: [
{
path: '/',
component: '../layouts/index',
routes: [
{
path: '/', component: './index'},
]
},
{
path:'/login',component:'./user/index'},
],
在vue的路由代码中,我们在地址栏上输入‘/login’他会跳转到对应的页面,而在Umi中他会出现找不到页面 如图。
那么问题来了,为什么路由配置的时候vue中没有问题,但是在React中就会存在页面不存在的这种情况呢?
二、原因分析
这里我们来解释以下Umi路由匹配机制的运行逻辑。当我们在config或者umirs中配置了路由后,每当输入这个路由地址,程序回去config或umirs文件中去匹配对应的路由。(Umi中路由路由匹配默认是非严格模式,只要满足一点就会进行这个路由)需要注意配置文件中路径默认在pages中的
下属组件都在pages中,可以看到我这里使用的相对路径实在pages中的。
routes: [
//1、首先对 / 进行匹配 , 发现/login 满足 /
{
path: '/',
component: '../layouts/index',
routes: [
{
path: '/', component: './index'},
]
},
{
path:'/login',component:'./user/index'},
],
当程序进入routers中时,向下查询,发现 / 这个路由,而我们地址栏中输入的时/login ,/login 是不是在 / 下面?(是)所以他就会进入 / 这个主路由中,再从 / 主路由中查找 /login路由,但是显而易见,我们在 / 路由下 没有配置 /login的子路由。因此他就会显示找不到页面。
三、解决
这里提供两种方法。
- 1 、让路由匹配变为严格模式。
routes: [
//1、首先对 / 进行匹配 , 发现/login 满足 /
{
path: '/',
component: '../layouts/index',
exact:true,
routes: [
{
path: '/', component: './index'},
]
},
{
path:'/login',component:'./user/index',exact:true},
],
在 / 路由中添加 exact属性。来让路由变为严格模式。exact官网解释地址
- 2、把/login这个路由配置放在 / 路由之前
routes: [
{
path:'/login',component:'./user/index'},
{
path: '/',
component: '../layouts/index',
routes: [
{
path: '/', component: './index'},
]
},
],
如上述配置即可,我们看到当 路由地址中输入 /login的时候,程序进行配置文件中,找到router这个属性进行从上向下匹配。第一个路由时/login,就会进入这个路由。
总结
Umi中路由默认时非严格模式,vue中的路由默认是严格模式的。这个坑真的是搞死我了。