记忆点-vue-router

作者: 未路过 | 来源:发表于2022-10-05 14:59 被阅读0次

1.打包的时候命名

 {
    path: "/main",
    component: () =>
      import(/* webpackChunkName: "main-chunk" */ "../components/main.vue"),
  },

2.动态路由匹配

  {
    path: "/main/:id",
    component: () => import("../components/main.vue"),
  },

html

  <router-link to="/main/123">to main</router-link>
  <router-link to="/login">to login</router-link>
  <router-view></router-view>

这个时候,点击了to main,就可以通过
1.{{ $route.params.XXX}}

  1. this.$route.params.XXX
  2. const route = useRoute();
    console.log(route.params.id);
    来获取id的值了。
    匹配多个参数的话
    route.path()可以得到当前的路由


    image.png

3.nof-found路由设置

  {
    path: "/:pathMatch(.*)",
    component: () => import("../components/not-found.vue"),
  },

not-found.vue

<template>
  <div>not-found</div>
  {{ $route.params }}
</template>
image.png
  {
    path: "/:pathMatch(.*)*",
    component: () => import("../components/not-found.vue"),
  },
image.png

$route.params.pathMatch获取到传入的参数:
在/:pathMatch(.*)后面又加了一个 *;
带星的化,就会把/一个一个解析,把内容放到数组里面

4. 路由的嵌套配置

一级路由,二级路由

{ path: "/", redirect: "/main/product" },
  {
    path: "/main",
    component: () => import("../components/main.vue"),
    children: [
      {
        path: "/main/message",
        component: () => import("../components/cpns/message.vue"),
      },
      {
        path: "/main/product",
        component: () => import("../components/cpns/product.vue"),
      },
    ],
  },

子路由里面
path写 path: "/main/message",可以
写path:"message"也可以(不要加/)

5. 代码的页面跳转

image.png

router.push("/main/message");
router.push("/login");

 const btnClick = () => {
      router.push({
        path: "/login",
      });
    };

6.query方式的参数

image.png
const btnClick = () => {
      router.push({
        path: "/login",
        query: {
          name: "why",
          age: 18,
        },
      });
    };

点击之后


image.png

7.动态添加路由

 const router = useRouter();
    /*
    const actionsFn = mapActions(["incrementAction", "decrementAction"]);
    return {
      ...actionsFn,
    };*/
    const categoryRoute = {
      path: "/main/category",
      component: () => import("./components/category.vue"),
    };
    router.addRoute("main", categoryRoute);
    const btnClick = () => {
      router.push("/main/category");
    };
    return {
      btnClick,
    };

使用router.addRoute(fathername, newRoute)
如果是根下面的话,不用加fathername,直接添加路由。
但是加某个子路由的话,得添加父亲名字,不然会报错,而且router-view显示的是在faterh的地方。path的地方也可以直接写子组件,不要写 path: "/category",要么是完整路径,要么是光字符串。

const categoryRoute = {
      path: "category",
      component: () => import("./components/category.vue"),
    };

8.动态路由删除

删除路由有以下三种方式:
方式一:添加一个name相同的路由;
方式二:通过removeRoute方法,传入路由的名称;
方式三:通过addRoute方法的返回值回调;

方式一:
就是通过替换的方式删除掉以前的路由,

etup() {
    const router = useRouter();
    const categoryRoute = {
      path: "category",
      name: "category",
      component: () => import("./components/category.vue"),
    };
    router.addRoute("main", categoryRoute);
    const btnClick = () => {
      console.log(router.getRoutes()); //7条路由
      const newRoute = {
        path: "other",
        name: "category",
        component: () => import("./components/other.vue"),
      };
      router.addRoute("main", newRoute);
      console.log(router.getRoutes()); //6条路由
    };
    return {
      btnClick,
    };
  },

addRoute之前


image.png

addRoute之后


image.png

方式二:removeRoute方法,传入路由的名称;

setup() {
    const router = useRouter();
    const categoryRoute = {
      path: "category",
      name: "category",
      component: () => import("./components/category.vue"),
    };
    router.addRoute("main", categoryRoute);
    const btnClick = () => {
      console.log(router.getRoutes()); //7条路由
      router.removeRoute("category");
      console.log(router.getRoutes()); //6条路由
    };
    return {
      btnClick,
    };
  },

方式三:

setup() {
    const router = useRouter();
    const categoryRoute = {
      path: "category",
      component: () => import("./components/category.vue"),
    };
    const removeRoute = router.addRoute("main", categoryRoute);
    const btnClick = () => {
      console.log(router.getRoutes()); //7条路由
      removeRoute();
      console.log(router.getRoutes()); //6条路由
    };
    return {
      btnClick,
    };
  },

总结:
Router常用方法

  1. addRoute()
  2. removeRoute()
    3.router.getRoutes():获取一个包含所有路由记录的数组
    4.router.hasRoute():检查路由是否存在

9.路由导航守卫

vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航.
参数:
to: Route对象, 即将跳转到的Route对象
from: Route对象, 从哪一个路由对象导航过来的
第三个参数是个next函数,但是vue-router4版本以上不推荐使用这个,不用next,因为容易出现多次调用问题
返回值:

  • 返回值问题:利用返回值决定要跳转的位置v
  • 1.false: 不进行跳转,停留在当前路由
  • 2.undefined或者不写返回值: 进行默认导航,改去哪里就去哪里
  • 3.字符串: 路径, 跳转到对应的路径中
  • 4.对象: 类似于 router.push({path: "/login", query: ....})
    return {path: "/login", query: ....}
// 导航守卫beforeEach(全局前置守卫)
let counter = 0;
// to: Route对象, 即将跳转到的Route对象
// from: Route对象, 从哪一个路由对象导航过来的
//第三个参数是个next函数,但是vue-router4版本以上不推荐使用这个,不用next

/**
 * 返回值问题:利用返回值决定要跳转的位置v
 *    1.false: 不进行跳转,停留在当前路由
 *    2.undefined或者不写返回值: 进行默认导航,改去哪里就去哪里
 *    3.字符串: 路径, 跳转到对应的路径中
 *    4.对象: 类似于 router.push({path: "/login", query: ....})
 *      return {path: "/login", query: ....}
 */
router.beforeEach((to, from) => {
  console.log(`进行了${++counter}路由跳转`);
  // if (to.path.indexOf("/home") !== -1) {
  //   return "/login"
  // }
  if (to.path !== "/login") {
    //只要不是login页面,都需要token
    const token = window.localStorage.getItem("token");
    if (!token) {
      return "/login";
    }
  }
});

Vue还提供了很多的其他守卫函数,目的都是在某一个时刻给予我们回调,让我们可以更好的控制程序的流程或者功能:
p https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html

image.png

注意:useRoute或者useRouter只能在compositionAPI里面,也就是vue组件里面使用。
其他的js文件想使用的话,直接引入import router from "@/router/index.js"

相关文章

网友评论

    本文标题:记忆点-vue-router

    本文链接:https://www.haomeiwen.com/subject/kykeartx.html