zoukankan      html  css  js  c++  java
  • vue-router

    • vue-router是Vue.js官方的路由插件,适合用于构建单页面应用。
    • vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。
    • 传统的页面应用,是用一些超链接来实现页面切换和跳转的。
    • 在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。

     参考:https://www.cnblogs.com/keepfool/p/5690366.html

    使用VueCLI,并加上vue-router插件的git案例:

    https://github.com/chentianwei411/vue-router-demo


    基础

    案例:

    https://jsfiddle.net/yyx990803/xgrjzsup/

    案例使用了局部组件注册。

    通过普通的JS对象来定义组件:

    var Component = { ... }

    然后在component(components)中定义想要使用的组件:

    new Vue({
    el: '#app'
    components: {
    'component-a': ComponentA,
    'component-b': ComponentB
    }
    })

    一般使用VueRouter, 也可以使用Router:

    import Router from "vue-router";
    
    Vue.use(Router)

    4大步骤:

    JavaScript:

    0. 如果使用一个模块系统,调用Vue.use(VueRouter)
    1. 定义组件 (也可以从其他文件import)

    2. 定义routes选项
    每个路径需要map映射到一个组件。组件可以用Vue.extend()创建,或者仅仅是一个组件选项对象。

    3.创建router实例,然后传递routes选项
    这里,你可以传递额外的选项。

    • HTML:

    • 3.1. 使用router-link组件导航。用于渲染路径匹配到的视图组件。
      • <router-link to="/foo">Go to Foo</router-link>
        • 通过‘to’ prop来知道链接
        • <router-link>将被渲染,默认渲染成<a>标签  
    • 3.2.根据路径,匹配的组件将会渲染在<router-view>.

    4. 创建和挂载根实例
    确保注入的路径实例及路径选项,可以让整个app router-aware

    成功激活路由后,链接元素自动设置一个表示激活的css类名:.router-link-active {}


    <router-link>知识点:

    将激活class 用在外层元素:

    <router-link tag="li" to="/foo">
     <a>Go to Foo</a>
    </router-link>

    成功激活routes后,自动生成的class,会添加到<li>标签上,而不是<a>标签。

     

    <router-link> 组件的Props:

    to

    类型string | Location

    当链接被点击后,会立即把to的值传递给router.push()。

    tag prop

    指定使用什么标签,并监听点击,触发导航。 


      

    动态路由匹配

    例:用户id不同,但都会渲染同一个组件User。可以使用动态路径参数:

    routes选项是Router构建选项之一:

    routes: [ { path: '"/user/:id", component: User }]

    id根据用户不同,值自然不同。当匹配一个路由时,参数值会被设置到this.$route.params, 它可以在每个组件中使用:

    tempate: <div>User'id  is {{ $route.params.id }}</div>

    $route.params类型是Object, 一个key/value对象,如果没有参数,就是一个空对象。 

    路径参数:

    • 模式/user/:id 
    • 匹配路径/user/22
    • $route.params的参数是{id: 22}

    响应路由参数的变化

    当路由参数变化时,因为两个路由使用的同一个组件User,所以原来的组件实例会反复使用(效率高),

    但是组件的Life cycle hook不会再被调用了。

    如果希望在路由参数变化时,可以监听,用watch 监听$route对象

    在组件中添加watch 数据选项:

    Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性

    var User = {
     template: `<div>点击链接后生成的组件实例: {{ $route.params.id }}</div>`,
     watch: {
      '$route': function (val, oldVal) {
        console.log(val)

      },
     }
    }

    高级匹配模式(未学习)

    例如:可选的动态路径参数,匹配0~N个,甚至自定义正则匹配。


    嵌套路由

    实际的应用界面,是由多层的嵌套的组件组合而成。

    配合嵌套的组件, URL中各段动态路径也按照某种结构对应它。

    1. 组件: 一个被渲染的组件可以包含自己的嵌套<router-view>, 即嵌套出口。
    2. Router构建器:在routes构建选项中添加children数组。
      • children包含当前路由的所有嵌套路径片段的路由记录
      •  / 开头的嵌套路径会被当作根路径。
      • (可选)在chilren配置中设置一个空的路径,path: '',component: Home是对根路径模版的扩展。

    点击查看我的案例https://codepen.io/chentianwei411/pen/BOJOVo


    编程方式的导航

    • 声明方式:用<router-link>创建链接标签。
    • 编程方式:使用router的实例方法,通过编写代码来实现导航URL。

    在Vue实例内部,可以通过$router访问路由实例。

    vue-router插件提供了相关的API: router的实例方法,通过以下方法来导航到不同的URL。

    • push(location, onComplete?, onAbort?), 实际等同<router-link :to=''>
    • replace(location, onComplete?, onAbort?)
      • 和push的区别是不记录进history。
      • 等同于<router-lin :to='xxx' replace>
    • go(n), 等同于window.history.go(n)
    • back(),
    • forward()

     

    history栈:按先后顺序记录浏览器的访问url。

    HTML DOM中的History对象,包含了访问的URLs。通过window.history特性操作它。

    push,把访问url记录进history中,之后使用浏览器导航栏的前进,后退按钮,就代表导向history中的URL

    go(),back(),forward()都是对history操作。它们都是对window.history API的模仿。

    字符串

    router.push('home')   

    对象

    router.push({ path: ''home' })    如果带动态参数 path: `home/${ userId}`, 生成/user/123

    命名路由:给一个路由设一个名字

    router.push({ name: 'user', params: {userId: 123})   生成/user/123

    带查询参数:

    router.push({ path: 'register', query: { plan: 'private' })   变成 /register?plan=private


    命名路由

    给一个路由一个名称,更方便。

    • 1.在创建Router实例时,在routes配置中给某个路由设置名字
    • 2.要链接到一个命名路由,给router-linkto属性传入一个对象{name: 'xxx', params: {...}}

    源代码实例:https://router.vuejs.org/zh/guide/essentials/named-routes.html


    命名视图

     

    用途:

    一个窗口,同时同级展示多个视图(如:导航栏,侧边栏,主内容等等),而不是嵌套展示。

    一个窗口有多个单独命名的视图。使用一个路径,这个路径内有有多个平级的组件。

    通过router-link中的name选择,指定router-link显示什么组件。

    例子:

    //
    //
    //
    const routrer = new VueRouter({
      routes: [
        {
           path: '/',
           components: {
               default: Foo,
               a: Bar,
               b: Baz
           }
        }
      ]
    })

    在路径构建器中的routes选项中使用components配置(带上字母s):否则报错

     


    嵌套命名视图

    进一步,把嵌套路由和命名视图结合使用。

    在一个嵌套路由中,使用components属性。然后在router-link中直接使用name属性。

    例子

      routes: [
        { path: '/settings',
          // You could also have named views at tho top
          component: UserSettings,
          children: [
            {
              path: 'emails',
              component: UserEmailsSubscriptions
            }, 
            {
              path: 'profile',
              components: {
                default: UserProfile,
                helper: UserProfilePreview
              }
            }
          ]
        }
      ]

     重定向,别名(没实际使用过)

    别名:

    /a 的别名是 /b,意味着,当用户访问 /b 时,URL 会保持为 /b,但是路由匹配则为 /a,就像用户访问 /a 一样。

    const router = new VueRouter({
      routes: [
        {path:'/a', component:A, alias: '/b'}
      ]
    })
    <router-link to="/b">hello</router-link>
    
    URl显示home/b,
    但渲染的是组件A, /home/a。

    路由传递参数 (没实际用过)

    默认在组件中使用$route会限制组件的灵活性,让这个组件只能用于某个确定的URLs。

    例子:组件User和'/user/:id'绑定了。

    const User = {
      template: '<div>User {{ $route.params.id }}</div>'
    }
    const router = new VueRouter({
      routes: [
        { path: '/user/:id', component: User }
      ]
    })

    为了让组件可以反复使用和测试,

    用props代替 $route.params, 如果props被设置为true, 则route.params被设置为组件属性。

    const User = {
      props: ['id'],
      template: '<div>User {{ id }}</div>'
    }
    const router = new VueRouter({
      routes: [
        { path: '/user/:id', component: User, props: true },
    
        // 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
        {
          path: '/user/:id',
          components: { default: User, sidebar: Sidebar },
          props: { default: true, sidebar: false }
        }
      ]
    })

    还有对象模式和函数模式,具体见指南


    历史模式

    vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

    Transition

    <router-view>是基本的动态组件,可以给他添加动态效果。

    具体见指南,和<transition>的API和相关指南。

  • 相关阅读:
    REST API注意事项
    Javascript addEventListener dispatchEvent
    Javascript常见操作
    MySql运算符
    Mysql数据类型
    MySql基本命令
    php学习
    javascript学习
    如何快速掌握一种技术
    站在K2角度审视流程--任务的独占与释放
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9636853.html
Copyright © 2011-2022 走看看