Vue Router 是 Vue.js 官方的路由管理器,它允许用户在单页应用(SPA)中实现页面之间的导航。通过 Vue Router,开发者可以轻松地管理和组织应用中的多个视图,并且支持动态路由匹配、嵌套路由、编程式导航等功能。本文将详细介绍 Vue Router 的原理、作用以及具体用法,帮助读者全面理解和掌握这一强大的工具。
路由:路由是一种机制,用于根据不同的 URL 显示不同的内容或视图。
单页应用 (SPA):单页应用是一种 Web 应用程序架构,整个应用只有一个 HTML 页面,通过 JavaScript 动态更新内容,而不是重新加载整个页面。
Hash 模式:
使用 URL 中的 # 号来模拟一个完整的 URL,当 # 后面的内容改变时,浏览器不会向服务器发送请求,而是通过监听 hashchange 事件来触发路由变化。
例如:http://example.com/#/user/profile,其中 #/user/profile 是哈希部分。
History 模式:
利用 HTML5 History API (pushState, replaceState) 来改变 URL 而不重新加载页面。
例如:http://example.com/user/profile,这种模式下的 URL 更加友好,但需要后端配置支持。
Router View:用于显示当前路由对应的组件。
Router Link:用于创建链接,点击后会导航到指定的路由。
Route:定义了路由的路径和对应的组件。
Router:全局路由器对象,管理所有路由信息。
用户点击链接或执行编程式导航。
Vue Router 监听并解析 URL。
根据 URL 匹配相应的路由规则。
更新 Router View 组件,渲染对应的视图。
单页应用导航
允许用户在单页应用中进行页面间的无缝切换,提升用户体验。
通过动态路由匹配,可以根据 URL 参数的不同显示不同的内容。
路由参数传递
支持通过 URL 传递参数,如路径参数、查询参数等。
例如:/user/:id 和 /user?name=John。
嵌套路由
支持在路由中嵌套子路由,适用于复杂的多级视图结构。
例如:/user/profile/settings。
编程式导航
提供编程式导航方法,如 router.push, router.replace 等,可以在代码中控制路由跳转。
适用于需要根据某些条件或逻辑进行导航的情况。
导航守卫
提供多种导航守卫,如全局守卫、路由独享守卫、组件内守卫等,用于在导航过程中执行一些逻辑,如权限验证、页面加载前的数据获取等。
滚动行为
可以自定义滚动行为,如在导航时保持滚动位置或滚动到顶部。
安装:
npm install vue-router
引入:
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
创建路由配置:
const routes = [ { path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/user/:id', component: User, props: true },
{
path: '/user',
component: User,
children: [ { path: 'profile', component: UserProfile },
{ path: 'settings', component: UserSettings }
]
}
];
创建路由实例:
const router = new VueRouter({
mode: 'history', // 或 'hash'
base: process.env.BASE_URL,
routes
});
在主文件中引入路由实例:
new Vue({
router,
render: h => h(App)
}).$mount('#app');
在模板中使用 <router-view> 和 <router-link>:
<template>
<div id="app">
<nav>
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
<router-link :to="{ name: 'user', params: { id: 123 }}">User 123</router-link>
</nav>
<router-view></router-view>
</div>
</template>
使用 router.push:
this.$router.push('/user/123');
使用 router.replace:
this.$router.replace({ name: 'user', params: { id: 123 } });
使用 router.go:
this.$router.go(-1); // 返回上一页
全局前置守卫:
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!auth.isAuthenticated()) {
next({
path: '/login',
query: { redirect: to.fullPath }
});
} else {
next();
}
} else {
next();
}
});
路由独享守卫:
const routes = [ {
path: '/user',
component: User,
beforeEnter: (to, from, next) => {
if (auth.isAuthenticated()) {
next();
} else {
next('/login');
}
}
}
];
组件内守卫:
export default {
beforeRouteEnter(to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
next(vm => {
// 通过 `vm` 访问组件实例
});
},
beforeRouteUpdate(to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
next();
},
beforeRouteLeave(to, from, next) {
// 导航离开该组件的对应路由时调用
next();
}
};
自定义滚动行为:
const router = new VueRouter({
mode: 'history',
routes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition;
} else {
return { x: 0, y: 0 };
}
}
});
按需加载路由组件:
const routes = [
{ path: '*', component: NotFoundComponent }
];
通配符路由:
const routes = [ { path: '*', component: NotFoundComponent }
];
正则表达式匹配:
const routes = [ { path: '/user-:id(\\d+)', component: User }
];
原因:在 History 模式下,直接访问某个路径可能会导致 404 错误,因为服务器没有找到对应的资源。
解决方法:配置服务器,在找不到资源时返回 index.html 文件。
Nginx 配置:
location / {
try_files $uri $uri/ /index.html;
}
Apache 配置:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
传递参数:
this.$router.push({ name: 'user', params: { id: 123 } });
接收参数:
export default {
created() {
console.log(this.$route.params.id);
}
};
异步操作示例:
router.beforeEach(async (to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
const isAuthenticated = await auth.checkAuthentication();
if (isAuthenticated) {
next();
} else {
next('/login');
}
} else {
next();
}
});
命名路由:
const routes = [ {
path: '/user',
component: User,
children: [ { path: 'profile', name: 'user-profile', component: UserProfile },
{ path: 'settings', name: 'user-settings', component: UserSettings }
]
}
];
重定向:
const routes = [ {
path: '/user',
component: User,
children: [ { path: '', redirect: 'profile' },
{ path: 'profile', component: UserProfile },
{ path: 'settings', component: UserSettings }
]
}
];
Vue Router 是一个强大且灵活的路由管理工具,广泛应用于 Vue.js 单页应用中。通过本文的介绍,读者应该能够理解 Vue Router 的基本原理、主要作用以及具体的用法。从安装配置到高级功能,Vue Router 提供了丰富的功能和选项,帮助开发者构建高效、易维护的 Web 应用。希望本文能为读者提供有价值的参考和指导,助力大家更好地利用 Vue Router 进行项目开发。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等
支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景
涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。
根据给定的手机号、姓名、身份证、人像图片核验是否一致
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。