前端整理——Vue部分

来源:https://www.cnblogs.com/fangnianqin/archive/2019/01/02/10207748.html
-Advertisement-
Play Games

(1)Vue的生命周期 1)創建vue實例,初始化生命周期鉤子函數 2)數據檢測及方法和計算屬性代理。在數據檢測和初始化數據之前調用beforeCreated(),這時還獲取不到props或者data中的數據;數據、屬性、方法初始化之後,調用created(),可以訪問之前訪問不到的數據,但是組件還 ...


(1)Vue的生命周期

1)創建vue實例,初始化生命周期鉤子函數
2)數據檢測及方法和計算屬性代理。在數據檢測和初始化數據之前調用beforeCreated(),這時還獲取不到props或者data中的數據;數據、屬性、方法初始化之後,調用created(),可以訪問之前訪問不到的數據,但是組件還沒有掛載,$el屬性還沒有顯示,所以看不到組件。
3)判斷是否有el屬性,如果沒有就判斷是否調用了$mount方法,如果也沒有則停止解析。如果調用了二者之一,就繼續解析。
4)獲取視圖模板。判斷是否有template屬性,如果沒有則將el的視圖節點的outerhtml作為模板;如果有則將template視圖作為模板。
5)編譯模板。生成虛擬DOM,解析指令、組件。
6)將虛擬DOM掛載到真實DOM上。掛載前調用beforemount方法,掛在後調用mounted方法。
7)數據更新導致視圖更新。更新前調用beforeUpdate,更新後調用updated。
8)銷毀vue實例。銷毀前調用beforedestroy,銷毀後調用destroyed。

(2)keep-alive的生命周期

如果你需要在組件切換的時候,保存一些組件的狀態防止多次渲染,就可以使用 keep-alive 組件包裹需要保存的組件。

對於 keep-alive 組件來說,它擁有兩個獨有的生命周期鉤子函數,分別為 activated 和 deactivated 。用 keep-alive 包裹的組件在切換時不會進行銷毀,而是緩存到記憶體中並執行 deactivated 鉤子函數,命中緩存渲染後會執行 actived 鉤子函數。

(3)Vue組件通信

1、父子組件通信

父組件通過props傳遞數據給子組件,子組件通過$emit發送事件傳遞數據給父組件,這兩種方式是最常用的父子通信實現方法。
父子通信方式是單向數據流,父組件通過props傳遞數據,子組件不能直接修改props,而是必須通過發送事件的方式告知父組件修改數據。

2.非父子組件間的數據傳遞,兄弟組件傳值

對於這種情況可以通過查找父組件中的子組件實現,也就是 this.$parent.$children,在 $children 中可以通過組件 name 查詢到需要的組件實例,然後進行通信。

(4)路由

1、路由的鉤子函數

1)全局鉤子函數:beforeEach、afterEach
router.beforeEach(to, from , next) 全局鉤子函數,每次每一個路由改變的時候都得執行一遍。
to:即將要進入的目標路由對象;form:當前導航正要離開的路由;next:Function
next( ):進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是confirmed。
next( false):中斷當前的導航。
next( '/' ):跳轉到一個不同的地址。

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  // ...
})

router.afterEach全局後置鉤子,這些鉤子不會接受 next 函數也不會改變導航本身:

router.afterEach((to, from) => {
  // ...
})

2)單個路由裡面的鉤子:beforeEnter、beforeLeave
你可以在路由配置上直接定義 beforeEnter 鉤子函數,在進入對應路由時調用對應的beforeEnter

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

3)組件內的鉤子函數:beforeRouteEnter 、beforeRouteUpdate 、beforeRouteLeave

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`
  }
}

2、路由跳轉的幾種方式

1)直接調用$router.push實現路由跳轉:

this.$router.push({
     path: `/login/${id}`,
})

對應路由配置如下:

{
     path: '/login/:id',
     name: 'Login',
     component: Login
   }

在子組件中獲取參數值:
this.$route.params.id

2)通過路由屬性中的name來確定匹配的路由,通過params來傳遞參數。

 this.$router.push({
          name: 'Login',
          params: {
            id: id
          }
        })

對應路由配置如下:

{
     path: '/login',
     name: 'Login',
     component: Login
   }

在子組件中獲取參數值:
this.$route.params.id

3)使用path來匹配路由,然後通過query來傳遞參數。這種情況下 query傳遞的參數會顯示在url後面?id=?

  this.$router.push({
          path: '/login',
          query: {
            id: id
          }
        })

對應路由配置如下:

{
     path: '/login',
     name: 'Login',
     component: Login
   }

在子組件中獲取參數值:
this.$route.params.id

(5)組件中data為什麼是一個函數

一個組件的 data 選項必須是一個函數,因此每個實例可以維護一份被返回對象的獨立的拷貝:

data: function () {
  return {
    count: 0
  }
}

原因:對象為引用類型,當重用組件時,由於數據對象都指向同一個data對象,當在一個組件中修改data時,其他重用的組件中的data會同時被修改;而使用返回對象的函數,由於每次返回的都是一個新對象(Object的實例),引用地址不同,則不會出現這個問題

// 1.對象方式(所有重用的實例中的data均為同一個對象)
    var data = {
        x: 1
    };
    var vm1 = {
        data: data
    };
    var vm2 = {
        data: data
    };
    console.log(vm1.data === vm2.data);// true,指向同一個對象
    // 2.函數方式(所有重用的實例中的data均為同一個函數)
    var func = function () {
        return {
            x: 1
        }
    };
    var vm3 = {
        data: func
    };
    var vm4 = {
        data: func
    };
    console.log(vm3.data() === vm4.data()); // false,指向不同對象

參考博文:https://blog.csdn.net/qq_33576343/article/details/82793894

(6)v-show 與 v-if 區別

v-show只是在display:none和display:block之間切換。無論初始條件是什麼都會被渲染出來,後面只需切換CSS,DOM還是一直保留。
v-if 初始值為false時,組件不會被渲染,直到條件為true,並且切換條件時會觸發銷毀/掛載組件。
對比來說,v-show在初始時有更高的開銷,但是切換開銷小,適於頻繁切換的場景;v-if初始渲染開銷小,切換時開銷更高,不適合經常切換的場景。

參考:https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5c024ecbf265da616a476638


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

-Advertisement-
Play Games
更多相關文章
  • 問題: 執行cordova build android 出現輸出如下,編譯不成功。 ANDROID_HOME=/Users/huangenai/Library/Android/sdkJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jd ...
  • 在小米8等一系列圓角的手機上測試項目時,發現我的自定義dialog無法全屏了,這時我的dialog全屏的解決方案還是和網上大部分人是一樣的 但是當手機使用了圓角設計時,可能就會為了顯示效果而強制使dialog能夠完整顯示。 常規做法可能是在其周圍加上padding。但是通過我的代碼可以看到,我已經使 ...
  • 在實際開發中,我們禁止縮放的實現方式: 1.meta設置: <meta name="viewport" content="width=device-width,height=device-height, initial-scale=1.0, maximum-scale=1.0, minimum-sc ...
  • 1.web前端開發,如何提高頁面性能優化? 2.前端開發中,如何優化圖像?圖像格式的區別? 3.Vue的雙向數據綁定原理是什麼? 4.請說下封裝 vue 組件的過程? 5.vue.cli中怎樣使用自定義的組件?有遇到過哪些問題嗎? ...
  • 1. 全局安裝vue cli 2. 初始化 vue ui 執行命令 2.1 該命令會自動打開你的瀏覽器,預設地址為: localhost:8000/project/select ,瀏覽器展示的頁面如下: 切換界面到創建,點擊下麵 在此創建新項目按鈕 2.2 2.3 上面的兩項不用管,是我之前創建過玩 ...
  • 1.var reg=/./ var reg=/\./ 前者代表任何一個字元,後者代表這個字元中得有一個 2.?的使用 如果單獨一個字元後面帶? var reg=/\d?/ /n?/ 代表一個或0個字元的出現 如果是量詞+和*,{2,}後面帶?取消正則的貪婪性 在捕獲階段 3.捕獲 1.普通捕獲 ex ...
  • (註:此文是在看過許多學習資料和視頻之後,加上自身理解拼湊而成,僅作學習之用。若有版權問題,麻煩及時聯繫) 標準頁面結構: Html發展歷史: 註:每一種HTML需要有對應的doctype聲明。 H5 <!doctype html> 無文檔聲明瀏覽器以怪異模式解析html Html標簽: 不使用ht ...
  • (1)盒模型(普通盒模型、怪異盒模型) 1、元素的content(內容)、padding(內邊距)、border(邊框)、margin(外邊距)構成了CSS盒模型 2、IE盒模型和W3C盒模型 1)IE盒模型是怪異模式下的盒模型,W3C盒模型是標準模式下的盒模型; 2)IE盒模型的width/hei ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...