vue-router常见问题

182 阅读1分钟

vue-router常见问题

早安,打工人。说“上班”,就感觉像是为生活所迫,不情不愿。说“打工”,就像是带着美好的憧憬,用努力和汗水去创造未来!早安!打工人!

重定向页面

1、第一种方法

const router = new VueRouter({
    routes:[
        { path:'/a',redirect:'/b' }
    ]
})

2、第二种方法

const router = new VueRouter({
    routes:[
        { path:'/a',redirect:{name:'foo'}}
    ]
})

3、第三种方法

const router = new VueRouter({
    routes:[
        {
            path:'/a',
            redirect:to =>{
                const {hash,params,query} =to
                if(query.to === 'foo'){
                    return { path:'/foo',query:null }
                }else{
                    return '/b'
                }
            }
        }
    ]
})

路由传参数

第一种params传参

1、编程式导航形式传参,通过name匹配路由【不会在URL路径中显示,刷新页面参数丢失

//传递方式,通过name匹配路由
this.$router.push({
    name:'name', //路由中配置的name名
    params:{id:123}
});
//获取参数方法
this.$route.query.name
//传参后形成的路径,刷新页面时参数丢失
---/path

2、编程式导航形式传参,通过path匹配路由【在URL路径中显示,刷新页面参数不丢失】

//配置路由
path:'/path/:id'
//传递方式,通过path匹配路由,且在path后面跟上对应的值
this.$router.push({
    path:`/path/${id}`
})
//获取参数方法
this.$route.params.id
//传参后形成的路径,刷新页面时参数不丢失
---/path/id(值)

3、router-link形式传参【在URL路径中显示参数,刷新页面参数不丢失】

//配置路由
path:'/path/:id'
//传递方式,在path后面跟上对应的值
<router-link :to="`/path/${id}`"><router-link>
//获取参数方法
this.$route.params.id
//传参后形成的路径,刷新页面时参数不丢失
---/path/id(值)

第二种query传参---(推荐)

1、编程式导航形式传参,通过name匹配路由【在URL路径中?后面显示参数,刷新页面不丢失】

//传递方式,通过name匹配路由
this.$router.push({
    name:'name', //路由配置中的name名
    query:{id:'123'}
});
//获取参数
this.$route.query.name
//传递后形成的路径,刷新页面时参数不丢失
---/path?id=123

2、编程式导航形式传参,通过path匹配路由【在URL路径中?后面显示参数,刷新页面不丢失】

//传递方式,通过path匹配路由
this.$router.push({
    path:'/path',
    query:{id:'123'}
});
//获取参数
this.$route.query.name
//传递后形成的路径,刷新页面时参数不丢失
---/path?id=123

3、router-link形式传参【在URL路径中?后面显示参数,刷新页面不丢失】

//传递方式
<router-link :to="/path?id=123"><router-link>
//或者
<router-link :to="{path:'/path',query:{id:'123'}}"><router-link>
//获取参数
this.$route.query.name
//传递后形成的路径,刷新页面时参数不丢失
---/path?id=123

第三种meta(路由元信息)获取参数

//路由
{
    path:'/home',
    name:'home',
    component:load('home'),
    meta:{title:'首页'}
}
//获取路由参数方法
this.$route.meta.title

路由懒加载

function load(component) {
    //return resolve => require([`views/${component}`], resolve);
    return () => import(`views/${component}`);
}

const routes = [
    {
        path: '/home',
        name: 'home',
        component: load('home'),
        meta: {
            title: '首页'
        },
    },
]

动态加载路由

使用Router的实例方法addRouter来实现动态加载路由,一般用来实现菜单权限

使用时要注意,静态路由文件不能有404路由,而要通过addRouter一起动态添加进去

const routes = [
    {
        path: '/overview',
        name: 'overview',
        component: () => import('@/views/account/overview/index'),
        meta: {
            title: '概况预览',
            pid: 888,
            nid: 666
        },
    },
    {
        path: '*',
        redirect: {
            path: '/'
        }
    }
]
vm.$router.options.routes.push(...routes);
vm.$router.addRoutes(routes);

路由跳转打开新窗口

const obj = {
    path:'/home', 跳转的路由地址
    query:{id:'123'} //可以带参数
}
const {href} = this.$router.resolve(obj);
window.open(href,'_blank');
---------------------或者-----------------------
handelLink(row){
    let link = this.$router.resolve({
        path:'/home',
        query:{id:row.id}
    });
    window.open(link.href,'_blank')
}