为了账号安全,请及时绑定邮箱和手机立即绑定

Vue 路由器无法识别 :lang 作为参数

Vue 路由器无法识别 :lang 作为参数

HUH函数 2022-10-21 14:59:21
我有以下代码:import Router from 'vue-router';let mainRoutes = [    {path: '/first', component: () => import('./pages/First')},        {path: '/second', component: () => import('./pages/Second')},        {path: '/third', component: () => import('./pages/Third')},  ];const router = new Router({  mode: 'history',  base: process.env.BASE_URL,  scrollBehavior() {    return {x: 0, y: 0}  },  routes: [    {        path: '/:lang',        component: () => import('./layouts/Main'),        children: mainRoutes,        meta: {requiresAuth: true, permissions: true}    },    {        path: '*',        component: () => import('@/pages/errors/404')    }  ]})router.beforeEach((to, from, next) => {    if (!to.query.lang) {        to.query.lang= 'ru';        next({ path: to.path, query: to.query });      } else {        next();      }});export default router我想要的是:每次输入某些路由时,我都希望 vue-router 检查它是否具有 lang 参数。如果不是,我希望它在其中放置“ru”,如果是,则继续并显示具有必要语言的页面(i18n 负责的部分)。问题是由于某种原因它不能将 ':lang' 识别为子路由的参数,所以如果我尝试转到 'test.test/ru',它会返回 lang 参数,但如果我尝试'test.test/ru/first' 它没有看到它并返回 404。万一我把 :lang 参数放在每个子组件之前,一切正常,但这并不实用。有没有更好的方法来解决这个问题?
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

使用这样的代码,您应该得到您想要的效果。


import Vue from 'vue';

import VueI18n from 'vue-i18n';

import VueRouter from 'vue-router';

import Router from './Router.vue';

import En from './translation/En.vue';

import Ru from './translation/Ru.vue';


Vue.use(VueI18n);

Vue.use(VueRouter);

Vue.use(VueBus);


const messages = {

  en: En,

  ru: Ru,

};


const i18n = new VueI18n({

  fallbackLocale: 'ru',

  locale: 'ru',

  messages,

});


const router = new VueRouter({

  mode: 'history',

  base: process.env.BASE_URL,

  routes: [

    {

      path: '/:lang',

      component: {

        render: (h) => h('router-view'),

      },

      children: [your children route],

});


router.beforeEach((to, from, next) => {

  const { lang } = to.params;


  if (!['en', 'fr'].includes(lang)) {

    return next(i18n.locale);

  }


  if (i18n.locale !== lang) {

    i18n.locale = lang;

  }


  return next();

});

我不确定但没有 i18n 我认为是这样的:


...

router.beforeEach((to, from, next) => {

 const { lang } = to.params;


 if (!['en', 'ru'].includes(lang)) {

  route.params.lang = 'ru';

  router.push({ name: route.name });

 }

});


查看完整回答
反对 回复 2022-10-21
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我终于找到了解决办法!


如果您在主路线中有一些参数,您的子路线不应以“/”符号开头,而应以正确的路线开头,例如


let mainRoutes = [

    {path: 'first', component: () => import('./pages/First')},

    

    {path: 'second', component: () => import('./pages/Second')},

    

    {path: 'third', component: () => import('./pages/Third')},

  

];


const router = new Router({

  mode: 'history',

  base: process.env.BASE_URL,

  scrollBehavior() {

    return {x: 0, y: 0}

  },


  routes: [

    {

        path: '/:lang',

        component: () => import('./layouts/Main'),


        children: mainRoutes,

        meta: {requiresAuth: true, permissions: true}

    },

  ]

})


查看完整回答
反对 回复 2022-10-21
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信