day06-Vue03

来源:https://www.cnblogs.com/liyuelian/archive/2023/01/09/17038719.html
-Advertisement-
Play Games

Vue03 10.組件化編程 10.1基本說明 官網鏈接:https://v2.cn.vuejs.org/v2/guide/components-registration.html 在大型應用開發時,頁面可以劃分成很多部分。不同的頁面,往往也會有相同的部分——例如可能會有相同的頭部導航 如果每個頁面 ...


Vue03

10.組件化編程

10.1基本說明

官網鏈接:https://v2.cn.vuejs.org/v2/guide/components-registration.html

  1. 在大型應用開發時,頁面可以劃分成很多部分。不同的頁面,往往也會有相同的部分——例如可能會有相同的頭部導航

  2. 如果每個頁面都獨自開發,無疑增加了我們的開發成本。因此,我們會把頁面的不同部分拆分成獨立的組件,然後在不同的頁面共用這些組件,避免重覆開發

    image-20230109180730166
    • 組件(Component)是Vue.js最強大的功能之一(組件提高了復用性:界面復用性和代碼復用性)
    • 組件也是一個Vue實例,也包括:data,methods,生命周期函數等
    • 組件渲染需要html模板,所以增加了template屬性,屬性的值就是HTML模板
    • 對於全局組件,任何Vue實例都可以直接在HTML中通過組件名稱來使用該組件
    • data在組件中是一個函數,不再是一個對象,這樣每次引用組件都是獨立的對象/數據

10.2應用實例

為什麼需要組件化編程?

例子

現在希望實現一個功能:點擊一個按鈕,可以顯示點擊的次數。如果要求多個按鈕都實現該功能呢?

10.2.1非組件化方式

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>組件化編程-普通方式</title>
</head>
<body>
<div id="app">
    <!--非組件化方式-普通方式-->
    <button v-on:click="count++">點擊次數={{count}}次[非組件化方式]</button><br/>
    <!--
    1.如果需要多個按鈕都實現同樣的功能,直接粘貼複製是不可行的,
        因為這樣的話按鈕都綁定了同一個數據count,
        當其中一個按鈕按下,其他按鈕顯示的數據也會跟著改變。
    2.我們現在的要求是:不同的按鈕的數據應該分開計算,又該怎麼實現?--可以在數據池中增加不同的屬性
    -->
    <button v-on:click="count2 ++">點擊次數={{count2}}次[非組件化方式]</button><br/>
    <!--3.但是新的問題又出現了,當又要增加多個同樣功能的按鈕時,怎麼實現呢?
    仍然像之前一樣,在數據池中不停地增加新的屬性嗎?-->
    <button v-on:click="count3 ++">點擊次數={{count3}}次[非組件化方式]</button>
</div>
<script src="vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {//data數據池
            count: 0,
            count2: 0,
            count3: 0
        }
    })
</script>
</body>
</html>

如上所述,多個按鈕的界面和業務功能都是類似的,但是我們都重新寫了一次,代碼復用性差,如果是在複雜的案例中,問題將會更加明顯。解決方案就是——組件化編程。

10.2.2全局組件方式

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>組件化編程-全局組件</title>
</head>
<body>
<div id="app">
    <h1>組件化-全局組件</h1>
    <!--使用全局組件-->
    <!--vue解析時,會用模板template來替換這個"counter"標識-->
    <counter></counter><br/>
    <counter></counter><br/>
    <counter></counter>
</div>
<script src="vue.js"></script>
<script>
    // 1.定義一個全局組件,名為 counter
    // 2.{} 表示的就是 組件相關的內容
    // 3.template 用於指定該組件的界面,因為會引用到數據池的數據,所以使用模板字元串
    // 4.註意:要把組件視為Vue實例,也有自己的數據池和 方法 methods
    // 5.對於組件,我們的數據池數據是使用函數/方法返回的(目的是為了保證每一個組件的數據是獨立的!),不能使用原來的方式
    // 6.這時我們就實現了 界面通過template實現共用,業務處理可以復用 的目的
    // 7.全局組件是屬於所有的vue實例的,因此可以在任何一個vue實例中使用:
    //   例如當前頁面中有一個vue實例,如果我們再聲明幾個vue實例,該全局組件都可以在這些vue實例中使用
    Vue.component("counter", {
        //組件渲染需要html模板,所以增加了template屬性,值就是HTML模板
        template: `<button v-on:click="click()">點擊次數={{count}}次[全局組件化方式]</button>`,
        data() {//註意和原來的方式不一樣
            return {count: 0}
        },
        methods: {//方法可以共用,但data數據不能共用
            click() {
                this.count++;//每一個組件的this對象不同,因此同一個方法改變的是不同的count
            }
        }
    })

    //創建vue實例,必須有
    let vm = new Vue({
        el: "#app"
    })
</script>
</body>
</html>
image-20230109191402803

10.2.3局部組件方式

<!DOCTYPE html>
<html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>組件化編程-局部組件</title>
</head>
<body>
<div id="app">
    <h1>組件化-局部組件</h1>
    <!--使用局部組件,該組件是從 被掛載到 div(id=app)的vue實例中來的-->
    <my_counter></my_counter><br/>
    <my_counter></my_counter><br/>
    <my_counter></my_counter>
</div>
<script src="vue.js"></script>
<script>
    //定義一個組件 buttonCounter
    // 可以把常用的組件定義在js文件中(export),如果某個頁面需要使用,直接import引入即可
    const buttonCounter = {
        template: `<button v-on:click="click()">點擊次數={{count}}次[局部組件化方式]</button>`,
        data() {
            return {count: 0}
        },
        methods: {
            click() {
                this.count++;
            }
        }
    }

    //創建vue實例,必須有
    let vm = new Vue({
        el: "#app",
        components: {//引入某個組件,此時該組件就是一個局部組件,該組件的使用範圍只在當前的vue實例中
            "my_counter":buttonCounter
        }
    })
    
    // 如果新創建了一個vue實例,掛載到一個div中(id="app2"),在該div中如果要使用局部組件
    // 也必須在該vue實例中引入該組件,否則div((id="app2")無法使用該局部組件
</script>
</body>
</html>
image-20230109192706442

10.2.4全局組件VS局部組件

  1. 全局組件是屬於所有的vue實例的,因此可以在任何一個vue實例中使用。

    例如當前頁面中有一個vue實例,如果我們再聲明幾個vue實例,該全局組件都可以在這些vue實例中使用

  2. 局部組件的使用範圍只在當前的vue實例中。

    例如:如果新創建了一個vue實例,掛載到一個新的div中(如:id="app2"),在div中如果要使用局部組件,也必須在新的vue實例中引入該組件,否則該div中無法使用該局部組件

  3. 組件定義需要放在new Vue()前,否則組件引入/註冊會失效

10.3組件化小結

  • 組件也是一個Vue實例,它的定義也包括:data,methods,生命周期函數等
  • data在組件中是一個函數,不再是一個對象,這樣每次引用組件都是獨立的對象
  • 組件渲染需要html模板,所以增加了template屬性,屬性的值就是HTML模板

11.生命周期和鉤子函數

官網:https://v2.cn.vuejs.org/v2/guide/instance.html

11.1基本說明

  1. Vue實例有一個完整的生命周期,也就是說從開始創建、初始化數據、編譯模板、掛載DOM、渲染-更新-渲染、卸載等一系列過程,我們稱之為Vue實例的生命周期
  2. 鉤子函數(監聽函數/生命周期函數):Vue實例在完整的生命周期過程中(比如設置數據監聽,編譯模板,將實例掛載到DOM,在數據變化時更新DOM等),會自動觸發鉤子函數
  3. 鉤子函數的作用:在某個階段,給程式員一個做某些處理的機會

11.2Vue實例的生命周期

  1. new Vue()

    創建了一個Vue的實例對象,此時就會進入組件的創建過程

  2. Init Events & Lifecycle

    初始化組件的事件和生命周期函數

  3. beforeCreate

    組件創建之後遇到的第一個生命周期函數,這個階段data和methods以及dom結構都未被初始化,也就是獲取不到data的值,不能調用methods中的方法

  4. Init injections & reactivity

    這個階段中,正在初始化data和methods中的方法

  5. created

    這個階段組件的data和methods中的方法已經初始化結束,可以訪問,但是dom結構未初始化,頁面未渲染

    此階段適合發起ajax請求,因為模板的數據未渲染

  6. 編譯模板結構(在記憶體中)

  7. beforeMount

    當模板在記憶體中編譯完成,此時記憶體中的模板結構還未渲染至頁面上,看不到真實的數據

  8. Create vm.$el and replace 'el' with it

    在把記憶體中渲染好的模板結構替換至真實的dom結構,也就是頁面上

  9. mounted

    此時頁面渲染好,用戶看到的是真實的頁面數據,生命周期創建階段完畢,進入到了運行中的階段

  10. 生命周期運行中

    1)beforeUpdate:當執行此函數,數據池的數據是新的,但頁面是舊的

    2)Virtual DOM re-render and patch:根據最新的data數據,重新渲染記憶體中的模板結構,並把渲染好的模 板結構替換至頁面

    3)updated:頁面已經完成了更新,此時data數據和頁面的數據都是新的

  11. beforeDestroy

    當執行此函數時,組件即將被銷毀,但是還沒有真正開始銷毀,此時組件的data,methods方法還可以被調用

  12. Teardown

    註銷組件和事件監聽

  13. destroyed

    組件已經完成了銷毀


11.3應用實例

需求:展示Vue實例的生命周期和鉤子函數執行時機

  1. 重點研究幾個重要的鉤子函數(監聽函數/生命周期函數):beforeCreate,created,beforeMount,mounted,beforeUpdate,updated
  2. 在這幾個鉤子函數中,數據模型是否載入/使用?自定義方法是否載入/可用?html模板是否載入/使用?html模板是否完成渲染?

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

-Advertisement-
Play Games
更多相關文章
  • 通過一個簡單示例來進行對比, Vue的ElementUI組件的行內編輯: Blazor的AntDesginBlazor組件的行內編輯: 區別: el-table-column的label屬性相當於Column的Title屬性,這個是沒有區別的 多了一個scope="scope",在ElementUI ...
  • 又過了好久沒寫了,主要是近來狀況也無聊 一、瞭解概念(參考) 概念 Kubernetes 是一個可移植、可擴展的開源平臺,用於管理容器化的工作負載和服務,可促進聲明式配置和自動化。 Kubernetes 擁有一個龐大且快速增長的生態,其服務、支持和工具的使用範圍相當廣泛。 Kubernetes 這個 ...
  • 如何免密 ssh 登錄空密碼賬戶?getpwent 為何會返回比 /etc/passwd 文件更多的內容?同樣是修改附加組 ID,usermod -G 和 gpasswd -a/-d 有何區別?/etc/networks 有什麼用處?gethostbyname / getservbyname 和 g... ...
  • 監控系統俗稱「第三隻眼」,幾乎是我們每天都會打交道的系統,它也一直是IT系統中的核心組成部分,負責問題的發現以及輔助性的定位。 ChengYing作為一站式全自動化全生命周期大數據平臺運維管家,自然也提供大數據產品的監控服務。這篇文章,將為大家系統性地介紹ChengYing監控的設計和使用,帶大家進 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 楊延昭 文章來源:GreatSQL社區投稿 在資料庫中,除傳統的計算資源(CPU、RAM、IO)的爭用以外,數據也是一種供許多用戶共用的資源。如 ...
  • 1.系統信息 伺服器為阿裡雲伺服器,系統版本為Ubuntu 20.04; 安卓為vivo x9s,系統版本為 安卓8。 具體的介紹參考文末的參考博文。 2.環境搭建 首先在伺服器搭建所需要的環境,按照下列命令依次執行; git clone https://github.com/ntop/n2n.gi ...
  • 在vue開發的父子組件傳值的時候,我們一般都是先封裝一個子組件,給他取名字,然後在要用到此組件的頁面,也就是所說的父組件中將這個子組件導入、註冊、再使用。我們一般都是用駝峰命名導入的組件,在使用時可以直接用駝峰命名的方式使用,也可以將這個駝峰變成小寫,中間以-分隔來進行使用,可以用單標簽也可以用雙標 ...
  • 我們開發的過程中,一般都是將axios封裝後,簡單的設置一下基地址、請求時間、請求攔截器中的請求頭,響應攔截器中對能連通的介面的錯誤拋出處理、響應返回的數據的剝離處理等。以此便於快捷的開發,然後在我們根據後端給的介面,一般會通過swagger來給你介面、請求方法、請求參數等,後端通過postman可 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...