vue-router

  • 路由,其实就是指向的意思
  • 当我点击页面上的Home按钮时,页面中就要显示home的内容,如果点击页面上的about按钮,页面中就要显示about的内容。
  • Home按钮 => home内容,about按钮 => about内容,也可以说是一种映射。
  • 所以在页面显示中,有两个部分,一个是需要点击的部分,一个是点击之后,显示点击内容的部分。

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

  • 1、route ,它是一条路由,由这个英文单词也可以看出,它是单数,Home按钮 => home内容,这是一条route,about按钮 => about内容,这是另一条路由。
  • 2、routes是一组路由,把上面的每一条路由组合起来,形成一个数组。[{Home按钮 => home内容},{about按钮 => about内容}]
  • 3、router是一个机制,相当于一个管理者,它来管理路由。因为routes只是定义了一组路由,它放在那里是静止的,当真正来了请求,怎么办?就是当用户点击Home按钮的时候怎么办?这时router就起作用了,它到routes中去查找,去找到对应的home内容,所以页面中就显示了home内容。
  • 4、客户端中的路由,实际上就是dom元素的显示和隐藏。当页面中显示home内容的时候,about中的内容全部隐藏,反之也是一样。客户端路由由两种实现方式:基于hash和基于html5 history api.

vue-router中的路由也是基于上面的内容来实现的

  • 在vue中实现路由还是相对简单的。因为我们页面中所有内容都是组件化的,我们只要把路径和组件对应起来就可以了,然后在页面中把组件渲染出来。

1, 页面实现(html模版中)

  • 在vue-router中, 我们也可以看到它定义了两个标签<router-link><router-view><router-link> 就是定义页面中点击的部分,<router-view> 就是点击后,显示内容的部分。所以 <router-link> 还有一个非常重要的属性 to, 它定义 点击之后,要到哪个路径下 , 如:<router-link to="/home">Home</router-link>

2, js 中配置路由

  • 首先要定义route, 一条路由的实现。它是一个对象,最基本的一条路由由两个部分组成: path: component. path 指路径,component 指的是组件。如:

  • 我们这里有两条路由,组成一个routes:

          const routes = [
               { path: '/home', component: Home },
               { path: '/about', component: About }
          ]
    
  • 最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。

      const router = new VueRouter({
         routes // short for routes: routes
      })
    
  • 配置完成后,把router 实例注入到 vue 根实例中,就可以使用路由

      const app = new Vue({
       router
      }).$mount('#app')
    
  • 执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 标签。所有的这些实现才是基于hash 实现的。

一、vue-router配置字路由

import Vue from 'vue'   
import Router from 'vue-router'  
import Hi from '@/components/Hi' //父
import Hi1 from '@/components/Hi1' //子
import Hi2 from '@/components/Hi2' //子
 
Vue.use(Router) 
 
export default new Router({
  routes: [             
   {
      path:'/',
      component:Hi,
      children:[
        {path:'/',component:Hi},
        {path:'hi1',component:Hi1},
        {path:'hi2',component:Hi2},
      ]
    }
  ]
})

二、vue-router参数传递

1、用name传递参数

  • 1.在路由文件src/router/index.js里配置name属性。

      routes: [
      	{
      		path: '/',
      		name: 'index',
      		component: index
      	}
      ]
    
  • 2.模板里(src/App.vue)用$route.name的形势接收,比如直接在模板中显示:

      <p>{{ $route.name }}</p>
    
  • 注意:不常用

2、通过<router-link>标签中的to传参

  • <router-link>标签中的to属性进行传参,要将to进行一个绑定,写成:to

      <router-link < :to="{name:xxx,params:{key:value}}">valueString</router-link>
    
  • to前面是带冒号的,后边跟的是一个对象形式的字符串

  • name:就是我们在路由配置文件中起的name值

  • params:就是我们要传的参数,是对象形式,在对象里可以传递多个值。(key:value)

  • src/App.vue里的<router-link>标签

      <router-link :to="{name:'index',params:{username:'haha',age:18}}">index页面</router-link>
    
  • src/router/index.js

      {
      	path: '/',
      	name: 'index',
      	component: index
      }
    
  • src/components/index.vue模板里用$route.params.username进行接收

      {{ $route.params.username }}
      {{ $route.params.age }}
    

三、单页面多路由区域操作

  • “单页面多路由区域操作”,实际需求是这样的,在一个页面里我们有2个以上<router-view>区域,我们通过配置路由的js文件,来操作这些区域的内容。例如我们在src/App.vue里加上两个<router-view>标签。我们用vue-cli建立了新的项目,并打开了src目录下的App.vue文件,在<router-view>下面新写了两行<router-view>标签,并加入了些CSS样式。

  • src/App.vue

      <router-view ></router-view>
       <router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"></router-view>
       <router-view name="right" style="float:right;width:50%;background-color:#c0c;height:300px;"></router-view>
    
  • src/router/index.js

      import Vue from 'vue'
      import Router from 'vue-router'
      import Hello from '@/components/Hello'
      import Hi1 from '@/components/Hi1'
      import Hi2 from '@/components/Hi2'
       
      Vue.use(Router)
       
      export default new Router({
        routes: [
          {
            path: '/',
            components: {
              default:Hello,
              left:Hi1,
              right:Hi2
            }
          }
        ]
      })
    
  • src/components/Hello.vue

      <template>
          <div>
              <h2>{{ msg }}</h2> 
          </div>
      </template>
       
      <script>
      export default {
        name: 'Hello',
        data () {
          return {
            msg: 'I am Hello page.'
          }
        }
      }
      </script>
    
  • src/components/Hi1.vue

      <template>
          <div>
              <h2>{{ msg }}</h2> 
          </div>
      </template>
       
      <script>
      export default {
        name: 'Hi1',
        data () {
          return {
            msg: 'I am Hi1 page.'
          }
        }
      }
      </script>
    
  • src/components/Hi2.vue

      <template>
          <div>
              <h2>{{ msg }}</h2> 
          </div>
      </template>
       
      <script>
      export default {
        name: 'Hi2',
        data () {
          return {
            msg: 'I am Hi2 page.'
          }
        }
      }
      </script>
    
  • src/App.vue

     <div>	
     	<router-link < to="/">首页</router-link> | 
     	<router-link to="/hi">Hi页面</router-link> 
     </div>
    

四、vue-router ---url传递参数

1、:冒号的形式传递参数

  • 1.src/router/index.js配置路由

      {
          path:'/news/:newsId/:newsTitle',
          component:news
      }
    
  • 传递参数是新闻id(newsId)和新闻标题(newsTitle)

  • 2.创建src/components/news组件

      <template>
          <div>
              <h2>{{ msg }}</h2>
              <p>新闻ID:{{ $route.news.newsId}}</p>
              <p>新闻标题:{{ $route.news.newsTitle}}</p>
          </div>
      </template>
       
      <script>
      export default {
        name: 'news',
        data () {
          return {
            msg: 'news page'
          }
        }
      }
      </script>
    
  • 3.src/App.vue

      <router-link to="/news/888/hello world">news</router-link> 
    

2、正则表达式在URL传值中的应用

  • 希望传递的新闻ID只能是数字的形式

  • 加入正则需要在路由配置文件里(src/router/index.js)以圆括号的形式加入

      path:'/news/:newsId(\\d+)/:newsTitle'
    
  • 加入正则,我们在传递数字以外的其他参数,params.vue组件就没有办法接收到。

五、vue-router的重定向---redirect

  • 开发中有时候我们虽然设置的路径不一致,但是我们希望跳转到同一个页面,或者说是打开同一个组件。这时候我们就用到了路由的重新定向redirect参数。

1、redirect基本重定向

  • src/router/index.js把原来的component换成redirect参数就可以了

      export default new Router({
        routes: [
          {
            path: '/',
            component: index
          },{
            path:'/goback',
            redirect:'/'  //跳到index页面
          }
       
        ]
      })
    
  • 这里我们设置了goback路由,但是它并没有配置任何component(组件),而是直接redirect到path:’/’下了,这就是一个简单的重新定向。

2、重定向时传递参数

{
  path:'/news/:newsId(\\d+)/:newsTitle',
  component:news
},{
  path:'/goNews/:newsId(\\d+)/:newsTitle',
  redirect:'/news/:newsId(\\d+)/:newsTitle'
}

六、alias别名

  • 就像同一个人两个名字而已

  • 1.src/router/index.js 给home路径起一个别名,detail

      {
      	path: '/home',
      	component: home,
      	alias: '/detail'
      }
    

2.配置我们的<router-link>,起过别名之后,可以直接使用<router-link>标签里的to属性,进行重新定向。

<router-link < to="/detail">detail</router-link>

redirect和alias的区别

  • redirect:rdirect是直接改变了url的值,把url变成真实的path路径
  • alias:url路径没有改变,这种情况更友好,让用户知道自己访问的路径,只是改变了<router-view>中的内容

小坑

  • 别名请不要用在path为’/’中,如下代码的别名是不起作用的。

      {
        path: '/',
        component: index,
        alias:'/repair'
      }
    

七、路由的过渡动画

1、<transition>标签

  • src/APP.vue

      <transition name="fade">
        <router-view ></router-view>
      </transition>
    

2、css过渡类名

  • 1.fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除。

  • 2.fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除。

  • 3.fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧立刻删除。

  • 4.fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除。

      .fade-enter {
        opacity: 0;
      }
      .fade-enter-active {
        transition: opacity .5s;
      }
      .fade-leave {
        opacity: 1;
      }
      .fade-leave-active {
        opacity: 0;
        transition: opacity .5s;
      }
    

3、过渡模式mode

  • in-out:新元素先进入过渡,完成之后当前元素过渡离开

  • out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。

      <transition name="fade" mode="out-in">
        <router-view ></router-view>
      </transition>
    

八、mode的设置和404页面的处理

  • 路由属性中的mode

1、mode的两个值

2、404页面的设置

  • 1.src/router/index.js

      {
      	path: '*',
      	component: Error
      }
    
  • 这里的path:’*’就是找不到页面时的配置,component是我们新建的一个Error.vue的文件。

  • 2.新建404页面

  • src/components/文件夹下新建一个Error.vue的文件

      <template>
          <div>
              <h2>{{ msg }}</h2>
          </div>
      </template>
      <script>
      export default {
        data () {
          return {
            msg: 'Error:404'
          }
        }
      }
      </script>
    

九、路由中的钩子

1、写在配置文件中的钩子函数

{
      path:'/news/:newsId(\\d+)/:newsTitle',
      component:news,
      beforeEnter:(to,from,next)=>{
        console.log('我进入了params模板');
        console.log(to);
        console.log(from);
        next();
	  }
}
  • 在news路由里配置了bdforeEnter得钩子函数,函数我们采用了ES6的箭头函数,需要传递三个参数

2、参数

  • 1.to:路由将要跳转的路径信息,信息是包含在对象里面的。
  • 2.from:路径跳转前的路径信息,也是一个对象的形式。
  • 3.next:路由的控制参数,常用的有next(true)和next(false).

3、写在模板中的钩子函数

  • 在配置文件中的钩子函数,只有一个钩子-beforeEnter,如果我们写在模板中就可以有两个钩子函数可以使用:

  • beforeRouteEnter:在路由进入前的钩子函数。

  • beforeRouteLeave:在路由离开前的钩子函数。

      export default {
        name: 'news',
        data () {
          return {
            msg: 'news page'
          }
        },
        beforeRouteEnter:(to,from,next)=>{
          console.log("准备进入路由模板");
          next();
        },
        beforeRouteLeave: (to, from, next) => {
          console.log("准备离开路由模板");
          next();
        }
      }
      </script>
    

十、编程式导航

  • this.$router.go(-1)
  • this.$router.go(1)
  • this.$router.push('/xxx ')
posted @ 2018-08-23 17:55  不完美的完美  阅读(360)  评论(0编辑  收藏  举报