Vue 組件化編程

来源:https://www.cnblogs.com/codechen8848/archive/2022/10/26/16830236.html
-Advertisement-
Play Games

1.1 模塊與組件、模塊化與組件化 1.1.1 模塊 理解:向外提供特定功能的 js 程式,一般就是一個 js 文件 為什麼:js 文件很多很複雜 作用:復用 js,簡化 js 的編寫,提高 js 運行效率 1.1.2 組件 理解:用來實現局部(特定)功能效果的代碼集合( html/css/js/i ...


1.1 模塊與組件、模塊化與組件化

1.1.1 模塊

  1. 理解:向外提供特定功能的 js 程式,一般就是一個 js 文件
  2. 為什麼:js 文件很多很複雜
  3. 作用:復用 js,簡化 js 的編寫,提高 js 運行效率

1.1.2 組件

  1. 理解:用來實現局部(特定)功能效果的代碼集合( html/css/js/image.....)
  2. 為什麼:一個界面的功能很複雜
  3. 作用:復用編碼,簡化項目編碼,提高運行效率

1.1.3 模塊化

當應用中的 js 都以模塊來編寫的,那這個應用就是一個模塊化的應用。

1.1.4 組件化

當應用中的功能都是多組件的方式來編寫的,那這個應用就是一個組件化的應用。

1.2 非單文件組件

1.2.1 說明

  1. 模板編寫沒有提示
  2. 沒有構建過程,無法將 ES6 轉換成 ES5
  3. 不支持組件的 CSS
  4. 真正開發中幾乎不用

1.2.2 基本使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>基本使用</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        Vue中使用組件的三大步驟:
            一、定義組件(創建組件)
            二、註冊組件
            三、使用組件(寫組件標簽)

			一、如何定義一個組件?
                使用 Vue.extend(options) 創建,其中 options 和 new Vue(options) 時傳入的那個 options 幾乎一樣,但也有點區別;
                    區別如下:
                        1.el 不要寫,為什麼? ——— 最終所有的組件都要經過一個 vm 的管理,由 vm 中的 el 決定服務哪個容器。
                        2.data 必須寫成函數,為什麼? ———— 避免組件被覆用時,數據存在引用關係。
                    備註:使用 template 可以配置組件結構。

			二、如何註冊組件?
                1.局部註冊:靠 new Vue 的時候傳入 components 選項
                2.全局註冊:靠 Vue.component('組件名',組件)

			三、編寫組件標簽:
                <school></school>
    -->
    <div id="root">
        <!-- <h2>學校名稱:{{schoolName}}</h2>
        <h2>學校地址:{{schoolAddress}}</h2>
        <h2>學生姓名:{{studentName}}</h2>
        <h2>學生年齡:{{studentAge}}</h2> -->

        <!-- 第三步:使用組件 -->
        <xuexiao></xuexiao>
        <hr></hr>
        <student></student>
    </div>

    <div id="root2">
        <xuexiao></xuexiao>
        <hr></hr>
        <student></student>
    </div>

    <script>
        // 阻止 vue 在啟動時生成生產提示
        Vue.config.productionTip = false

        // 第一步:創建組件
        const school = Vue.extend({
            template: `
                <div>
                    <h2>學校名稱:{{schoolName}}</h2>
                    <h2>學校地址:{{schoolAddress}}</h2>
                </div>`,
            data() {
                return {
                    schoolName: "廈門大學",
                    schoolAddress: "廈門",
                }
            }
        })

        // 第一步:創建組件
        const student = Vue.extend({
            template: `
                <div>
                    <h2>學生姓名:{{studentName}}</h2>
                    <h2>學生年齡:{{studentAge}}</h2>
                </div>`,
            // 組件定義時,一定不要寫 el 配置項,因為最終所有的組件都要被一個 vm 管理,由 vm 決定服務於哪個容器
            // el: "#rtoot",
            data() {
                return {
                    studentName: "李四",
                    studentAge: 22,
                }
            }
        })

        // 全局註冊組件
        Vue.component("xuexiao", school)
        Vue.component("student", student)

        new Vue({
            el: "#root",
            data: {
                schoolName: "北京大學",
                schoolAddress: "北京",
                studentName: "張三",
                studentAge: 18,
            },
            
            // 第二步:註冊組件
            components: {
                xuexiao: school,
                student
            }
        })

        new Vue({
            el: "#root2",
            data: {

            }
        })
    </script>
</body>
</html>

1.2.3 註意事項

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>幾個註意點</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        幾個註意點:
            1.關於組件名:
                一個單片語成:
                    第一種寫法(首字母小寫):school
                    第二種寫法(首字母大寫):School
                多個單片語成:
                    第一種寫法( kebab-case 命名):my-school
                    第二種寫法(CamelCase 命名):MySchool (需要 Vue 腳手架支持)
                備註:
                    (1).組件名儘可能迴避 HTML 中已有的元素名稱,例如:h2、H2 都不行。
                    (2).可以使用 name 配置項指定組件在開發者工具中呈現的名字。

            2.關於組件標簽:
                第一種寫法:<school></school>
                第二種寫法:<school/>
                    備註:不用使用腳手架時,<school/> 會導致後續組件不能渲染。

            3.一個簡寫方式:
                const school = Vue.extend(options) 可簡寫為:const school = options
    -->
    <div id="root">
        <h2>{{ message }}</h2>
        <!-- 寫法一:首字母小寫 -->
        <school></school>

        <!-- 寫法二:首字母大寫 -->
        <School></School>

        <!-- 寫法三 -->
        <!-- 不用腳手架時,當使用多個組件,會導致後續組件不能渲染 -->
        <school />
        <school />
    </div>

    <script>
        // 阻止 vue 在啟動時生成生產提示
        Vue.config.productionTip = false

        // 定義組件
        // const school = Vue.extend({
        //     name: "MySchool",
        //     template: `
        //         <div>
        //             <h2>學校名稱:{{ name }}</h2>
        //             <h2>學校地址:{{ address }}</h2>
        //         </div>
        //     `,
        //     data() {
        //         return {
        //             name: "北京大學",
        //             address: "北京"
        //         }
        //     }
        // })
        // 定義組件
        const school = {
            name: "MySchool",
            template: `
                <div>
                    <h2>學校名稱:{{ name }}</h2>
                    <h2>學校地址:{{ address }}</h2>
                </div>
            `,
            data() {
                return {
                    name: "北京大學",
                    address: "北京"
                }
            }
        }

        new Vue({
            el: "#root",
            data: {
                message: "歡迎學習 Vue!"
            },
            // 註冊組件
            components: {
                school
            }
        })
    </script>
</body>
</html>

1.2.4 組件的嵌套

components.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>組件的嵌套</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <!-- <h2>{{ message }}</h2>
        
        <hello></hello>

        <school></school> -->

    </div>

    <script>
        // 阻止 vue 在啟動時生成生產提示
        Vue.config.productionTip = false


        // 定義學生組件
        const student = Vue.extend({
            template: `
                <div>
                    <h2>學生名稱:{{ name }}</h2>
                    <h2>學生年齡:{{ age }}</h2>
                </div>
            `,
            data() {
                return {
                    name: "北京大學",
                    age: 20
                }
            }
        })

        // 定義組件
        const school = Vue.extend({
            name: "MySchool",
            template: `
                <div>
                    <h2>學校名稱:{{ name }}</h2>
                    <h2>學校地址:{{ address }}</h2>
                    <student></student>
                </div>
            `,
            data() {
                return {
                    name: "北京大學",
                    address: "北京"
                }
            },
            components: {
                student
            }
        })

        // 定義 hello 組件
        const hello = Vue.extend({
            template: `
                <div>
                    <h2> Hello World </h2>
                </div>
            `,
        })

        const app = ({
            template: `
                <div>
                    <h2>{{ message }}</h2>
                    
                    <school></school>

                    <hello></hello>
                </div>
            `,
            data() {
                return {
                    message: "歡迎學習 Vue!"
                }
            },
            // 註冊組件
            components: {
                school, hello   
            }
        })

        new Vue({
            el: "#root",
            template: `
                <app></app>
            `,
            // data: {
            //     message: "歡迎學習 Vue!"
            // },
            // 註冊組件
            components: {
                app
            }
        })
    </script>
</body>
</html>

1.2.5 VueComponent

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>VueComponent</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        關於VueComponent:
            1.school 組件本質是一個名為 VueComponent 的構造函數,且不是程式員定義的,是 Vue.extend 生成的。

            2.我們只需要寫 <school/> 或 <school></school>,Vue 解析時會幫我們創建 school 組件的實例對象,即 Vue 幫我們執行的:new VueComponent(options)。

            3.特別註意:每次調用 Vue.extend,返回的都是一個全新的 VueComponent

            4.關於this指向:
                (1).組件配置中:
                    data 函數、methods 中的函數、watch 中的函數、computed 中的函數 它們的 this 均是【 VueComponent 實例對象】。
                (2).new Vue(options)配置中:
                    data 函數、methods 中的函數、watch 中的函數、computed 中的函數 它們的 this 均是【 Vue 實例對象】。

            5.VueComponent 的實例對象,以後簡稱 vc(也可稱之為:組件實例對象)。
                Vue的實例對象,以後簡稱vm。
    -->
    <div id="root">
        <school></school>
    </div>

    <script>
        // 阻止 vue 在啟動時生成生產提示
        Vue.config.productionTip = false

        //定義school組件
		const school = Vue.extend({
			name: "school",
			template:`
				<div>
					<h2>學校名稱:{{ name }}</h2>	
					<h2>學校地址:{{ address }}</h2>	
					<button @click="showName">點我提示學校名</button>
				</div>
			`,
			data(){
				return {
					name: "北京大學",
					address: '北京'
				}
			},
			methods: {
				showName(){
                    // 組件中的 this 是 VueComponent 實例
					console.log('showName', this)
				}
			},
		})

        const test = Vue.extend({
			template: `<span>atguigu</span>`
		})

		//定義hello組件
		const hello = Vue.extend({
			template:`
				<div>
					<h2>{{ msg }}</h2>
					<test></test>	
				</div>
			`,
			data(){
				return {
					msg: '你好啊!'
				}
			},
			components:{ test }
		})


		console.log('@', school)
		console.log('#', hello)
        
        // false 說明兩個是不同的 VueComponent 實例
        console.log(school === hello);

        const vm = new Vue({
            el: "#root",
            data: {
                
            },
            components: {
                school, hello
            }
        })
    </script>
</body>
</html>

1.2.6 內置關係

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>一個重要的內置關係</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        1.一個重要的內置關係:VueComponent.prototype.__proto__ === Vue.prototype
        2.為什麼要有這個關係:讓組件實例對象(vc)可以訪問到 Vue 原型上的屬性、方法。
    -->
    <div id="root">
        <school></school>

        <hello></hello>
    </div>

    <script>
        // 阻止 vue 在啟動時生成生產提示
        Vue.config.productionTip = false

        // 定義 school 組件
        const school = Vue.extend({
            template: `
                <div>
                    <h2>學校名稱:{{ name }}</h2>
                    <h2>學校地址:{{ address }}</h2>
                </div>
            `,
            data() {
                return {
                    name: "北京大學",
                    address: "北京"
                }
            }
        })

        const hello = Vue.extend({
            template: `
                <div>
                    <h2>Hello World</h2>
                </div>
            `,
            data() {
                return {
                }
            }
        })

        console.log(school.prototype.__proto__ === Vue.prototype);

        new Vue({
            el: "#root",
            data: {
                
            },
            components: {
                school, hello
            }
        })

        // 定義一個構造函數
        function Demo() {
            this.a = 1
            this.b = 2
        }

        const d = new Demo()

        // 顯示原型屬性
        console.log(Demo.prototype);
        
        // 隱式原型屬性高 
        console.log(d.__proto__);

        console.log(Demo.prototype === d.__proto__);

        Demo.prototype.x = 99

        console.log(d.__proto__.x);


</script>
</body>
</html>

1.3 單文件組件

1.3.1 一個 .vue 文件的組成( 3 個部分)

  1. 模板頁面

    <template>
    頁面模板
    </template>
    
  2. JS 模塊對象

    <script>
        export default{
        data(){
            return{}
        },
        methods:{},
        computed:{},
        components:{}
        }
    </script>
    
  3. 樣式

    <style>
    	樣式定義
    </style>
    
  4. 示例代碼

    <template>
        <div>
            <h2>學生姓名:{{ name }}}</h2>
            <h2>學生年齡:{{ age }}}</h2>
        </div>
    </template>
    
    <script>
    export default {
        name: "Student",
        data() {
            return {
                name: "張三",
                age: 18
            }
        }
    }
    </script>
    
    <style>
    
    </style>
    

1.3.2 基本使用

  1. 引入組件

    <script>
    import School from "./School.vue";
    import Student from "./Student.vue";
    
    export default {
      name: "App",
      components: {
        School,
        Student,
      },
    };
    </script>
    
  2. 使用組件標簽

    <template>
      <div>
        <School></School>
        <Student></Student>
      </div>
    </template>
    

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

-Advertisement-
Play Games
更多相關文章
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 用一個簡明、清晰的步驟來解析一下DML操作產生的binlog event。主要是 TABLE_MAP_EVENT 和 UPDATE_ROWS_EVENT ...
  • 本文主要介紹 Windows 環境下搭建 PostgreSQL 的主從邏輯複製,關於 PostgreSQl 的相關運維文章,網路上大多都是 Linux 環境下的操作,鮮有在 Windows 環境下配置的教程,所以本文采用 Windows 環境作為演示系統來進行 PostgreSQL 高可用資料庫服務 ...
  • 1 引言 之前介紹了Redis的數據存儲及String類型的實現,接下來再來看下List、Hash、Set及Sorted Set的數據結構的實現。 2 List List類型通常被用作非同步消息隊列、文章列表查詢等;存儲有序可重覆數據或做為簡單的消息推送機制時,可以使用Redis的List類型。對於這 ...
  • 很多同學都覺得公有雲、私有雲、混合雲這些概念的認識比較混亂,開始我面對網上很多專業的解釋不明所以,直到我遇到這個說法: 大白話解釋一下 你娶了一個老婆,這叫傳統IT架構。 你覺得一個老婆不夠,這叫傳統企業CIO的困境。 你又娶了一個老婆,這叫雙活數據中心。 你在外地又娶了一個小老婆,這叫兩地三中心容 ...
  • 在日常開發中JSON的序列化與反序列化是一個常見的操作;而Dart語言不支持反射,運行時反射會影響Dart的tree shaking(搖樹優化),tree shaking可以“抖掉”不需要使用的代碼,顯著優化 App 的體積,所以Flutter中沒有類似Gson這樣的Json庫,處理方法相比Kotl ...
  • 文本識別技術(OCR)可以識別收據、名片、文檔照片等含文字的圖片,將其中的文本信息提取出來,代替了人工信息錄入與檢測等操作,降低了輸入成本,快速、方便,提升產品的易用性。 隨著技術的發展,OCR已經深入生活的諸多方面。交通場景下,主要用於車牌識別,便於停車場管理、智能交通、移動警務等;生活場景下,主 ...
  • 一、術語 路由(route): 在 Flutter 中,屏 (screen) 和 頁面 (page) 都叫做 路由 (route)。 在 Android 開發中,Activity 相當於“路由”,在 iOS 開發中,ViewController 相當於“路由”。在 Flutter 中,“路由”也是一 ...
  • 非同步模式Asynchronous 不會等待這個任務結束才開始執行下一個任務,開啟之後立即執行下一個任務,後續邏輯一般會通過回調函數的方式定義,非同步模式對js 非常重要,沒有非同步任務單線程的 js 語言就無法同時處理大量耗時任務,單線程下麵的非同步最大的難點就是 代碼的執行順序混亂,Queue是消息隊列 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...