手寫vue路由

来源:https://www.cnblogs.com/xsk-walter/archive/2022/05/16/16275016.html
-Advertisement-
Play Games

一、簡易demo // routes註冊 import Vue from "vue"; // import VueRouter from "vue-router"; import VueRouter from "./vueRouter"; // 自定義路由 js import Home from " ...


目錄

一、簡易demo
// routes註冊
import Vue from "vue";
// import VueRouter from "vue-router";
import VueRouter from "./vueRouter"; // 自定義路由 js
import Home from "../views/Home.vue";

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "Home",
    component: Home,
  },
  {
    path: "/about",
    name: "About",
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () =>
      import(/* webpackChunkName: "about" */ "../views/About.vue"),
  },
];

const router = new VueRouter({
  mode: "history",
  routes,
});

export default router;
// vueRouter
var _Vue = null

export default class VueRouter {
  // 一、 install方法
  static install(Vue) {
    // 1、判斷插件是否註冊
    if (VueRouter.install.installed) return
    VueRouter.install.installed = true

    // 2、將Vue構造函數記錄到全局變數
    _Vue = Vue

    // 3、把創建Vue實例的時候傳入的router對象註入到Vue實例上
    // _Vue.prototype.$router = this.$options.router;
    // 混入
    _Vue.mixin({
      beforeCreate() {
        if (this.$options.router) {
          _Vue.prototype.$router = this.$options.router
          this.$options.router.init() // ?
        }
      }
    })
  }

  //  二、構造函數
  constructor(options) {
    this.options = options
    this.routeMap = {}
    this.data = _Vue.observable({
      current: '/'
    })
  }

  init() {
    this.createRouteMap()
    this.initComponents(_Vue)
    this.initEvent()
  }

  //   三、createRouteMap
  createRouteMap() {
    //   遍歷所有的路由規則,把路由規則解析成鍵值對,保存在routeMap中
    this.options.routes.forEach(route => {
      this.routeMap[route.path] = route.component
    })
  }

  //   四、initComponents
  initComponents(Vue) {
    Vue.component('router-link', {
      props: {
        to: String
      },
      //   template: '<a :href="to"><slot></slot></a>'
      render(h) {
        return h(
          'a',
          {
            attrs: {
              href: this.to
            },
            on: {
              click: this.clickHandler
            }
          },
          [this.$slots.default]
        )
      },
      methods: {
        clickHandler(e) {
          history.pushState({}, '', this.to) // 修改地址欄 - 不會發送請求
          this.$router.data.current = this.to // 重新載入響應的組件
          e.preventDefault() // 阻止發送請求
        }
      }
    })

    const self = this
    Vue.component('router-view', {
      render(h) {
        let component = self.routeMap[self.data.current]
        return h(component)
      }
    })
  }

  //   五、返回按鈕、前進按鈕問題
  initEvent() {
    window.addEventListener('popstate', () => {
      this.data.current = window.location.pathname
    })
  }
}
二、Vue-Router傳參方式

一、普通、動態路由傳參方式

// 路由代碼傳參
import About from 'about'
// routes 配置
{
  path: '/about/:id', // 動態路由
  component: About,
  props: true // ①布爾模式
}

{
  path: '/about', // 普通路由
  component: 'About',
  props: { id: 19 } // ②對象模式
}

// 接收方式 props
props;['id'] 或者
props: {
  id: { type: Number, default: 12}
}
// ③函數模式
routes:[
  {
    path: '/about',
    component: About,
    // props: route => ({id:route.query.id}) // url='/about?id="89"' 或者
    props: route => ({id: route.params.id}) // url='/about/:id' => '/about/89'
  }
]

二、動態路由:將給定匹配模式的路由映射到同一個組件,復用一個組件,相對與銷毀後重建更高效。

  • Keep-alive包括時,組件的聲明周期鉤子函數不會被重覆調用。

  • 要對同一個組件中參數變化做出響應的話,可以通過watch 偵聽$route對象上的任意屬性

    watch: {
      $route: {
        immediate: true,
        handler(route) {
          // 處理事件 對路由變化做出響應
        }
      }
    }
    
  • 或者使用導航守衛,beforeRouteUpdate,也可以取消導航

三、捕獲所有路由或404路由

四、路由的匹配語法

  • 自定義正則 像可以區分 /list/100 和/list/xsk 等路由

    • routes: [ { path: '/list/:id(\\d+)'}, {path: '/list/:name'} ]
  • 可以重覆的參數 匹配多個部分的路由,可以用 * 號和 +號將參數標記為重覆

  • 也可通過使用?號修飾符(0個或1個)將一個參數標記為可選

五、嵌套路由、命名路由

六、編程式導航

  • 聲明式()\編程式路由 router.push(...)

  • Router.push(params):

    • Params: 字元串路徑、路徑對象、命名的路由並加上參數、帶查詢參數、帶hash

    •   '/users/detail'
        { path: '/users/detail' }
        { name: 'detail', params: {id: '0'}}
        { path: '/users/detail', query: {id: '0'} }
      
  • 替換當前位置 router.replace({path: '/users'}) 或者router.push({path:'users', replace: true}); 導航時不會向history添加記錄

  • history.go()橫跨歷史

七、命名視圖:

八、重定向配置

// 通過routes配置來完成
const routes = [{ path: '/home', redirect: '/'}]
// 重定向的目標也可以是一個命名的路由  redirect: { name: 'Details'}
// 一個方法動態返回重定向目標
const routes = [
  {
    path: '/home/:id',
    redirect: to => {
      return {path:'Details', query: { q: to.params.searchText}}
    }
  }
]
// 別名
alias: '/home'

九、路由組件傳參 props、$route.query$route.params

  • 布爾模式 routes配置時 props:true設置即可

  • 對象模式 props: { id: '0' } 當props為靜態的時候很有用

  • 函數模式 創建一個返回props的函數,允許你將參數轉換為其他類型,將靜態值與基於路由的值相結合等操作

    props: route => ({ query: route.query.id })
    props: route => ({ params: route.params.id})
    
  • 對於命名視圖的路由,必須為每個命名視圖定義props配置

    const routes = [{
      path: '/home',
      components: { default: Home, sidebar: Sidebar},
      props: { default: true, sidebar: true}
    }]
    

十、不同的歷史模式

  • Hash模式:history: createWebHashHistory() SEO受影響
  • HTML5模式:history:createWbeHistory() 如果沒有適當的伺服器配置,就會404,需要在伺服器上添加一個簡單的回退路由
三、進階-路由導航

一、導航守衛:vue-router提供的主要是通過跳轉或取消的方式守衛導航。

  • 方式:全局、單個路由獨享、組件

  • 全局前置守衛:beforeEnter:

    • 每個守衛都接收兩個__參數__:to\from\next(可選)
    • 返回值 ①false:取消當前導航、②一個路由地址:通過一個路由地址跳轉到不同的地址,類似於router.push()可配置,當前的 導航被中斷然後進行一個新的導航。
    • next可選參數
  • 全局後置守衛:afterEach 不接受next函數也不會改變導航本身

  • 全局解析守衛:beforeResolve

  • 路由獨享守衛:在routes中配置

  • 組件內的守衛 可用配置API:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave

    • beforeRouteEnter:唯一可傳遞next回調守衛;解決不可訪問this;
    • next()里的內容執行時機在組件mounted周期之前;
    • beforeRouteUpdate: 該組件復用時被調用

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹如何使用 SQL GROUP BY 子句分組數據,以便彙總表內容的子集。這涉及兩個新 SELECT 語句子句:GROUP BY 子句和 HAVING 子句。 一、數據分組 從 如何使用 SQL AVG、COUNT、MAX、MIN 和 SUM 彙總數據 中得知,使用 SQL 聚集函數可以彙總數 ...
  • 本文為大家展示如何用低代碼實現一個簡單的頁面跳轉功能,讓你一看就會,一做就對! ...
  • 5月18日晚19:00,Hello HarmonyOS進階系列應用篇第三課《游戲開發實踐》直播如約而至。 ...
  • 編者按:在 OpenHarmony 生態發展過程中,涌現了大批優秀的代碼貢獻者,本專題旨在表彰貢獻、分享經驗,文中內容來自嘉賓訪談,不代表 OpenHarmony 工作委員會觀點。 李俊剛 深圳開鴻數字產業發展有限公司 資深OS驅動開發工程師 開源之風盛行,有人站在門口躍躍欲試,有人已經進場大展身手 ...
  • Gradle 作為官方主推的構建系統,目前已經深度應用於 Android 的多個技術體系中,例如組件化開發、產物構建、單元測試等。可見,要成為 Android 高級工程師 Gradle 是必須掌握的知識點。在這篇文章里,我將帶你由淺入深建立 Gradle 的基本概念,涉及 Gradle 生命周期、P... ...
  • 華為運動健康服務(HUAWEI Health Kit)提供原子化數據開放,在獲取用戶對數據的授權後,應用可通過介面訪問運動健康數據,對用戶數據進行增、刪、改、查等操作,為用戶提供運動健康類數據服務。這篇文章中我們總結了開發者提出的授權相關的典型問題並給出了參考解決方法,希望為其他遇到類似問題的開發者 ...
  • 學完vue2還是決定先做一個比較經典,也比較大的項目來練練手好一點,vue3的知識不用那麼著急,先把vue2用熟練了,vue3隨時都能學。 這個項目確實很經典包含了登錄註冊、購物車電商網站該有的都有,後面還會結合elementUI構件後臺管理界面。拭目以待! 一.初始化腳手架環境 vue creat ...
  • 1.首先需要知道什麼事跨域 瀏覽器從一個功能變數名稱的網頁去請求另一個功能變數名稱的資源時,功能變數名稱、埠、協議任一不同,都是跨域 出於瀏覽器的同源策略限制 同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同 源策略,則瀏覽器的正常功能可能都會受到影響 同源策略限制 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...