Vue3 路由, Vue router (Part2)

Vue 路由 Vue router

https://www.cnblogs.com/emanlee/p/18010380
https://www.cnblogs.com/emanlee/p/16695372.html

 

 path: name: component: redirect: children: meta:

 

在Web开发中,特别是在使用Vue.js这类现代前端框架时,经常会涉及到路由和组件的组织方式。你提到的路径(path)、名称(name)、组件(component)、重定向(redirect)、子路由(children)和元信息(meta)是Vue Router中路由配置的关键部分。下面我将分别解释这些属性:

1. path

path属性定义了路由的路径。这是用户在浏览器地址栏中输入的URL的一部分,用于匹配对应的路由。例如:

{ path: '/about', component: About }

2. name

name属性为路由定义一个名称,这样可以在编程式导航时通过名称引用路由,而不是通过路径。例如:

{ path: '/about', name: 'About', component: About }

3. component

component属性指定了当路由匹配成功时应该渲染的组件。例如:

{ path: '/about', component: About }

这里About是一个Vue组件。

4. redirect

redirect属性用于定义一个重定向规则。当用户访问某个路由时,会自动重定向到另一个路由。例如:

{ path: '/old-path', redirect: '/new-path' }

或者更复杂的重定向:

{ path: '/old-path', redirect: to => { return '/new-path/' + to.params.userId } }

5. children

children属性用于定义嵌套路由。这对于构建具有多级结构的应用程序非常有用。例如:

{
path: '/user',
component: User,
children: [
{ path: 'profile', component: UserProfile },
{ path: 'posts', component: UserPosts }
]
}

这里UserProfileUserPosts组件将作为/user/profile/user/posts的子路由被渲染。

6. meta

meta字段允许你定义一个对象,用于存储额外的信息,这些信息可以在路由守卫或全局导航守卫中访问,用于权限控制或其他自定义逻辑。例如:

{
path: '/admin',
component: AdminPanel,
meta: { requiresAuth: true, role: 'admin' }
}

在路由守卫中,你可以检查这些元信息来决定是否允许访问:

router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!authCheck()) { // authCheck是检查用户是否认证的函数
next({ path: '/login' });
} else {
next();
}
} else {
next(); // 确保一定要调用 next()
}
});

通过这些配置,Vue Router 提供了一种灵活而强大的方式来管理前端路由和组件的映射关系。

 

path: "/",
                name: 'Layout',
                component: () => import('@/components/MenuLayout'),
                redirect: "/welcome",
                children: [
                    {
                        path: 'welcome',
                        component: () => import('@/pages/Welcome'),
                        meta: { requireAuth: true, userType: REGULAR_USER }
                    },
                    {
                        path: 'help',
                        component: () => import('@/pages/Help'),
                        meta: { requireAuth: true, userType: REGULAR_USER }
                    }]

 

 

==================================================

Vue Router的使用

1.安装 npm install vue-router -s
2.在src目录下创建router目录,接着创建index.js文件
3.在index.js文件中引入Vue以及路由 import VueRouter from ‘vue-router’
4.挂载路由 Vue.use(VueRouter)
5.创建路由对象并配置路由规则 const router = new VueRouter({routes: [{ path: ‘/home’, component: Home }]})
6.将路由对象传递给路由实例,在main.js文件路由实例中添加router
7.在app.vue中预留路由出口

index.js文件

// 引入依赖
import Vue from "vue";
import VueRouter from "vue-router"
import Home from "../components/Home.vue"
// 挂载
Vue.use(VueRouter)
// 创建实例并配置
const router = new VueRouter({
    routes: [
        { path: '/', redirect: '/home' },
        { path: '/home', component: Home }
    ]
});

// 导出
export default router

main.js文件

new Vue({
  // 让 vue 知道我们的路由规则
  router,
  render: h => h(App),
}).$mount('#app')

app.vue文件

<div id="app">
    <router-view></router-view>
</div>

注意:vue-router版本选择
链接:https://blog.csdn.net/xh888zw/article/details/124468921

=========================================

路由中有三个基本的概念 route, routes, router。

1, route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮 => home内容, 这是一条route, about按钮 => about 内容, 这是另一条路由。

2, routes  是一组路由,把上面的每一条路由组合起来,形成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]

3, router  是一个机制,相当于一个管理者,它来管理路由。因为routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起作用了,它到routes 中去查找,去找到对应的 home 内容,所以页面中就显示了 home 内容。

4,客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容全部隐藏,反之也是一样。

 

在vue-router中, 我们看到它定义了两个标签<router-link><router-view>来对应点击和显示部分。

<router-link> 就是定义页面中点击的部分,

<router-view> 定义显示部分,就是点击后,区配的内容显示在什么地方。

所以 <router-link> 还有一个非常重要的属性 to,定义点击之后,要到哪里去, 如:<router-link to="/home">Home</router-link>

 

https://blog.csdn.net/qq_42268364/article/details/100021721

=========================================

视频介绍 router-view :

https://www.bilibili.com/video/BV1pE411L75D/

=========================================

 

this.$router.push()两种常见用法

1、路由传值   this.$router.push()

(1) 想要导航到不同的URL,使用router.push()方法,这个方法会向history栈添加一个新纪录,所以,当用户点击浏览器后退按钮时,会回到之前的URL

(2)当点击 <router-link> 时,这个方法会在内部调用,即点击 <router-link :to="..."> 等同于调用 router.push(...)

  a)      声明式:<router-link :to="...">

  b)      编程式:router.push(...)

  c)      该方法的参数可以是一个字符串路径,或者一个描述地址的对象。  

 

// 字符串
router.push('home')
 
// 对象
this.$router.push({path: '/login?url=' + this.$route.path});
 
// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})
 
// 带查询参数,变成/backend/order?selected=2
this.$router.push({path: '/backend/order', query: {selected: "2"}});
 
// 设置查询参数
this.$http.post('v1/user/select-stage', {stage: stage})
      .then(({data: {code, content}}) => {
            if (code === 0) {
                // 对象
                this.$router.push({path: '/home'});
            }else if(code === 10){
                // 带查询参数,变成/login?stage=stage
                this.$router.push({path: '/login', query:{stage: stage}});
           }
});
 
// 设计查询参数对象
let queryData = {};
if (this.$route.query.stage) {
    queryData.stage = this.$route.query.stage;
}
if (this.$route.query.url) {
    queryData.url = this.$route.query.url;
}
this.$router.push({path: '/my/profile', query: queryData});

 

2、获取参数的两种常用方法:params和query

(1)由于动态路由也是传递 params 的,所以在  this.$router.push() 方法中path不能和params一起使用,否则params将无效。需要用name来指定页面。

及通过路由配置的name属性访问

this.$router.push({name:"menuLink",params:{alert:"页面跳转成功"}})

(2)在目标页面通过  this.$route.params  获取参数:

<p>提示:{{this.$route.params.alert}}</p>

(3)在目标页面通过 this.$route.query 获取参数

//传值
this.$router.push({path:"/menLink",query:{alert:"页面跳转成功"}})

//用query获取值
<p>提示:{{this.$route.query.alert}}</p>

 

两种方式的区别是query传参的参数会带在url后边展示在地址栏,params传参的参数不会展示到地址栏。需要注意的是接收参数的时候是route而不是router。两种方式一一对应,名字不能混用

 

https://blog.csdn.net/qq_42552857/article/details/118678031

=========================================

https://blog.csdn.net/xh888zw/article/details/124468921

https://blog.csdn.net/weixin_47124112/article/details/126730114

https://zhuanlan.zhihu.com/p/204946145

 

======================================

Vue Router的嵌套路由



说明
        本文介绍Vue Router的嵌套路由的用法。
        嵌套路由就是父路由里面嵌套他的子路由,父路由有自己的路由导航和路由容器(router-link、router-view),通过配置children可实现多层嵌套。(router-view必须要有,否则点击了router-link后,路径会变化,但页面不改变)。

使用场景
        嵌套路由用于实现页中页效果。例如:
    用户页面中,有登录页面和注册页面,这两个页面通过标签切换。
        此时:用户页面是父路由,登录和注册页面是子路由
    后台管理页面中,布局都是同一套,只是中间的内容部分改变。(例如:vue-element-admin)
        此时:整个布局是父路由,中间的内容页面是子路由

官网网址
https://router.vuejs.org/zh/guide/essentials/nested-routes.html
示例
需求:写一个用户页面,里边有登录页面和注册页面,这两个页面通过标签切换。
路由配置
router/index.js

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    import User from '../views/user/User'
    import Login from '../views/user/Login'
    import Register from '../views/user/Register'
     
    Vue.use(VueRouter)
     
    const routes = [
      {
        path: '/',
        name: 'Home',
        redirect: User
      },
      {
        path: '/user',
        name: 'User',
        component: User,
        children: [
          {
            path: 'login',
            name: 'Login',
            component: Login
          },
          {
            path: 'register',
            name: 'Register',
            component: Register
          }
        ]
      }
    ]
     
    const router = new VueRouter({
      routes
    })
     
    export default router

 
用户页面(父页面)
User.vue

    <template>
      <div class="outer">
        <h2>这是用户页面</h2>
        <router-link :to="{name: 'Login'}">登录</router-link> |
        <router-link :to="{name: 'Register'}">注册</router-link>
        <router-view></router-view>
      </div>
    </template>
     
    <script>
    export default {
      name: 'User'
    }
    </script>
     
    <style scoped>
    .outer {
      margin: 20px;
      border: 2px solid red;
      padding: 20px;
    }
    </style>

 
登录页面(子页面)
Login.vue

   <template>
      <div class="outer">
        <h3>这是登录页面</h3>
      </div>
    </template>
     
    <script>
    export default {
      name: 'Login'
    }
    </script>
     
    <style scoped>
    .outer {
      margin: 20px;
      border: 2px solid blue;
      padding: 20px;
    }
    </style>

 
注册页面(子页面)
Register.vue

   <template>
      <div class="outer">
        <h3>这是注册页面</h3>
      </div>
    </template>
     
    <script>
    export default {
      name: 'Register'
    }
    </script>
     
    <style scoped>
    .outer {
      margin: 20px;
      border: 2px solid blue;
      padding: 20px;
    }
    </style>

 
测试

访问:http://192.168.0.104:8080/

结果:

 
点击“登录”/“注册”:

子路由的path前加“/”

        如果子路由的path的最前边有“/”,则不需要加父路由的路径即可访问此子组件。

例如,修改上边的“路由配置”,将path: 'login',改为path: '/login',则登录页面可以这样访问:

http://192.168.0.104:8080/#/login

示例

router/index.js:
 

   import Vue from 'vue'
    import VueRouter from 'vue-router'
    import User from '../views/user/User'
    import Login from '../views/user/Login'
    import Register from '../views/user/Register'
     
    Vue.use(VueRouter)
     
    const routes = [
      {
        path: '/',
        name: 'Home',
        redirect: User
      },
      {
        path: '/user',
        name: 'User',
        component: User,
        children: [
          {
            path: '/login',
            name: 'Login',
            component: Login
          },
          {
            path: 'register',
            name: 'Register',
            component: Register
          }
        ]
      }
    ]
     
    const router = new VueRouter({
      routes
    })
     
    export default router

 
测试

 
 链接:https://blog.csdn.net/feiying0canglang/article/details/126196561

======================================

 

posted @ 2025-03-25 09:44  emanlee  阅读(186)  评论(0)    收藏  举报