vue-router总结

理解

Vue Router 是 Vue.js 官方提供的用于实现客户端路由的库。它可以帮助我们在单页应用(SPA)中管理导航和页面切换,使得应用能够根据 URL 的变化动态地加载不同的视图组件。

vue-router有哪些组件

  1. <router-view> 用于渲染匹配到的路由组件的地方。在应用的模板中使用 <router-view> 标签,它将动态地显示当前路由对应的组件。

    sql 复制代码
    <router-view></router-view>
  2. <router-link> 用于创建导航链接,点击链接时触发路由导航。<router-link> 会自动设置 to 属性,确保导航到正确的路径。

    ini 复制代码
    <router-link to="/home">Go to Home</router-link>
  3. <router-link>tag 属性: 通过设置 tag 属性,可以使 <router-link> 渲染为其他 HTML 标签,而不仅仅是 <a> 标签。

    xml 复制代码
    <!-- 渲染为 button 标签 -->
    <router-link to="/home" tag="button">Go to Home</router-link>
  4. <router-link>replace 属性: 当点击链接时,将替换掉当前导航历史记录中的当前页面。

    ini 复制代码
    <router-link to="/home" replace>Go to Home</router-link>
  5. <router-link>active-class 属性: 通过设置 active-class 属性,可以指定链接被视为 "激活" 时应用的 CSS 类名。

    vbnet 复制代码
    <router-link to="/home" active-class="active-link">Go to Home</router-link>

vue-router 的动态路由,以及怎么获取传过来的值

定义动态路由:

在路由配置中,可以通过在路径中使用冒号 : 后跟参数名的方式定义动态路由。这样的参数将会匹配任意字符,成为路径的一部分。

js 复制代码
const routes = [
  { path: '/user/:id', component: UserProfile },
  // 其他路由...
];

上述代码中,:id 是一个动态参数,它将匹配到的值作为路由的一部分传递给 UserProfile 组件。

获取传过来的值:

在目标组件内部,可以通过 $route 对象的 params 属性来获取动态路由参数的值。

js 复制代码
// UserProfile.vue
export default {
  mounted() {
    // 获取动态路由参数的值
    const userId = this.$route.params.id;
    console.log('User ID:', userId);
  }
};

上述代码中,在 mounted 钩子中,通过 this.$route.params.id 获取了动态路由参数 id 的值。

如果动态路由的参数发生变化(例如从一个用户页面切换到另一个用户页面),组件的生命周期钩子 beforeRouteUpdate 会被调用,可以在这里处理参数变化的逻辑。

js 复制代码
// UserProfile.vue
export default {
  beforeRouteUpdate(to, from, next) {
    // 获取动态路由参数的新值
    const newUserId = to.params.id;
    console.log('New User ID:', newUserId);
    next();
  }
};

vue-router 有哪几种导航钩子

全局导航钩子:

  1. beforeEach:

    • 在每个路由导航之前调用。
    • 可以用来进行全局的导航守卫逻辑,例如身份验证
    js 复制代码
    router.beforeEach((to, from, next) => {
      // 在路由导航之前执行的逻辑
      next(); // 必须调用 next(),否则路由不会继续
    });
  2. beforeResolve:

    • 在导航被确认之前调用。
    • beforeEach 导航守卫执行完毕之后调用,此时导航将被确认。
    js 复制代码
    router.beforeResolve((to, from, next) => {
      // 在导航被确认之前执行的逻辑
      next(); // 必须调用 next(),否则路由不会继续
    });
  3. afterEach:

    • 在每个路由导航结束之后调用,即导航确认之后或导航被终止之后。
    • 可以用来进行一些收尾工作,例如日志记录。
    js 复制代码
    router.afterEach((to, from) => {
      // 在路由导航结束之后执行的逻辑
    });

组件内导航钩子:

  1. beforeRouteEnter:

    • 在路由进入组件的时候调用,但是在组件实例化之前调用。
    • 不能访问组件实例 this,但可以通过传递一个回调函数来访问组件实例。
    js 复制代码
    beforeRouteEnter(to, from, next) {
      // 在路由进入组件之前执行的逻辑
      next(vm => {
        // 通过 vm 访问组件实例
      });
    }
  2. beforeRouteUpdate:

    • 在路由参数发生变化时调用。
    • 可以访问组件实例 this,用于响应路由参数的变化。
    js 复制代码
    beforeRouteUpdate(to, from, next) {
      // 在路由参数更新时执行的逻辑
      next();
    }
  3. beforeRouteLeave:

    • 在离开当前路由时调用。
    • 可以访问组件实例 this,用于在离开当前路由前执行一些逻辑。
    js 复制代码
    beforeRouteLeave(to, from, next) {
      // 在离开当前路由之前执行的逻辑
      next();
    }

这些导航钩子可以用于执行一些全局或组件内的逻辑,以控制路由导航的行为。在使用导航钩子时,要确保调用 next() 来确保导航能够继续。

$route$router的区别

  1. $route

    • $route 是一个包含了当前路由信息的对象。
    • 它提供了当前路由的各种属性,例如路径、参数、查询参数、哈希等。
    • $route 是一个响应式对象,当路由发生变化时,它会自动更新。

    示例:

    js 复制代码
    export default {
      mounted() {
        // 访问当前路由路径
        const currentPath = this.$route.path;
        console.log('Current Path:', currentPath);
      }
    };
  2. $router

    • $router 是 Vue Router 的实例,用于执行路由导航。
    • 它提供了一些方法,例如 pushreplacego,用于在代码中进行路由导航。
    • $router 不是响应式的,它提供了一些方法来修改路由,但不会触发组件的重新渲染。

    示例:

    js 复制代码
    export default {
      methods: {
        goToHome() {
          // 使用 $router 进行路由导航
          this.$router.push('/home');
        }
      }
    };

在实际应用中,一般使用 $router 来执行编程式导航,而使用 $route 来获取当前路由的信息 。例如,在组件中根据当前路由信息展示不同的内容,就可以通过访问 $route 来实现。

总的来说,$route 提供了当前路由的信息,是一个响应式对象;而 $router 提供了导航的方法,是 Vue Router 的实例。使用它们可以更方便地处理路由相关的逻辑。

vue-router响应路由参数的变化

在 Vue Router 中,如果需要响应路由参数的变化,可以使用组件内的导航钩子 beforeRouteUpdate。这个钩子会在当前路由的参数发生变化时调用,允许在组件内部执行一些逻辑。可参照上述动态路由。 以下是一个简单的示例:

js 复制代码
<template>
  <div>
    <h1>User Profile</h1>
    <p>User ID: {{ userId }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      userId: null
    };
  },
  beforeRouteUpdate(to, from, next) {
    // 在路由参数更新时执行的逻辑
    this.userId = to.params.id;
    next();
  }
};
</script>

在这个例子中,组件在 beforeRouteUpdate 钩子中通过 to.params.id 获取新的路由参数,并更新了组件内的 userId 数据。在路由参数发生变化时,该钩子会被触发。

请注意,beforeRouteUpdate 钩子只有在组件已经被渲染过一次后,从一个路由导航到另一个路由时才会被调用。如果需要在组件第一次加载时获取路由参数,可以使用 beforeRouteEnter 钩子。

vue-router传参

在 Vue Router 中,有多种方式可以传递参数,具体的选择取决于你的需求和应用场景。以下是一些常见的传递参数的方式:

1. 路由参数(动态路由):

通过在路由配置中定义动态参数,可以在路由路径中传递参数。

js 复制代码
// 路由配置
const routes = [
  { path: '/user/:id', component: UserProfile }
];

// 使用
<router-link :to="{ path: '/user/' + userId }">User Profile</router-link>

在组件内部可以通过 $route.params 来获取路由参数。

js 复制代码
// 在组件内获取参数
this.$route.params.id;

2. 查询参数:

通过在路由链接中使用查询参数,可以在 URL 中传递参数。

js 复制代码
// 使用
<router-link :to="{ path: '/user', query: { id: userId } }">User Profile</router-link>

在组件内部可以通过 $route.query 来获取查询参数。

js 复制代码
// 在组件内获取查询参数
this.$route.query.id;

3. props 配置:

通过在路由配置中使用 props 配置项,可以将路由参数作为组件的 props 传递。

js 复制代码
// 路由配置
const routes = [
  { path: '/user/:id', component: UserProfile, props: true }
];

// 使用
<router-link :to="{ path: '/user/' + userId }">User Profile</router-link>

在组件内部可以直接通过 props 获取传递的参数。

javascript 复制代码
javascriptCopy code
// 在组件内获取参数
props: ['id'],
mounted() {
  console.log('User ID:', this.id);
}

4. 编程式导航:

使用 $router.push$router.replace 方法进行编程式导航时,可以传递参数。

kotlin 复制代码
javascriptCopy code
// 使用
this.$router.push({ path: '/user/' + userId });

在组件内部可以通过 $route.params$route.query 获取参数。

kotlin 复制代码
javascriptCopy code
// 在组件内获取参数
this.$route.params.id;
this.$route.query.id;

选择传递参数的方式取决于你的具体需求。通常情况下,动态路由适用于将参数直接嵌入到路径中,而查询参数适用于可选的、不影响路径结构的参数。使用 props 时,参数会被作为组件的属性传递,适用于需要在组件内直接访问参数的情况。

vue-router的两种模式

Vue Router 提供了两种模式,分别是 Hash 模式 (默认模式)和 History 模式。这两种模式主要影响了 Vue Router 如何管理路由和处理 URL。

1. Hash 模式:

在 Hash 模式中,URL 中的 # 符号用于标识路由,而不会触发页面的重新加载。这种模式的 URL 可以看作是单页面应用 (SPA) 内部的锚点。

  • 优点:

    • 兼容性好:不需要服务器端配置,支持在不同浏览器中运行。
    • 避免了跨域问题:因为 # 后的内容不会被发送到服务器。
    • 在不支持 History 模式的浏览器中,自动降级为 Hash 模式。
  • 缺点:

    • URL 中会带有 #,可能不够美观。
    • 对搜索引擎爬虫的支持相对较弱。

2. History 模式:

在 History 模式中,Vue Router 使用 HTML5 History API 来实现路由,不再依赖 # 符号。这样的 URL 看起来更加清晰,更符合传统的 URL 结构。

  • 优点:

    • URL 更美观,不带有 #
    • 对搜索引擎爬虫更友好。
  • 缺点:

    • 需要服务器端的支持,确保在所有可能的路径上都返回同一个 HTML 文件。
    • 在不支持 History 模式的浏览器中,需要进行降级处理。

在使用 History 模式时,通常需要服务器端进行相应的配置,以确保在浏览器直接访问页面时能够正确返回主页(避免 404 错误 )(404错误原因可见vue3js.cn/interview/v...

vue-router实现路由懒加载( 动态加载路由 )

路由懒加载(动态加载路由)是一种优化手段,它使得在访问某个路由时才加载对应的 JavaScript 文件,而不是一开始就加载所有路由的代码。这可以显著提高应用的加载速度,特别是对于大型单页应用(SPA)来说。在 Vue Router 中,可以通过使用异步组件和 Webpack 的代码分割功能来实现路由懒加载。

以下是实现路由懒加载的步骤:

  1. 定义异步组件: 使用 import() 语法定义异步组件,将组件的引入延迟到实际需要的时候。
  2. 在路由配置中使用异步组件: 在路由配置中使用 component 字段,将其设置为返回一个 import() 的调用。

下面是一个示例:

js 复制代码
// 异步加载的组件
const Home = () => import(/* webpackChunkName: "home" */ './views/Home.vue');
const About = () => import(/* webpackChunkName: "about" */ './views/About.vue');
const Contact = () => import(/* webpackChunkName: "contact" */ './views/Contact.vue');

// 路由配置
const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
  { path: '/contact', component: Contact }
];

// 创建路由实例
const router = new VueRouter({
  routes
});

上述代码中,import() 函数返回一个 Promise,Webpack 在编译时会将异步加载的组件打包成单独的文件,这样在访问对应路由时,浏览器会按需加载相应的文件。

请注意,在上面的示例中,我们使用了注释 /* webpackChunkName: "name" */ 来为异步组件指定一个名称,这样在打包后生成的文件中,可以更容易地识别和管理异步组件。

使用路由懒加载可以优化应用的性能,尤其是当应用包含大量组件时。

相关推荐
cnsxjean1 小时前
Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架
javascript·vue.js·ui·前端框架·npm
web组态软件1 小时前
BY组态-低代码web可视化组件
前端·低代码
react_in1 小时前
webpack 题目
前端·webpack
MarisolHu1 小时前
前端学习笔记-Vue篇-02
前端·vue.js·笔记·学习
学前端的小朱1 小时前
Webpack的基础配置
前端·webpack·node.js
小小优化师 anny2 小时前
JS +CSS @keyframes fadeInUp 来定义载入动画
javascript·css·css3
小周同学_丶2 小时前
解决el-select数据量过大的3种方法
前端·vue.js·elementui
先知demons3 小时前
uniapp开发微信小程序笔记10-触底加载
前端·笔记·微信小程序·小程序·uni-app
每一天,每一步3 小时前
react antd不在form表单中提交表单数据,而是点查询按钮时才将form表单数据和其他查询条件一起触发一次查询,避免重复触发请求
前端·javascript·react.js
NoneCoder3 小时前
HTML5系列(9)-- Web Components
前端·html·html5