• Vue笔记:vue-router


    目录

    路由介绍

    SPA(single page application):单一页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的组件。

    单页面应用(SPA)的核心之一是:更新视图而不重新请求页面;vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式。

    路由中有三个基本的概念 route, routes, router。

    route,一条路由规则,定义了一个url与一个组件之间的关系。

    routes, 一组路由,把route放到一个数组中。

    router ,前端路由机制,管理路由,当页面发生跳转时,它到routes 中去查找,去找到对应的的url对应的组件内容,所以页面中就显示了该组件内容。

    注意:前端的路由,实际上就是DOM元素的显示和隐藏。当页面中显示一个组件的时候,页面中其他路由的组件全部隐藏。

    路由的基本配置

    目录结构:

    1、在views下创建Home.vue组件

    <template>
        <div>
            <h2> {{ msg }}</h2>
        </div>
    </template>
    <script>
    
    export default {
        data(){
            return{
                msg:'我是Home组件'
            }
        },
    }
    </script>
    <style scoped>
    
    </style>

    2、在App.vue中设置路由的组件显示的位置(通过<router-view></router-view>)

    <template>
        <div id="app">
            <router-view></router-view>
        </div>
    </template>
    
    
    <!--1.引入组件-->
    <!--2.挂载组件-->
    <!--3.在模板中使用-->
    <script>
        export default {
    }
    </script>
    
    <style  scoped>
    
    </style>

    3、在router.js中设置路由(注意,我这里使用路由懒加载的方式)

    提前介绍一下路由懒加载:如果不使用懒加载模式,当进入项目时默认会渲染路由中所有组件,当使用懒加载时,只有访问路由指定的url才会渲染对应的组件。

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    
    Vue.use(VueRouter)
    
    const routes = [
      {
        path:'/home',
        component: () => import('./views/Home') 
      },
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router

    不使用懒加载的方式:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    // 引入组件
    import home from "./views/Home.vue";
    
    Vue.use(VueRouter)
    
    const routes = [
      {
        path:'/home',
        // component: () => import('./views/Home')
        component: home
      },
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router

    这里介绍一下重定向,首次进入页面时,页面显示空白,因为它的访问路径是 '/',我们并没有给这个路径做相应的配置,我们可以把“/”指向home组件。

     // 重定向
        {
            path: '/', 
            redirect: '/home' 
        }

    4、注册路由到根实例

    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import store from './store'
    
    
    Vue.use(ElementUI)
    Vue.config.productionTip = false
    
    new Vue({
      router,
      store,
      render: h => h(App)
    }).$mount('#app')

    路由跳转

    在多页面中我们通过a标签实现多页面的跳转,在vue中没有页面的概念,只有组件,我们使用<router-link></router-link>实现组件的之间的切换显示

    当我点击页面上的home按钮时,页面中就要显示home组件内容,如果点击页面上的user按钮,页面中就要显示user组件内容。home按钮  => home 组件, user按钮 => user组件,当显示一个组件时,另一个组件内容被隐藏。

    1、在views下创建User.vue组件

    <template>
        <div>
            <h2> {{ msg }}</h2>
        </div>
    </template>
    <script>
    
    export default {
        data(){
            return{
                msg:'我是User组件'
            }
        },
    }
    </script>
    <style scoped>
    
    </style>

    2、在router.js中设置路由

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    // 引入组件
    import home from "./views/Home.vue";
    import user from "./views/User.vue";
    Vue.use(VueRouter)
    
    const routes = [
      {
        path:'/home',
        // component: () => import('./views/Home')
        component: home
      },
      {
        path:'/user',
        component: user
      },
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router

    3、在App.vue中设置路由跳转

    <template>
        <div id="app">
            <router-link to="/home">home</router-link>
            <br>
            <router-link to="/user">user</router-link>
            <router-view></router-view>
        </div>
    
    </template>
    
    <!--1.引入组件-->
    <!--2.挂载组件-->
    <!--3.在模板中使用-->
    <script>
        export default {
          
    }
    </script>
    
    <style  scoped>
    
    </style>

     

     

     编程式导航

    上面是<router-link>进行路由的方式,下面是通过事件的方式进行路由:

    <template>
        <div id="app">
    <!--        <router-link to="/home">home</router-link>-->
    <!--        <br>-->
    <!--        <router-link to="/user">user</router-link>-->
            <button @click="toHome">home</button>
            <button @click="toUser">user</button>
            <router-view></router-view>
        </div>
    
    </template>
    
    
    <!--1.引入组件-->
    <!--2.挂载组件-->
    <!--3.在模板中使用-->
    <script>
        export default {
        
            methods:{
               toHome(){
                   this.$router.push({path:'/home'})
               },
               toUser(){
                    this.$router.push({path:'/user'})
               },
            }
    }
    </script>
    
    <style  scoped>
    
    </style>

     

     

    动态路由

    上面我们定义的路由,都是严格匹配的,只有router-link 中的to属性和 router.js 中的路由route中 path 一模一样,才能显示相应的组件component. 但有时现实却不是这样的,当我们去访问网站并登录成功后,它会显示 欢迎你,+ 你的名字。不同的用户登录, 只是显示“你的名字” 部分不同,其它部分是一样的。

    这就表示,它是一个组件,假设是user组件。不同的用户(就是用户的id不同),它都会导航到同一个user 组件中。

    这样我们在配置路由的时候,path属性,不能写死,那要怎么设置? 导航到 user 组件,路径中肯定有user, id 不同,那就给路径一个动态部分来匹配不同的id,拿到这个id后,前端再向后端请求不一样的数据。

    在vue-router中,动态部分 以 : 开头,那么路径就变成了 /user/:id, 这条路由就可以这么写: { path:"/user/:id", component: user }.

    1、修改router.js如下:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    // 引入组件
    import home from "./views/Home.vue";
    import user from "./views/User.vue";
    Vue.use(VueRouter)
    
    const routes = [
      {
        path:'/home',
        // component: () => import('./views/Home')
        component: home
      },
      {
        path:'/user/:id',
        component: user
      },
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router

    2、修改User.vue组件($route.params.id为url中传入的id)

    <template>
        <div>
            <h2> {{ msg }}</h2>
            <h2> {{ $route.params.id }} </h2>
        </div>
    </template>
    <script>
    
    export default {
        data(){
            return{
                msg:'我是User组件'
            }
        },
    }
    </script>
    <style scoped>
    
    </style>

    嵌套路由

    嵌套路由,主要是由我们的页面结构所决定的。当我们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当我们点击各个分类的时候,它还是需要路由到各个部分,如点击手机,它肯定到对应到手机的部分。

    在路由的设计上,首先进入到 home ,然后才能进入到phone, tablet, computer.  Phone, tablet, compute 就相当于进入到了home的子元素。所以vue  提供了childrens 属性,它也是一组路由,相当于我们所写的routes。

    首先,在home页面上定义三个router-link 标签用于导航,然后再定义一个router-view标签,用于渲染对应的组件。router-link 和router-view 标签要一一对应。

    1、Home.vue 组件修改如下:

    <template>
        <div>
            <h2> {{ msg }}</h2>
            <router-link to="/home/phone">手机</router-link>
            <router-link to="/home/tablet">平板</router-link>
            <router-link to="/home/computer">电脑</router-link>
            <router-view></router-view>
        </div>
    </template>
    <script>
    
    export default {
        data(){
            return{
                msg:'我是Home组件'
            }
        },
    }
    </script>
    <style scoped>
    
    </style>

    2、router.js修改如下:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    
    // 引入组件
    import home from "./views/Home.vue";
    import user from "./views/User.vue";
    
    import phone from "./components/Phone.vue";
    import tablet from "./components/Tablet.vue";
    import computer from "./components/Computer.vue";
    Vue.use(VueRouter)
    
    const routes = [
      {
        path:'/home',
        component: home,
        // 子路由
            children: [
                {
                    path: "phone",
                    component: phone
                },
                {
                    path: "tablet",
                    component: tablet
                },
                {
                    path: "computer",
                    component: computer
                }
            ]
      },
      {
        path:'/user/:id',
        component: user
      },
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router

    3.在components下增加三个组件:

    Phone、Tablet、Computer
    模板如下:
    <template>
        <div>
            <h2>{{ msg }}</h2>
    
        </div>
    </template>
    <script>
    
    export default {
        data(){
            return{
                msg:'我是Phone组件'
            }
        },
    }
    </script>
    <style scoped>
    
    </style>

     

    vue-router中的$route和$router

    1、$route对象

    $route对象表示当前的路由信息,包含了当前 URL 解析得到的信息。包含当前的路径,参数,query对象等。
    1.$route.path:
          字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar"。
    2.$route.params:
          一个 key/value 对象,包含了 动态片段 和 全匹配片段,
          如果没有路由参数,就是一个空对象。
    3.$route.query:
          一个 key/value 对象,表示 URL 查询参数。
          例如,对于路径 /foo?user=1,则有 $route.query.user == 1,
          如果没有查询参数,则是个空对象。
    4.$route.hash:
          当前路由的 hash 值 (不带 #) ,如果没有 hash 值,则为空字符串。锚点
    5.$route.fullPath:
          完成解析后的 URL,包含查询参数和 hash 的完整路径。
    6.$route.matched:
          数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。
    7.$route.name :   当前路径名字
    8.$route.meta:  路由元信息

    一个示例:

    Vue使用ElementUI的el-tag元素时根据当前路由显示不同的样式:

    :effect = "$route.name === 对象.属性? 'dark' : 'plain' "

    2、$router对象

    router是VueRouter的实例方法,相当于一个全局的路由器对象,作用是进行路由跳转的!就像jQuery里的window.location一样,起到的是导航的作用。里面含有很多属性和子对象,例如history对象,导航到不同url,可以使用this.
    路由实例方法:

    push

    // 字符串
       this.$router.push('home')
    // 对象
       this.$router.push({ path: 'home' })
    // 命名的路由
       this.$router.push({ name: 'user', params: { userId: 123 }})
    // 带查询参数,变成 /register?plan=123
       this.$router.push({ path: 'register', query: { plan: '123' }})

    push方法其实和<router-link :to="...">是等同的。
    push方法的跳转会向 history 栈添加一个新的记录,当我们点击浏览器的返回按钮时可以看到之前的页面。

    go

    // 页面路由跳转 前进或者后退
    this.$router.go(-1) // 后退

    replace

     //push方法会向 history 栈添加一个新的记录,而replace方法是替换当前的页面,
     不会向 history 栈添加一个新的记录
    // 一般使用replace来做404页面
    this.$router.replace('/')

    配置路由时path有时候会加 '/' 有时候不加,以'/'开头的会被当作根路径,就不会一直嵌套之前的路径。

  • 相关阅读:
    图片压缩后,依然很大的解决方案
    怎么使用javascript实现类的功能
    javascript实现像java、c#之类的sleep暂停的函数功能
    用ajax和asp.net实现智能搜索功能
    insert into 和insert into select性能比较
    百度编辑器
    document.selection.createRange()
    CSS设置透明效果
    class中一个小技巧
    asp.net中 解析JSON
  • 原文地址:https://www.cnblogs.com/-wenli/p/13801668.html
Copyright © 2020-2023  润新知