• Vue 框架学习(八) VueRouter


    1、前端渲染后端渲染和前端路由后端路由

    后端渲染和后端路由:

    前端渲染:

    前端路由:

    2、vue-router的安装与配置

    安装:npm install vue-router

    配置:

      1、导入路有对象,注册路由Vue.use(VueRouter)

      2、创建实例并配置映射路径(new)

      3、挂载路由(在Vue实例中挂载路由实例)

    import Vue from "vue";
    import VueRouter from "vue-router";
    
    const Home = () => import("views/home/Home");
    
    Vue.use(VueRouter);
    
    const routes = [
      {
        path: "",
        redirect: "/home",
      },
      {
        path: "/home",
        component: Home,
      },
    ];
    
    const router = new VueRouter({
      routes,
      mode: "history",
    });
    
    export default router;
    index.js

    3、路由映射配置

    (1)一级路由与路由懒加载、默认路由与修改路由为history

    import Vue from "vue";
    import VueRouter from "vue-router";
    
    // 路由懒加载
    const Home = () => import("views/home/Home");
    const Category = () => import("views/category/Category");
    const ShopCart = () => import("views/shopcart/ShopCart");
    const Profile = () => import("views/profile/Profile");
    const Detail = () => import("views/detail/Detail");
    
    // 安装
    Vue.use(VueRouter);
    
    // 创建
    const routes = [{
        path: "",
        redirect: "/home"
      },
      {
        path: "/home",
        component: Home
      },
      {
        path: "/category",
        component: Category
      },
      {
        path: "/shopcart",
        component: ShopCart
      },
      {
        path: "/profile",
        component: Profile
      },
      {
        // 动态路由
        path: "/detail/:iid",
        component: Detail
      }
    ];
    
    const router = new VueRouter({
      routes,
      mode: "history"
    });
    
    export default router;
    View Code

    (2)二级路由

    import Home from './views/Home.vue'
    import Table from './views/nav1/Table.vue'
    import user from './views/nav1/user.vue'
    import Page4 from './views/nav2/Page4.vue'
    import Page5 from './views/nav2/Page5.vue'
    import Page6 from './views/nav3/Page6.vue'
    
    let routes = [
        {
            path: '/',
            component: Home,
            name: '数据管理',
            iconCls: 'el-icon-message', //图标样式class
            children: [
                {
                    path: '/table',
                    component: Table,
                    name: 'Table'
                },
                {
                    path: '/user',
                    component: user,
                    name: '列表'
                },
            ],
            redirect: '/table'
        },
        {
            path: '/',
            component: Home,
            name: '导航二',
            iconCls: 'fa fa-id-card-o',
            children: [
                {
                    path: '/page4',
                    component: Page4,
                    name: '页面4'
                },
                {
                    path: '/page5',
                    component: Page5,
                    name: '页面5'
                }
            ]
        },
        {
            path: '/',
            component: Home,
            name: '',
            iconCls: 'fa fa-address-card',
            leaf: true, //只有一个节点
            children: [{
                path: '/page6',
                component: Page6,
                name: '导航三'
            }]
        },
        {
            path: '*',
            hidden: true,
            redirect: {
                path: '/404'
            }
        }
    ];
    
    export default routes;
    View Code

    4、router-link、router-view、keep-alive

    router-link:路由导航,点击后可跳转相应路由

        <!-- 1.直接转换 -->
        <!-- 默认转化为a标签 tag更改类型 replace 不返回 -->
        <router-link to="/home" tag="button" replace>Home</router-link>
        <router-link to="/about">About</router-link>
    
        <!-- 2.使用方法更改路径 -->
        <button @click="homeClick">Home</button>
        <button @click="aboutClick">About</button>
    
      methods: {
        homeClick() {
          // 通过代码修改路径
          // this.$router.push('/home')
          this.$router.replace("/home");
        },
        aboutClick() {
          // this.$router.push('/about')
          this.$router.replace("/about");
        },
      }
    View Code

    router-view:渲染匹配到的组件

          <!-- 路径匹配到的视图组件不会被缓存,比如默认点击新闻再点击消息,切换后回来还是 新闻,数据会被重新加载,重新刷新视图-->
          <router-view></router-view>
    View Code

    keep-alive:缓存视图(使用后可使用 activated、deactivated 两个状态函数)

        <!-- exclude表示不需要被缓存,','添加多个且不能加空格 -->
        <!-- include表示哪些需要缓存,','添加多个且不能加空格 -->
        <keep-alive exclude="About">
          <!-- 所有路径匹配到的视图组件会被缓存,比如先点击消息,切换后回来还是消息 -->
          <router-view></router-view>
        </keep-alive>
    View Code

    5、路由传参

    URL组成:scheme://host:port/path?query#fragment

    (1)params

    • 配置路由: /router/:id
    • 在path上传对应值
    • 通过params取值
    • 路径为: /router/123, /router/abc
    // 路由配置
    {
      path: '/user/:userId',
      component: User,
      meta: {
        title: '用户'
      },
    },
    
    // router-link传值
    <router-link :to="'/user/' +userId" tag="button">User</router-link>
    
    // 取值
    <h2>{{$route.params.userId}}</h2>
    View Code

    (2)query

    • 普通路由配置
    • 使用query作为key传值
    • 通过query取值
    • 路径为: /router?id=123, /router?id=abc
    // 普通配置
    {
      path: '/profile',
      component: Profile,
      meta: {
        title: '档案'
      },
    },
    
    // query传值(对象方式)
    <router-link
      :to="{path:'/profile', query:{name:'Smallstars',age:'18',height:'1.83'}}"
      tag="button"
    >档案</router-link>
    
    // 取值
    <h2>{{$route.query.name}}</h2>
    <h2>{{$route.query.age}}</h2>
    <h2>{{$route.query.height}}</h2>
    View Code

    (3)button等监听点击事件跳转路由传参

    userClick() {
      this.$router.push("/user/" + this.userId);
    },
    profileClick() {
      this.$router.push({
        path: "/profile",
        query: {
          name: "BlackAngel",
          age: 19,
          height: 1.85,
        },
      });
    },
    View Code

    6、$router和$route的区别

    router为整个new的VueRouter

    const router = new VueRouter({
      // 配置路由和组件的关系
      routes,
      // 默认hash值路径
      mode: 'history',
      // 处于活跃状态时属性改为active
      linkActiveClass: 'active'
    })
    View Code

    route为当前活跃的路由

    {
      path: '/profile',
      component: Profile,
      meta: {
        title: '档案'
      },
    },
    View Code

    7、导航守卫(详见案例5)

    全局守卫(动态修改标题)

    // 全局守卫
    // 前置守卫(guard) next必须调用,不然不会被 resolved
    router.beforeEach((to, from, next) => {
      // 从from跳转到to
      // 此处如果有子页面这会是undefined,需要到matched[0]当中去找
      document.title = to.matched[0].meta.title
      next()
    })
    
    // 后置钩子(hook)
    router.afterEach((to, from) => {
      console.log("All afterEach");
    })
    View Code

    局部守卫(beforeEnter ==>  canActivate)

      {
        path: '/about',
        component: About,
        meta: {
          title: '关于'
        },
        // 局部守卫 一定要写next
        beforeEnter: (to, from, next) => {
          next()
          console.log("About beforeEnter");
        }
      },
    View Code

    参考:https://cn.vuejs.org/v2/guide/migration-vue-router.html#%E8%B7%AF%E7%94%B1%E6%8C%82%E9%92%A9

    组件内守卫(

      beforeRouteEnter  ==> activate

      beforeRouteUpdate

      beforeRouteLeave ==> canDeactivage

    beforeRouteLeave(to, from, next) {
      this.path = this.$route.path;
      next();
    }
    View Code
    每天进步一点点
  • 相关阅读:
    vue2.0 实现click点击当前li,动态切换class
    关于事件冒泡和键盘事件 以及与Angular的区别
    vue 的事件冒泡
    Vue2键盘事件
    Vue2键盘事件:keydown/keyup...
    项目bug
    vue2 如何操作dom
    Redis配置文件说明
    Linux下ffmpeg的完整安装
    C++ error: passing 'const std::map<>]' discards qualifiers或pass-by-reference-to-const-map导致的“discards qualifiers”
  • 原文地址:https://www.cnblogs.com/smallstars/p/13510918.html
Copyright © 2020-2023  润新知