最新vue-router的hooks用法你會嗎?本文詳解

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/06/09/13070697.html
-Advertisement-
Play Games

雖然Vue 3還沒有正式發佈,但是熱愛新技術的我早已按捺不住自己的內心,開始嘗試在小項目中使用它了。 1.根據這篇《今日凌晨Vue3 beta版震撼發佈,竟然公開支持腳手架項目!》我搭建了一個Vue 3的腳手架項目,用這種方式搭建的腳手架項目不僅僅只有vue是新版的,就連vue-router、vue ...


雖然Vue 3還沒有正式發佈,但是熱愛新技術的我早已按捺不住自己的內心,開始嘗試在小項目中使用它了。

1.根據這篇《今日凌晨Vue3 beta版震撼發佈,竟然公開支持腳手架項目!》我搭建了一個Vue 3的腳手架項目,用這種方式搭建的腳手架項目不僅僅只有vue是新版的,就連vue-router、vuex都是最新的。
2.光理論是不夠的。在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

給大家截一下package.json的圖:

 

可以看到vue-router和vuex都已經開啟4.0時代啦!

 

不過其實我並沒有去瞭解過vue-router 4.0的新用法什麼的,因為我覺得它不像vue 3.0都已經進行到beta的版本不會有特別大的變動。

而vue-router 4.0還是alpha的階段,所以我認為現在去學習它有些為時尚早。但卻就是它!差點釀成了一場慘劇。

舊版vue + vue-router的使用方式

假如你在路由裡面定義了一個動態參數通常都會這麼寫:

{
    path: '/:id'
}
複製代碼

然後用編程式導航的時候通常會這樣去寫:

this.$router.push('/123')
複製代碼

在組件中是這樣獲取這個參數的:

this.$route.params.id
複製代碼

我以為的新版vue + vue-router的使用方式

由於vue 3.0的Composition API中沒有this了,所以我想到了通過獲取組件實例的方式來獲取$route:

import { defineComponent, getCurrentInstance } from 'vue'

export default defineComponent((props, context) => {
    const { ctx } = getCurrentInstance()
    
    console.log(ctx.$route)
})
複製代碼

沒想到列印出來的居然是undefined! 這是咋回事呢? 於是我又列印了一遍ctx(ctx是當前組件上下文):

 

沒有$的那些欄位是我在組件中自己定義的變數,帶$的這些就是vue內置的了,找了半天發現沒有$route了,只剩下了一個$router,估計vue-router 4.0把當前路由信息都轉移到$router裡面去了。

 

帶著猜想,我點開了$router:

 

currentRoute! 看名字的話感覺應該就是它了!於是乎我:

 

import { defineComponent, getCurrentInstance } from 'vue'

export default defineComponent((props, context) => {
    const { ctx } = getCurrentInstance()
    
    console.log(ctx.$router.currentRoute.value.params.id)
})
複製代碼

果然獲取到了!好開心!

實際的新版vue + vue-router用法

在接下來的過程中我用ctx.$router代替了原來的this.$router、用ctx.$router.currentRoute.value代替了原先的this.$route。

儘管在接下來的進度中並沒有出現任何的bug,程式一直都是按照我所設想的那樣去運行的。

但在項目打包後卻出現了意想不到的bug:在跳轉路由的時候報了一個在undefined上面沒有push的錯誤。

奇了怪了,在開發階段程式都沒有任何的報錯怎麼一打包就不行了呢?依靠多年的開發經驗,我很快就定位到了是vue-router的錯誤。

難道這樣寫是錯的嗎?可是我列印了ctx,它裡面明明有一個$router、$router裡面明明就有currentRoute、currentRoute裡面明明就有一個value、value裡面明明就有params、params裡面我一點開明明就看到了傳過來的參數啊:

 

估計可能是vue-router的bug,果然alpha階段的產物不靠譜,我開始後悔使用新版的vue腳手架項目了。

 

vue-router里的hooks

不過這時我突然靈光一現,vue 3不是受到了react hooks的啟發才產生了Composition API的嗎?

那麼估計vue-router肯定也會受到react-router的啟發了!

還好我學過react,果然技多不壓身啊!估計裡面肯定是有一個useXxx,就像這樣:

import { useXxx } from 'vue-router'
複製代碼

那麼應該是use什麼呢?按理來說應該會儘量的和以前的API保持一定的聯繫,我猜應該是useRoute和useRouter吧!

為了驗證我的想法,我打開了node_modules找到了vue-router的源碼:

 

 

果不其然,在第2454和第2455行我發現它導出了useRoute和useRouter,那麼就是它了:

import { defineComponent } from 'vue'
import { useRoute, useRouter } from 'vue-router'

export default defineComponent(_ => {
    const route = useRoute()
    const router = useRouter()

    console.log(route.params.id)
    router.push('/xxx/xxx')
})
複製代碼

使用這種方式不但可以成功跳轉路由,也同樣可以獲取到路由傳過來的參數,這次再打包試了一下,果然就沒有之前的那個報錯了。

結語

1.估計以後的vue全家桶要開啟全民hooks的時代了,在翻看源碼的同時我發現他們把一些示例都寫在了vue-router/playground文件夾下了,在裡面我發現了一些有趣的用法。
2.光理論是不夠的。在此贈送2020最新企業級 Vue3.0/Js/ES6/TS/React/node等實戰視頻教程,想學的可進裙 519293536 免費獲取,小白勿進哦!

本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理


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

-Advertisement-
Play Games
更多相關文章
  • 前言 使用vue、react、angular等技術開發過程中,我們都會遇到以下問題: 首屏載入慢 每一次更新都需要清除瀏覽器緩存才能看到效果(經常被測試吐槽) 這兩個問題可以從很多方面進行優化,今天我就從前端頁面部署階段來優化一下這兩個問題。PS:以下內容都基於vue-cli3+。 3.光理論是不夠 ...
  • 前言 這幾天 Vue 3.0 Beta 版本發佈了,本以為是皆大歡喜的一件事情,但是論壇里還是看到了很多反對的聲音。主流的反對論點大概有如下幾點: 義大利面代碼結構吐槽: “太失望了。雜七雜八一堆丟在 setup 里,我還不如直接用 react” 我的天,3.0 這麼搞的話,代碼結構不清晰,語義不明 ...
  • 坐標珠海,前端程式媛一枚 實習時候做的是測試,2.5k+600餐補; 後來覺得對前端更有興趣所以重新找工作,但是苦於沒有經驗,畢業第一年在一個傳統行業的公司找到了一個前端崗位,薪酬4k,公司主要是接政府項目,伺候甲方爸爸。 前端崗位歸在產品組,實際做的是產品經理+UI+交互+代碼 產品組長/真 · ...
  • 先說一下現在公司企業招聘前端開發人員需要掌握哪些技術要求 目前企業招聘前端工程師的基本需求: 1.精通DIV+CSS網頁框架佈局的HTML代碼編寫,熟悉W3C標準; 2、使用HTML5/CSS3熟練地進行頁面開發; 3.具備良好的前端架構分析能力與設計能力,與開發團隊保持良好溝通; 4.精通各主流瀏 ...
  • Vue Axios 封裝 定義 Axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。 特性 支持Promise API 攔截請求和響應 轉換請求數據和響應數據 自動轉換JSON數據 客戶端支持 XRSF 回歸正題 在Vue 項目開發中,我們與介面打交道最多 ...
  • 訪問谷歌頁面,商店應用等 1.下載鏈接:https://pan.baidu.com/s/1yt0PGLpQkQIE5FYXA4v7yA提取碼:kqp2 2.安裝將 crx 尾碼改成 rar 尾碼,然後解壓 3.添加擴展程式 4.完成安裝 提示需要激活,否則只有12小時免費 5、點擊永久免費激活 要想 ...
  • 前言 本文旨在理一下vue中diff演算法的主要邏輯和關鍵細節。 從一個簡單的demo切入: p標簽渲染一個items數組 <div id="demo"> <p v-for="item in items" :key="item">{{ item }}</p> </div> <script src=". ...
  • 前言 有一個問題, 給定一個物體的運動軌跡, 包含時間和坐標的數組, 如何使用這個數據來預測物體未來的運動走勢?? 本文提供了一個很簡單的方式去實現這個演算法. 效果夠用, 又簡單, 有一定的準確程度. 緣由 以前做過的一些手機應用, 沒有做動畫的 , 也沒做手勢. 這個做起來挺麻煩的. 最近開始了新 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...