vue-router-官網

 

  vue-router:javascript

vue router功能:
    嵌套的路由/視圖表
    模塊化的/基於組件的路由配置
    路由參數/查詢/通配符
    基於vue.js過渡系統的視圖過渡效果
    細粒度的導航控制
    帶有自動激活的css class的連接
    h5歷史模式或hash模式,在IE9中自動降級
    自定義的滾動條行爲


<router-view> 是最頂層的出口,渲染最高級路由匹配到的組件。一樣地,一個被渲染組件一樣能夠包含本身的嵌套 <router-view>


以/開頭的嵌套路徑會被看成根路徑,則使用嵌套路徑無須設置嵌套的路徑。

  vue-router傳參:css

router傳參方式:路由匹配參數;query方式傳參;params方式傳參;
(1)動態路由匹配,路由匹配參數:
     // 動態路徑參數 以冒號開頭
    { path: '/user/:id', component: User }
    // 獲取參數
     let name = this.$route.params.id; // 連接裏的id被封裝進了 this.$route.params       
  (2) query  
     this.$router.push('/login/' + this.id);
     this.$route.query.id 
    
    this.$router.push({
      path: '/payment/recharge',
      query: {
        amount: that.amount
      }
    });
    this.$route.query.amount
    
    徹底能夠在連接後加上?進行傳參 
    http://localhost:8080/?id=18
    this.$route.query.id
    
   (3) params
    this.$router.push({
      name: '確認圖片',
      params: {
       amount: that.amount
      }
    })
    this.$route.params.amount 

ps:若提供了path,則params會被忽略
 $router && $route:
 $router:router實例,用於路由跳轉,
(1)this.$router.push({
      path: '/payment/recharge',
      query: {
        amount: that.amount
      }
    });
(2)this.$router.push({
      name: '確認圖片',
      params: {
       amount: that.amount
      }
    })
    
$route:當前激活的路由信息對象,用於獲取參數,
(1)this.$route.query.amount
(2)this.$route.params.amount 

  嵌套路由:vue

嵌套路由:
const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User,
      children: [
        {
          // 當 /user/:id/profile 匹配成功,
          // UserProfile 會被渲染在 User 的 <router-view> 中
          path: 'profile',
          component: UserProfile
        },
        {
          // 當 /user/:id/posts 匹配成功
          // UserPosts 會被渲染在 User 的 <router-view> 中
          path: 'posts',
          component: UserPosts
        }
      ]
    }
  ]
})

 編程式導航::java

導航方式:
(1)<router-link>建立a標籤來定義導航連接(聲明式導航)
(2)router.push(location, onComplete?,onAbort?) (編程式導航)
(3)router.replace(location, onComplete?,onAbort?) (編程式導航)
(3)router.go(n) (編程式導航)

 ps:想要導航到不一樣的URL,則使用router.push方法,該方法會向history棧添加一個新的記錄,當用戶點擊瀏覽器回退按鈕時則回到以前的url。   
 該方法的參數能夠是一個字符串路徑或者一個描述地址的對象。router.replace不會向history添加新記錄,只是替換當前的history記錄。
 router.go在history記錄中向前或向後後退多少步。
 
 // 字符串,路徑path匹配
router.push('home')
// 對象
router.push({ path: 'home' })
// 命名的路由 /register/userId=123
router.push({ name: 'user', params: { id: '1' }})
// 帶查詢參數,變成 /register?id=1
router.push({ path: 'register', query: { id: '1' }})        
ps:若提供了path,則params會被忽略

  命名路由:ios

在建立router實例的時候,在routes配置中給某個路由設置名稱。
const router = new VueRouter({
    routes: [
        {
            path:'/user/:userId',
            name:'user',
            component:User
        }
    ]
})
// 連接到命名路由方式(1)給router-link的to屬性傳遞一個對象(2)給router.push傳遞一個對象
<router-link :to="{name:'user', params:{userId:123}}">User</router-link>
router.push({name:'user', params: {userId:123}})

  重定向:vue-router

重定向:
    { path: '/a', redirect: '/b' }
    { path: '/a', redirect: { name: 'foo' }}

  導航守衛:編程

導航守衛:主要用來經過跳轉或取消的方式守衛導航。登陸的攔截,權限的校驗,等
ps:參數或查詢的改變並不會觸發進入或離開的導航守衛。能夠經過$route對象來應對這些變化或使用beforeRouteUpdate的組件內守衛。

全局前置守衛:
const router = new VueRouter({...})
router.beforeEach((to, from, next)=>{
    next()
})
ps:必定要調用next方法來resolve這個鉤子,執行效果依賴next方法的調用參數。進行管道中的下一個鉤子。若是所有鉤子執行完了,則導航的狀態就是 confirmed 
next(false) 中斷當前導航,能夠判斷某些條件下如url改變了則中斷,url會重置到from路由對應的地址;
next('/) next({path:'/'}) 跳轉到一個不一樣的地址,當前導航被中斷,而後進行一個新的導航;

全局後置鉤子:
const router = new VueRouter({...})
router.afterEach((to, from, next)=>{
})

路由獨享的守衛:
const router = new VueRouter({
    routes:[
        {
            path:'/foo',
            component:Foo,
            beforeEnter: (to, from, next) => {
                //...
            }
        }
    ]
})

組件內鉤子:
const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染該組件的對應路由被 confirm 前調用
    // 不!能!獲取組件實例 `this`
    // 由於當鉤子執行前,組件實例還沒被建立
  },
  beforeRouteUpdate (to, from, next) {
    // 在當前路由改變,可是該組件被複用時調用
    // 舉例來講,對於一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,
    // 因爲會渲染一樣的 Foo 組件,所以組件實例會被複用。而這個鉤子就會在這個狀況下被調用。
    // 能夠訪問組件實例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 導航離開該組件的對應路由時調用
    // 能夠訪問組件實例 `this`
  }
}



完整的導航解析流程:
導航被觸發。
在失活的組件裏調用離開守衛。
調用全局的 beforeEach 守衛。
在重用的組件裏調用 beforeRouteUpdate 守衛 (2.2+)。
在路由配置裏調用 beforeEnter。
解析異步路由組件。
在被激活的組件裏調用 beforeRouteEnter。
調用全局的 beforeResolve 守衛 (2.5+)。
導航被確認。
調用全局的 afterEach 鉤子。
觸發 DOM 更新。
用建立好的實例調用 beforeRouteEnter 守衛中傳給 next 的回調函數。

  路由元信息:axios

路由元信息:路由配置裏的一個屬性meta,其是一個對象,能夠存放一些key-value,經過路由元信息meta實現不一樣路由展示不一樣頁面(帶不一樣的meta信息,展現不一樣頁面佈局)
routes 配置中的每一個路由對象爲 路由記錄。路由記錄能夠是嵌套的,所以,當一個路由匹配成功後,他可能匹配多個路由記錄
例如,根據上面的路由配置,/foo/bar 這個 URL 將會匹配父路由記錄以及子路由記錄。
一個路由匹配到的全部路由記錄會暴露爲 $route 對象 (還有在導航守衛中的路由對象) 的 $route.matched 數組。所以,咱們須要遍歷 $route.matched 來檢查路由記錄中的 meta 字段

直接在路由配置的時候,給每一個路由添加一個自定義的meta對象,在meta對象中能夠設置一些狀態,來進行一些操做。用它來作登陸校驗再合適不過了。

  路由懶加載:segmentfault

路由懶加載:
當打包構建應用時,JavaScript 包會變得很是大,影響頁面加載。若是咱們能把不一樣路由對應的組件分割成不一樣的代碼塊,而後當路由被訪問的時候才加載對應組件,能提升頁面的訪問速度。
路由和組件的經常使用兩種懶加載方式:
1.vue異步組件實現路由懶加載  component:resolve => (['須要加載的路由的地址',resolve]) 如component: resolve => require(['./page/linkParamsQuestion.vue'], resolve)
2.es提出的import  const HelloWorld = () => import('須要加載的模塊地址')

  

import Vue from 'vue'

import 'normalize.css/normalize.css'// A modern alternative to CSS resets
// 引入animated動畫
import '@/styles/lib/animate.min.css'
import '@/styles/lib/layer.css'

import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css'

import './styles/index.scss' // global css
import App from './App'
import router from './router'
import store from './store'
import * as allFilters from './filters/allFilters'
Object.keys(allFilters).forEach(key => {
  Vue.filter(key, allFilters[key])
})

import '@/icons' // icon
// import FastClick from 'fastclick'
// FastClick.attach(document.body);

Vue.filter('changeMemberNum', function(val) {
  return val.replace(/\s/g, '').replace(/(.{4})/g, '$1 ');
})
// import '@/permission' // permission control

// 使用代理的方式請求URLaxios request
// import Axios from 'axios'
// import VueAxios from 'vue-axios'
// Vue.use(VueAxios, Axios)

// 微信js-sdk
const $wx = require('weixin-js-sdk');
Vue.prototype.$wechat = $wx;

import VueQrcode from '@chenfengyuan/vue-qrcode';
Vue.component(VueQrcode.name, VueQrcode);

// 頁面加載進度條顯示NProgress
import NProgress from 'nprogress' // Progress 進度條
import 'nprogress/nprogress.css'// Progress 進度條樣式
router.beforeEach((to, from, next) => {
  NProgress.start() // 開啓Progress
  NProgress.configure({ ease: 'ease', speed: 500 }); // 配置進度條
  next();
  NProgress.done()
})
router.afterEach(() => {
  NProgress.done() // 結束Progress
})

Vue.use(MintUI)

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  store,
  template: '<App/>',
  components: { App }
})

 

 參考 & 感謝:vue-router官網 & 各路大神

 https://segmentfault.com/a/1190000009651628
相關文章
相關標籤/搜索