vue router 路由组件
按需加载,头和底,可根据页面需求,是否统一显示头和底:
JavaScript Code复制内容到剪贴板
- import Vue from 'vue'
- import Router from 'vue-router'
- import AppHeader from '@/components/common/Header.vue'
- import AppFooter from '@/components/common/Footer.vue'
- import publishIndex from '@/components/cms/publishIndex' // 发布首页的页面.
- import publishBase from '@/components/cms/publishBase' // 必填项
- //按需加载
- const userIndex = r => require.ensure([], () => r(require('../components/user/index')), 'userIndex') //首页
- export default new Router({
- routes: [{
- path: '/',
- name: 'userIndex',
- components: {
- header: AppHeader,
- main: userIndex,
- footer: AppFooter
- }
- },
- {
- path: '/cms/index',//用户发布首页,选择类型
- name: 'publish',
- components: {
- header: AppHeader,
- main: publishIndex,
- footer: AppFooter
- }
- },
- {
- path: '/cms/publish-base/:type/:fee', //填写必要信息,type 发布类型,fee是否付费,1不限,2免费
- name: 'publishBase',
- components: {
- header: AppHeader,
- main: publishBase
- }
- },
- ]
- })
如果全部都有头和底则可以直接写成:
JavaScript Code复制内容到剪贴板
- export default new Router({
- routes: [{
- path: '/',
- name: 'Main',
- component: Main
- },
- ]
- })
在路由中传参,如type,fee
1、在组件中获取传参的值 :
路由:
JavaScript Code复制内容到剪贴板
- {
- path: '/msg/message-detail/:id',
- components: {
- main: messageDetail,
- footer: AppFooter
- }
- },
在compoents中获取路由上的参数:
JavaScript Code复制内容到剪贴板
- <script>
- let publishId = this.$route.params.id;
- </script>
在模板中使用:
JavaScript Code复制内容到剪贴板
- $route.params.id
如果是router跳转,要注册,params,不能和path组合,只能和name
JavaScript Code复制内容到剪贴板
- router.push(
- {
- name: 'memberTaskDetail',
- params: { id: 1 }
- }
- )
2、在路由上直接添加参数:
XML/HTML Code复制内容到剪贴板
- @click="toRouter({path: '/course/lesson-hour',query: {lessonId: item.lessonId}})"
- methods: {
- toRouter(router) {
- this.$router.push(router);
- },
取值,模板中取:
JavaScript Code复制内容到剪贴板
- $route.query.lessonId
如果这个传递的参数,可有可无,可使用?:
JavaScript Code复制内容到剪贴板
- { //新增/修改课时,带id过来
- path: '/course/lesson-edit/:id?',
- name: 'addLesson',
- components: {
- main: addLesson
- }
- },
表示 ,这个id是不确定的,可以有 也可以不要
路由组件,返回上一页:
JavaScript Code复制内容到剪贴板
- this.$router.go(-1);
如果直接在模块中写:
XML/HTML Code复制内容到剪贴板
- <button @click="$router.back(-1)">上一步</button>
跳转指定路由:
JavaScript Code复制内容到剪贴板
- let id = res.publishId;
- this.$router.push('/cms/publish-more/' + id);
获取当前路由:
JavaScript Code复制内容到剪贴板
- console.log(this.$route.path);
页面重新加载 / 重新渲染页面
JavaScript Code复制内容到剪贴板
- this.$router.replace('user/index');
美化路由,将#号去掉,路由开始history模式:
这里的base表示请求的url根路径的配置
JavaScript Code复制内容到剪贴板
- export default new Router({
- mode: 'history',
- base:'/test/',
同一个路由,不同参数跳转,页面无变化的解决方法:
JavaScript Code复制内容到剪贴板
- mounted: function() {
- this.init();
- },
- watch: {
- '$route' (to, from) {
- //刷新参数放到这里里面去触发就可以刷新相同界面了
- this.init(this.$route.path);
- }
- },
- methods: {
- init(urlStr) {
- if(urlStr){
- let urlStrArr = urlStr.split('/');
- this.lessonId = urlStrArr[urlStrArr.length - 2];
- this.playerShow = false;
- }
参考:https://router.vuejs.org/zh-cn/essentials/dynamic-matching.html
关于跳转路由,受前后浏览页面影响,页面总会跑到中间或其他浏览位置:
JavaScript Code复制内容到剪贴板
- router.beforeEach((to, from, next) => {
- window.scrollTo(0, 0);
- next();
- })
在main.js中应该是用import引入的router,在引入router之后配置即可
设置将要去往的路由匹配:
JavaScript Code复制内容到剪贴板
- const paths = [
- "userGuide",
- "userGuide01",
- "userGuide02",
- "userGuide03",
- "userGuide04",
- ]
- // 将要前往的页面中,需要从头开始显示,不记录中间位置
- router.beforeEach((to, from, next) => {
- if(global.contains(paths,to.name)){
- window.scrollTo(0, 0);
- }
- next();
- })
JavaScript Code复制内容到剪贴板
- contains(arr, obj) {
- // 当前值 是否在指定数组内
- var i = arr.length;
- while (i--) {
- // console.log(typeof(arr[i]));
- // console.log(typeof(obj));
- if (arr[i] === obj) {
- return true;
- }
- }
- return false;
- },
参考:https://router.vuejs.org/en/advanced/navigation-guards.html#global-guards
下一篇 vue 表单验证