zoukankan      html  css  js  c++  java
  • vue-router 路由的一些后续

    动态路由 路由传参 $router 和 $route  $route.params/$route.query

    vue-router中的$router和$route 两个属性
    $router就是那个大的new出来的路由对象 new VueRouter
    $route是在这个router的routes[路由匹配规则]中的活跃的那个路由

    先上例子吧

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src='./libs/vue-2.4.0.js'></script>
        <script src='./libs/vue-router.js'></script>
    </head>
    
    <body>
        <div id="app">
            <router-link to='/login?id=10'>登录</router-link>
            <!--如果在路由中使用查询字符串 给路由传递参数 还是和没加查询字符串时一样的 不需要更改path属性 加不加打开的都是同一个组件 -->
            <!-- <router-link to='/login' >登录</router-link>-->
            <router-link to='/register'>注册</router-link>
            <router-view></router-view>
        </div>
        <script>
            var login = { //这创建的是组件模板对象
                template: '<h1>登录组件----{{this.$route.query.id}}----{{this.msg}}</h1>',
                data() {
                    return {
                        msg: '123'
                    }
                },
                created() { //组件的生命周期钩子函数
                    console.log(this) //是这个组件的实例 
                    console.log(this.$route) //这是一个query属性 
                    console.log(this.$route.query.id)//10
                }
            }
            var register = {
                template: '<h1>注册组件</h1>'
            }
            var routerObj = new VueRouter({
                routes: [
                    { path: '/login', component: login },
                    { path: '/register', component: register }
                ]
            })
    
            // 创建 Vue 实例,得到 ViewModel
            var vm = new Vue({
                el: '#app',
                data: {},
                methods: {},
                // router: router
                router: routerObj
            })
        </script>
    </body>
    
    </html>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src='./libs/vue-2.4.0.js'></script>
        <script src='./libs/vue-router.js'></script>
    </head>
    <body>
    <div id="app">
         <router-link to='/login/10'>登录</router-link><!--这里传了一个id:10-->
         <!--<router-link to='/login/10/cxk'>登录</router-link> 当传多个参数过来的时候-->
         <router-link to='/register'>注册</router-link>
         <router-view></router-view>
    </div>
    <script>
         
        var login={
            template:'<h1>登录模板---{{this.$route.params.id}}</h1>',
            created(){
                console.log(this.$route)
                console.log(this.$route.params.id) //拿到了那个id值:10
            }
        }
        var register={
            template:'<h1>注册模板</h1>'
        }
        var routerObj= new VueRouter({
             routes:[
                {path:'/login/:id/:name',component:login},/*在这个位置放一个id进来 这个ID怎么来 还需要通过ul具体的解析*/
                 /*{path:'/login/:id/:name',component:login} 传多个参进来 */
                {path:'/register',component:register}
             ],
        })
    
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {},
          methods: {},
          router:routerObj
          })
    </script>
    </body>
    </html>

    动态路由

     我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) 来达到这个效果:

    const User = {
      template: '<div>User</div>'
    }
    
    const router = new VueRouter({
      routes: [
        // 动态路径参数 以冒号开头
        { path: '/user/:id', component: User }
      ]
    })

    现在呢,像 /user/foo 和 /user/bar 都将映射到相同的路由。

    一个“路径参数”使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到this.$route.params,可以在每个组件内使用。于是,我们可以更新 User 的模板,输出当前用户的 ID:

    const User = {
      template: '<div>User {{ $route.params.id }}</div>'
    }

    你可以在一个路由中设置多段“路径参数”,对应的值都会设置到 $route.params

     query和params传参(接收参数) $router $route的区别

    1.query方式传参和接收参数

    传参: 
    this.$router.push({
            path:'/xxx',
            query:{
              id:id
            }
          })
      
    接收参数:
    this.$route.query.id

    注意:传参是this.$router,接收参数是this.$route,这里千万要看清了!!!

    this.$router 和this.$route有何区别?

    • 1.$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法
    • 2.$route为当前router跳转对象,里面可以获取name、path、query、params等

    2.params方式传参和接收参数

    传参: 
    this.$router.push({
            name:'xxx',
            params:{
              id:id
            }
          })
      
    接收参数:
    this.$route.params.id

    注意:params传参,push里面只能是 name:'xxxx',不能是path:'/xxx',因为params只能用name来引入路由,如果这里写成了path,接收参数页面会是undefined!!!

     

    还有这个链接:https://www.jb51.net/article/128118.htm  我发现脚本之家还不错 除了我无法忍受的某些广告。。CSDN广告更无法忍受

    么么我的楚慈宝宝


    日啊

     mlgb.....还有

    路由懒加载   

    当打包构建应用(npm run build)时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。(就是说 用到哪个组件的时候 再申请再加载哪个组件 一开始不全把东西申请过来)

    (用方式三 前两个认识就好)

    这就是如何定义一个能够被 Webpack 自动代码分割的异步组件。

    const Foo = () => import('./Foo.vue')
    

    在路由配置中什么都不需要改变,只需要像往常一样使用 Foo

    const router = new VueRouter({
      routes: [
        { path: '/foo', component: Foo }
      ]
    })  
    (不是像以前一样 直接import 这样就是直接引入了 而是在点击这个路径的时候 对应的组件再去引入 也可以直接在component:箭头函数 这样直接一起在外面声明也可以)

    const ES6内容

    改变URL

    1.

    以前都是这样改变URL的
    <router-link to='/account/login'>登录</router-link>
    <router-link to='/account/register'>注册</router-link>
    点哪个变哪个
    2.
    监听,当路由发生变化的时候执行
    watch: {
    '$route':'getPath' 活跃的路由发生了变化
    },
    methods: {
         getPath(){
           console.log(this.$route.path);
         }
    }
     
     
    <!--
    vue的export default和new vue({})
    
    对于export defalut 在是输出,在vue里面的用法是用来输出组件,相当于把接口暴露在外部,共所有文件用import来调用,
    
    而new vue({})是创建一个vue实例化,对组件进行数据操作
    Vue 就是一个构造函数,生成的实例是一个巨大的对象,可以包含数据、模板、挂载元素、方法、生命周期钩子等选项。
    所以渲染的时候,可以使用构造 Vue 实例的方式来渲染相应的 html 页面:
    new Vue({
        el: '#app'
        ...
    })
    -->

     路由嵌套 

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src='./libs/vue-2.4.0.js'></script>
        <script src='./libs/vue-router.js'></script>
    </head>
    
    <body>
        <div id="app">
            <router-link to='/account'>Account</router-link>
            <router-view></router-view>
        </div>
    
        <template id='tmp1'>
            <div>
                <h1>这是account组件</h1>
                <router-link to='/account/login'>登录</router-link>
                <router-link to='/account/register'>注册</router-link>
                <router-view></router-view><!--在父组件的模板里直接包含子组件 这里的to要是完整路径-->
            </div>
        </template>
    
        <script>
            var account = {
                template: '#tmp1'
            }
            var login = {
                template: '<h1>登录组件</h1>'
            }
            var register = {
                template: '<h1>注册组件</h1>'
            }
            var routerObj = new VueRouter({
                routes: [ //这里也得改改
                    {
                        path: '/account',
                        component: account,
                        children: [
                            {path:'',redirect:'login'}, //默认路径
                            { path: 'login', component: login },
                            { path: 'register', component: register }
                        ]/*使用子路由children 来实现在点击子内容的时候上面根内容的东西保持不消失只是子内容在切换 
                         子路由的path不要带/  会自动补得*/
                    }
                ]
            })
            var vm = new Vue({
                el: '#app',
                data: {},
                methods: {},
                router: routerObj
            })
    
        </script>
    </body>
    
    </html>
    <!--关于路由嵌套 还有一个 https://www.bilibili.com/video/av60143623/?p=112 法子-->

    导航守卫

    不需要深入了解/ 如果想点击一个插件 就将网页的title改成配套的 (情景例子:在一个SPA页面中如何更改网页的标题 )
      1.在每个插件的生命周期函数created()里添加    原生js document.title='xxx'
      2.导航守卫(“导航”表示路由正在发生改变)(点击另一个插件 路由可不就发生了变化)
         在定义路由的时候可以配置 meta 字段,在meta里可以添加自己想要的title信息
         再在router.beforeEach(from,to,next){}里添加信息

    全局守卫
    beforeEach前置守卫(在路由跳转之前回调)(参数也是个函数 参数next函数是必须要调用的 )
    afterEach后置钩子(在路由跳转之后发生)(参数是函数 两个参数 不需要next函数了)

    https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD%AE%E5%AE%88%E5%8D%AB 

    keep-alive

    组件被频繁的创建 频繁的销毁
         可以在组件中的生命周期函数created 和destroyed()加上console.log看
         点击组件A发生console.log(‘created’) 点击组件B时就会log('destroy')
         再点击回来组件A 又会被再次创建created调用钩子函数
    可以对组件进行缓存 避免重新渲染:
    keep-alive

    <keep-alive>
      <component>
           <!-- 该组件将被缓存! -->
      </component>
    </keep-alive>

    被包裹在keep-alive中的组件的状态将会被保留,例如我们将某个列表类组件内容滑动到第100条位置,那么我们在切换到一个组件后再次切换回到该组件,该组件的位置状态依旧会保持在第100条列表处(场景)
    router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存

    (所有依靠route-view一句话展示在页面上的组件 一旦route-view被包裹 他们这些组件就被缓存了 也多了下面这两个生命周期钩子函数)
    当组件在keep-alive内被切换时组件的activated、deactivated这两个生命周期钩子函数会被执行

    (exclude这里跟的是组件的name属性   https://blog.csdn.net/Uookic/article/details/80420472 )

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/yundong333/p/11378153.html
Copyright © 2011-2022 走看看