萬字血書Vue-Vue進階

来源:https://www.cnblogs.com/gfhcg/archive/2023/03/17/17223249.html
-Advertisement-
Play Games

Vue進階 生命周期 組件運行的過程 組件的生命周期是:組件從創建->運行(渲染)->銷毀的整個過程,是一個時間段 如何監聽組件的不同時刻 vue框架為組件內置了不同時刻的生命周期函數,是他在關鍵時刻幫我們調用的一些特殊名稱的函數,生命周期函數會伴隨著組件的運行而自動調用。 created函數 組件 ...


Vue進階

生命周期

組件運行的過程

image

組件的生命周期是:組件從創建->運行(渲染)->銷毀的整個過程,是一個時間段

如何監聽組件的不同時刻

vue框架為組件內置了不同時刻的生命周期函數,是他在關鍵時刻幫我們調用的一些特殊名稱的函數,生命周期函數會伴隨著組件的運行而自動調用

  • created函數 組件在記憶體中被創建完畢
  • mounted函數 組件第一次被渲染到頁面上
  • unmounted函數 組件被銷毀完畢了(隱藏)
  • updated函數 當組件被重新渲染完畢後會自動調用

當組件被重新渲染完畢後,會自動調用updated生命周期函數

組件中全部的生命周期函數

image

問:為什麼不在beforeCreate中發ajax請求?

此階段無法訪問data,請求到的數據無法掛載到data中供組件渲染去使用

完整的生命周期函數

Vue2.x

Vue 實例生命周期

Vue3.x

組件生命周期圖示

組件化編程

模塊:向外提供特定功能的Js程式,一般是一個Js文件。

組件:實現應用中局部功能代碼資源的代碼集合。

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

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

單文件組件:一個文件中只有一個組件

vue單文件組件的構成

template 組件的模板結構(必須)

script 組件的js行為

style 組件的樣式

template節點

規定:每個組件對應的模板結構,都需要定義<template>節點中,是vue提供的容器標簽,<template>只起到包裹性質的作用,不會被渲染成真正的DOM元素。

<template>節點中支持指令語法

在vue2.x的版本中,DOM結構僅支持單個根節點

在vue3.x的版本中,DOM結構僅支持多個根節點

script節點

<script>
    export default{} //data數據和methods方法
</script>

name節點:為組件定義一個名稱

data節點:vue組件渲染期間需要用到的數據(data需指向一個函數,函數中再return對象)

methods節點:組件中的事件處理函數節點

style節點

style標簽上的lang=‘css’屬性是可選的,它表示所使用的樣式語言,預設css,還有less和scss語法

組件的基本使用

1、組件的命名

kebab-case命名法(短橫線命名法)、Camelcase命名法(大駝峰命名法)(後者可轉化為短橫線使用,只能在腳手架中使用)

也可以將name屬性作為註冊後組件的名稱,儘可能迴避HTML已有的元素名稱。

2、組件的註冊

組件之間可以相互的引用,但必須先註冊後使用

全局和局部註冊

被全局註冊的組件可以在全局如何一個組件內使用,被局部註冊只能在當前註冊範圍內使用

.component(’ 名稱‘,組件名)方法全局註冊

component:{鍵值對}局部註冊

使用頻率高的進行全局註冊,使用頻率低的局部註冊

3、組件之間的樣式衝突問題

父組件的樣式會影響子組件

根本原因:SPA中,所有組件的DOM結構,都基於唯一的index.html頁面進行呈現,每個組件的樣式都會影響到整個index.html頁面中的DOM元素

解決:

方法一:為每個組件分配唯一的自定義屬性,在編寫組件樣式時,通過屬性選擇器來控制樣式的作用域

<template>
    <div data-v-001>
      
        <h1 data-v-001> 這是App.vue組件</h1>

        <p data-v-001>這是App中的p標簽</p>
    </div>
</template>

<script>

</script>

<style lang="less">
p[data-v-001]{
    color: red;
}
</style>

方法二:vue為style節點提供了scoped屬性,從而防止組件之間的樣式衝突問題

但如果給當前組件的style的節點添加了scoped屬性,則當前組件的樣式對其子組件是不生效的,如果想生效,可以使用/deep/深度選擇器,vue3.x中推薦 :deep()

/deep/.title{  }  等價於 [data-v-xxx].title 等價於 :deep(title){ }

4、組件的props

封裝vue組件時的基本原則:

  • 組件的DOM結構、Style樣式儘量復用
  • 組件中要展示的數據,儘量由使用者提供

為了方便使用者為組件提供要展示的數據,vue提供了props的概念

什麼是組件的props?props是組件的自定義屬性,組件的使用者可以通過props把數據傳遞到子組件內部,供子組件內部使用

作用:父組件通過props向子組件傳遞要展示的數據

聲明:在封裝vue組件時,可以把動態的數據項聲明為props自定義屬性

(無法使用未聲明的props)

<template>
    <div data-v-001>
       

        <h1 data-v-001> 書名:{{title}}</h1>

        <p data-v-001>作者:{{author}}</p>
    </div>
</template>

<script>
export default{
    name:'MyArticle',
    props:['title','author']
}
</script>

動態綁定props的值:可以使用v-bind屬性綁定的形式,為組件動態綁定props的值

props的大小寫命名:如果使用camelCase聲明props屬性的名稱,則可以使用:駝峰/短橫線的形式為組件綁定屬性的值

5、Class和Style綁定

vue允許開發者通過v-bind屬性綁定指令,為元素動態綁定class屬性的值行內的style樣式,來動態操作元素樣式

  • 動態綁定HTML的class:可以通過三元表達式,動態的為元素綁定class的類名
<template>
    <div>
       
<h3 class="thin" :class="isItalic ? 'italic': ''">MyStyle組件</h3>

<button @click="isItalic=!isItalic">Toggle Italic</button>
    </div> 
</template>

<script>
export default{
    name:'MyArticle',
    data(){//防止一個組件被多次調用時,存在數據的引用關係
        return{
            isItalic:true,
        }
    }
}
</script>


<style lang="less">
.thin{
    font-weight: 200;
}
.italic{
    font-style: italic;
}
</style>
  • 數組語法綁定HTML的class

如果元素需要動態綁定多個class類名,可以使用數組的語法格式

<h3 class="thin" :class="[isItalic ? 'italic': '',isDelate ? 'delate': '']">MyStyle組件</h3>
  • 對象語法綁定HTML的class

採用數組語法會導致模板結構臃腫,故使用對象語法進行簡化

<h3 class="thin" :class="classObj">MyStyle組件</h3>

<script>
export default{
    name:'MyArticle',
    data(){
        return{
            isItalic:true,
            classObj:{
             isItalic:true, 
            }
        }
    }
}
</script>
  • 對象語法綁定內聯的style樣式
<template>
    <div data-v-001>
       
<div :style="{color:active,fontsize:fsize+'px','background-color':bgcolor}"></div>
//不寫成駝峰就得用單引號包括,表示是一個字元串的屬性
<button @click="isItalic=!isItalic">Toggle Italic</button>
    </div> 
    
</template>

<script>
export default{
    name:'MyArticle',
    data(){
        return{
            isItalic:true,
            active:'red',
            fsize:30,
            bgcolor:'pink',
        }
    }
}
</script>

VueComponent構造函數

  • 組件本質是一個名為VueComponent的構造函數,且不是程式員定義的,由Vue.extend生成的。
  • 調用組件時,Vue解析時會幫我們創建組件的實例對象,即幫我們執行:new VueComponent(options)
  • 註意:每次調用Vue.extend,返回的都是一個個全新的VueComponent

關於this指向:

組件配置中:

data函數、methods中的函數、watch中的函數、computed中的函數,this均是【VueComponent實例對象(vc)】

new Vue()配置中:

data函數、methods中的函數、watch中的函數、computed中的函數,this均是【Vue實例對象(vm)】

一個重要的內置關係:VueComponent.prototype.__proto__==Vue.prototype

讓組件實例對象可以訪問到Vue原型上的屬性、方法。
image

單頁面應用程式(SPA)

一個Web網站中只有唯一的一個HTML頁面(所有的功能與交互)

特點:僅在該web頁面初始化時載入相應的資源,不會因為用戶操作來進行頁面的重新載入或跳轉

有點:良好的交互體驗(不會出現白屏現象)

​ 良好的前後端工作分離模式(後端專註於提供API介面,前端專註於頁面的渲染)

​ 減輕伺服器的壓力(伺服器只提供數據,不負責頁面合成和邏輯處理)

缺點:首屏載入慢(解決:路由懶載入、代碼壓縮、CDN加速、網路傳輸壓縮)

​ 不利於SEO(引擎優化) (解決:SSR伺服器端渲染)

腳手架—快速創建SPA項目

1、基於vite創建SPA項目

2、基於vue-cli創建SPA項目

image

vite的基本使用

1、創建vite項目

npm init vite-app 項目名稱

cd 項目名稱
npm install
npm run dev

2、梳理項目的結構

image

image

3、vite項目的運行流程

在工程化項目中,vue要做的事情很單純,通過main.js把App.vue渲染到index.html的指定區域中

App.vue用來編寫待渲染的模板結構

index.html中需要預留一個el區域

main.js把App.vue渲染到index.html所預留的區域中

Vue-cli的基本使用

1、創建cli項目

npm i -g @vue/cli
vue create 項目名稱

cd 項目名稱
npm run serve

image

2、查看具體的webpack配置

vue inspect > output.js

組件通訊

組件之間的數據共用的6種方案

組件之間的關係

  • 父子關係
  • 兄弟關係
  • 後代關係

父子組件之間的數據共用

1、父->子共用數據

父組件通過v-bind屬性綁定向子組件共用數據。同時,子組件需要使用props接受數據

2、子->父共用數據

子組件通過自定義事件的方式向父組件共用數據,emit傳參

3、父<->子雙向數據同步

使用v-model指令維護組件內外數據的雙向同步

兄弟組件之間的數據共用

4、兄<->弟共用數據

共用方案:EventBus,可以藉助第三方包mitt來創建eventBus對象

image

  • 安裝mitt依賴包
npm install [email protected]
  • 創建公共的EventBus模塊
import mitt from 'mitt'
//創建Eventbus的實例對象
const bus=mitt()
//將Eventbus的是實例對象共用出去
export default bus
  • 數據接收方聲明自定義事件

調用bus.on('事件名稱',事件處理函數)方法註冊一個自定義事件

<script>
import bus from 'eventBus.js'

export default{
    data(){return { count 0}},
   created(){
   bus.on('',(count)=>{
   this.count=count
   })
   }
}
</script>
  • 數據發送方觸發事件

調用bus.emit('事件名稱',要發送的數據)方法觸發自定義事件

<script>
import bus from 'eventBus.js'

export default{
    data(){return { count 0}},
    methods:{
        add(){
            this.count++
            bus.on('',this.count)
                
        }
    }

}
</script>

後代組件之間的數據共用

5、父<->子孫共用數據

指的是父節點組件向其子孫組件共用數據。此時組件之間的嵌套關係比較複雜,可以使用provideinject實現後代關係組件之間的數據共用

  • 父組件通過provide共用數據
<script>

export default{
    data(){return { count 0}},
    provide(){
        return {
            color:this.color
        }
    }

}
</script>
  • 子孫組件通過inject接收數據
<script>

export default{
    data(){return { count 0}},
    inject:['color'],

}
</script>
  • 父節點對外共用響應式數據(provide非響應式)
<script>
import {computed} from 'vue'//從vue中導入computed函數
export default{
    data(){return {color:'red'}},
    provide(){
        return {
            //使用computed函數,可以把要共用的數據包裝為響應式數據
            color:computed(()=>this.color)
        }
    }

}
</script>
  • 子孫節點使用響應式數據

子孫節點必須使用.value的形式進行使用

6、Vuex全局數據共用

總結

image

ref引用

ref用來輔助開發者在不依賴jQuery的情況下獲取DOM元素或組件的引用

每個vue組件實例上,都包含一個$refs對象,裡面存儲這對應DOM元素或組件的引用,預設情況下,組件里的$refs指向一個空對象

使用ref引用DOM元素

<h1 ref="myh111"> nihao</h1>
<button @click="getRefs">
    獲取“$refs”引用
</button>

<script>
export default {
    name:'MyApp',
    methods:{
       getRefs(){
           this.$refs.myh111.style.color='red'
       }
   }
}
</script>

使用ref引用組件

<h1 ref="myh111"> nihao</h1>
<button @click="getRefs">
    獲取“$refs”引用
</button>

<my-counter ref="countRef"></my-counter>

<script>
export default {
    name:'MyApp',
   methods:{
       getRefs(){
         this.$refs.countRef.reset()//調用組件內的reset()方法
       }
   }
}
</script>

控制文本框的按鈕的按需切換(文本框自動獲得焦點.focus()方法)

組件是非同步執行DOM更新的

解決:this.$nextTick(cb) cb回調被延遲到DOM重新渲染完成之後執行,保證cd回調函數可以操作最新的DOM元素

<script>
export default {
    name:'MyApp',
   methods:{
       getRefs(){
        this.$nextTick(()=>{
          this.$refs.ipt.focus()
       })
       }
   }
}
</script>

mixin混入

components編寫mixin.js文件,可以把多個組件共用的配置提取成一個混入對象。

export const mixin={
	methods:{
		showNmae(){
			alert(this.name)
		}
	}
} 
//局部混入
<script>
import {hunhe} from '../mixin'
export default {
    name:'MyApp',
    data(){
        return {
            name:''
        }
    },
    mixin:[hunhe],
}
</script>

//全局混入
Vue.mixin(xxx)

動態組件

指的是動態切換組件的顯示與隱藏。vue提供了一個內置的,專門來實現組件的動態渲染

實現動態組件渲染

<component :is="組件名稱"></component>

使用keep-alive保持狀態(緩存)

隱藏組件時會將組件在記憶體中銷毀,不會保持最後的狀態,可以使用組價保持動態組件的狀態

<keep-alive>
<component :is="組件名稱"></component>
</keep-alive>

scoped樣式

為什麼會產生樣式類名衝突?

Vue解析組件時,會將所有的style合併,當類名相同時會以後引入的樣式為主。

使用scoped解決css樣式類名衝突問題,但App組件不適用。

插槽

什麼是插槽?

插槽(slot)是vue為組件封裝者提供的能力。允許開發者在封裝組件時,把不確定的,希望用戶指定的部分定義為插槽,(為用戶預留的內容的占位符)。

在封裝組件時,可以通過<slot></slot>元素定義插槽,從而為用戶預留內容占位符

沒有預留插槽的自定義內容會被丟棄(Vue不知道將該DOM渲染到何處)

<--header組件!-->
    <template>
    	<div>
            <slot></slot>
        </div>
    </template>
<--引用!-->
    <header>
    	<ul>
            <li></li>
            <li></li>
        </ul>
        <--將ul插入header組件!-->
    </header>

插槽的預設內容(後備內容)

可以為預留的<slot>插槽提供後備內容(預設內容),如果使用者沒有提供內容,則後備內容將會生效

具名插槽

上述定義的是預設插槽,如果在封裝組件時需要預留多個插槽節點,則需要為每個<slot>插槽指定具體的name名稱,這種帶有具體名稱的插槽叫做:具名插槽

<slot name=" "></slot>
<slot ></slot> //預設名:default
<--header組件!-->
    <template>
    	<div>
            <slot name="center"></slot>
            <slot name="footer"></slot>
        </div>
    </template>
<--引用!-->
    <header>
    	<ul slot="center">
            <li></li>
            <li></li>
        </ul>
        <a slot="footer"></a>
    </header>
        
<--另一種寫法!-->
    <header>
    	<ul slot="center">
            <li></li>
            <li></li>
        </ul>
        <template v-slot:header>  
            <h1>     
                滕王閣序  
            </h1> 
        </template>
    </header>
    
    <header>
    	<ul slot="center">
            <li></li>
            <li></li>
        </ul>
        <template #header>  
            <h1>     
                滕王閣序  
            </h1> 
        </template>
    </header>    
    

作用域插槽

在封裝組件的過程中,可以為預留的<slot>插槽綁定props數據,使得子組件可以向引用傳參(數據逆流),這種帶有props數據的<slot>叫做:作用域插槽。

<--header組件!-->
    <template>
    	<div>
            <slot :games="games"></slot>
        </div>
    </template>
    
......
    data(){
    	return{
    		games:['first','second','third']
    }
    }
    <header>
        <template scope="games">  
            <ul>
            	<li></li>
            	<li></li>
        	</ul>
            <h1>     
                滕王閣序  
            </h1> 
        </template>
    </header>

解構作用域插槽的prop

scope是一個對象,那麼能否直接使用對象的解構賦值呢?

    <header>
        <template scope="{games}">  
            <ul>
            	<li></li>
            	<li></li>
        	</ul>
            <h1>     
                滕王閣序  
            </h1> 
        </template>
    </header>

    <header>
        <template slot-scope="{games}">  
            <ul>
            	<li></li>
            	<li></li>
        	</ul>
            <h1>     
                滕王閣序  
            </h1> 
        </template>
    </header>

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

-Advertisement-
Play Games
更多相關文章
  • 報錯信息: 在進入系統時,不能正常進入系統,出現了Give root password for maintenance(or type Control-D to continue):的報錯。 報錯原因: 1、在之前寫入的/etc/fstab文件有問題,導致系統在讀取的時候識別不到從而報錯。 解決方法 ...
  • 什麼是消息隊列? 假設你是一個快遞員,你需要將貨物從一個倉庫運到另一個倉庫。但是你發現自己的時間不夠用,需要另外請一個人來幫忙。那麼,你們之間如何進行協作呢? 一種方式是直接將貨物全部交給對方,但這樣存在風險:對方可能會出現問題,導致貨物丟失或損壞。 而另一種更安全的方式是,你將貨物分批發送給對方, ...
  • MySql存儲結構 參考視頻:MySql存儲結構 1.表空間 不同的存儲引擎在磁碟文件上的結構均不一致,這裡以InnoDB為例: CREATE TABLE t(id int(11)) Engine = INNODB; 在新表創建的過程中,InnoDB會在磁碟的data目錄下創建與這個表對應的兩個文件 ...
  • 您可以使用以下 SQL 語句刪除 MS SQL Server 表中重覆的行: WITH CTE AS ( SELECT ROW_NUMBER() OVER(PARTITION BY column1, column2, ... columnN ORDER BY (SELECT 0)) RN FROM ...
  • 摘要:DWS的PL/pgSQL函數/存儲過程中有一個特殊的語法PERFORM語法,用於執行語句但是丟棄執行結果的場景,常用於一些狀態判斷的場景。 本文分享自華為雲社區《GassDB(DWS)功能 -- 函數出參 #【玩轉PB級數倉GaussDB(DWS)】》,作者:譡里個檔。 DWS的PL/pgSQ ...
  • 大資管包括原銀保監監管下的銀行理財、信托、保險,原證監會監管下的公募基金、私募基金專戶及基金子公司、券商資管以及期貨資管。據統計,2022年底資管行業的資產管理規模也達到了136萬億元。 在《商業銀行理財業務監督管理辦法》《關於規範金融機構資產管理業務的指導意見》等理財新規、資管新規的要求下,大資管 ...
  • 數據湖作為新一代大數據基礎設施,近年來持續火熱,許多前線的同學都在討論數據湖應該怎麼建,許多企業也都在構建或者計劃構建自己的數據湖。基於此,自然引發了許多關於數據湖選型的討論和探究。但是經過搜索之後我們發現,網上現存的很多內容都是基於較早之前的開源信息做出的結論,在企業調研初期容易造成不准確的印象和 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 組件介紹 關於web端的右鍵功能常用的地方有表格的右鍵,或者tab標簽的右鍵等,本文記錄一下封裝一個右鍵菜單組件的思路步驟代碼。 程式員除了會用輪子,還要嘗試去貼合自己公司業務場景造輪子。 組件效果圖 我們先看一下右鍵組件的效果圖 組件分 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...