Vue.js——組件基礎

目錄

選項式API和組合式API

選項式API

組合式API

語法糖

選項式API和組合式API的關系

生命周期函數

組合式API的生命周期函數

選項式API的生命周期函數

組件的注冊和引用

注冊組件

全局注冊

局部注冊

引用組件

解決組件之間的樣式沖突

scoped屬性

深度選擇器

父組件向子組件傳遞數據

聲明props

靜態綁定props

動態綁定props

字符串類型數據

數字類型數據

布爾值類型數據

數組類型數據

對象類型數據

props 單項數據流

驗證props

基礎類型檢查

必填項的校驗

屬性默認值

自定義驗證函數

子組件向父組件傳遞數據

在子組件中聲明自定義事件

在子組件中觸發自定義事件

在父組件中監聽自定義事件

跨級組件之間的數據傳遞

provide()

inject()函數

動態組件

定義動態組件

利用KeepAlive組件實現組件緩存

組件緩存相關的生命周期函數

KeepAlive組件的常用屬性

插槽

定義插槽

使用插槽

具名插槽

作用域插槽

定義數據

接收數據

自定義指令

引用靜態資源

引用public目錄中的靜態資源

引用src\assets目錄中的靜態資源


選項式API和組合式API

選項式API

選項式API是一種通過包含多個選項的對象來描述組件邏輯的API,其常用的選項包括data、method、computed、watch等。

export default {// 數據選項data() {return {//定義數據}},// 計算屬性computed: {},// 方法methods: {},// 生命周期鉤子created() {},mounted() {},// 偵聽器watch: {}
}

組合式API

組合式API是將組件中的數據、方法、計算屬性、偵聽器等代碼全部組合在一起,寫在setup函數中。

<script>
import { computed, watch } from 'vue'export default {setup() {const 數據名 = 數據值 // 這里應該是定義一個響應式數據,原代碼不完整,假設為某個響應式數據const 方法名 = () => {} // 這里應該是定義一個方法const 計算屬性名 = computed(() => {}) // 定義計算屬性watch(偵聽器的來源, 回調函數, 可選參數) // 定義偵聽器,原代碼中參數未具體化return { 數據名, 方法名, 計算屬性名 }}
}
</script>

語法糖

用于簡化組合式API的代碼。

<script setup>
import { computed, watch } from 'vue'// 定義數據(這里假設使用 ref 或 reactive 來定義響應式數據,原代碼未具體化,以下以 ref 為例)
import { ref } from 'vue';
const 數據名 = ref(數據值); // 實際使用時需將“數據值”替換為具體的初始值// 定義方法
const 方法名 = () => {// 方法的具體邏輯
};// 定義計算屬性
const 計算屬性名 = computed(() => {// 計算屬性的具體邏輯,返回計算后的值
});// 定義偵聽器
watch(() => 偵聽器的來源, // 這里需要明確偵聽的具體響應式數據或計算屬性等(newValue, oldValue) => {// 回調函數,當偵聽的來源發生變化時執行// 可以使用 newValue 和 oldValue 進行相應操作},{// 可選參數,例如 deep、immediate 等}
);
</script>

選項式API和組合式API的關系

選項式API和組合式API是同一底層系統提供的兩套不同的接口。

選項式API是在組合式API的基礎上實現的。

如果使用選項式API,整個項目邏輯不易閱讀和理解,而且查找對應功能的代碼會存在一定難度。

如果使用組合式API,可以將項目的每個功能的數據、方法放到一起,這樣不管項目的大小,都可以快速定位到功能區域的相關代碼,便于閱讀和維護。同時,組合式API可以通過函數來實現高效的邏輯復用,這種形式更加自由,需要開發者有較強的代碼組織能力和拆分邏輯能力。

生命周期函數

在Vue中,組件的生命周期是指每個組件從被創建到被銷毀的整個過程,每個組件都有生命周期。如果想要在某個特定的時期進行特定的處理,可以通過生命周期函數來完成。隨著組件生命周期的變化,生命周期函數會自動執行。

組合式API的生命周期函數

函數說明
onBeforeMount()組件掛載前
onMounted()

組件掛載成功后

onBeforeUpdate()

組件更新前

onUpdated()組件中的任意DOM元素更新后
onBeforeUnmount()組件實例被銷毀前
onUnmounted()組價實例被銷毀后

<script setup>
import { ref, onBeforeMount, reactive } from 'vue'
const loading=ref(true)
const items = reactive([])
onBeforeMount(async ()=>{try{const res = await fetch('/data/data.json')if(res.ok){const data = await res.json();data.forEach(item => {items.push(item)});}else{console.log('數據獲取錯誤',res.status)}}catch(err){console.log("數據獲取錯誤",err)}finally{loading.value=false}}
)
</script>

選項式API的生命周期函數

函數說明
beforeCreate()實例對象創建前
created()實例對象創建后
beforeMount()頁面掛載前
mounted()頁面掛載成功后
beforeUpdate()組價更新前
updated()組件中任意的DOM元素更新后
beforeDestory()組件實例銷毀前
destroyed()組件實例銷毀后

組件的注冊和引用

當在Vue項目中定義了一個新的組件后,要想在其他組件中引用這個新的組件,需要對新的組件進行注冊。在注冊組件的時候,需要給組件取一個名字,從而區分每個組件,可以采用帕斯卡命名法為組件命名。

Vue提供了兩種注冊組件的方式,分別是全局注冊和局部注冊。

注冊組件

全局注冊

在實際開發中,如果某個組件的使用頻率很高,許多組件中都會引用該組件,則推薦將該組件全局注冊。被全局注冊的組件可以在當前Vue項目的任何一個組件內引用。

import { createApp } from 'vue';
import './style.css';
import App from './App.vue';
import MyComponent from './components/MyComponent.vue';const app = createApp(App);
app.component('MyComponent', MyComponent);
app.mount('#app');

component()支持鏈式調用,可以連續注冊多個組件。

局部注冊

在實際開發中,如果某些組織只在特定的情況下被用到,推薦進行局部注冊。局部注冊即在某個組件中注冊,被注冊的主鍵只能在當前注冊范圍內使用。

<script>
import ComponentA from './ComponentA.vue'
export default {components: { ComponentA }
}
</script>

在使用setup語法糖時,導入的組件會被自動注冊,無須手動注冊,導入后可以直接在模版中使用。

<script setup>
import ComponentA from './ComponentA.vue'
</script>

引用組件

將組件注冊完成后,若要將組件在頁面中渲染出倆,需要引用組件。

在組件的<template>標簽中可以引用其他組件,被引用的組件需要寫成標簽的形式,標簽名應與組件名對應。組件的標簽名可以使用短橫線分隔或帕斯卡命名法命名。

例如,<my-component>標簽和<MyComponent>標簽都表示引用MyComponent組件。一個組件可以被引用多次,但不可出現自我引用和互相引用的情況,否則會出現死循環。

解決組件之間的樣式沖突

在Vue中可以使用scoped屬性和深度選擇器來解決組件之間樣式的沖突。

scoped屬性

<style>標簽添加scoped屬性后,Vue會自動為當前組件的DOM元素添加一個唯一的自定義屬性,并在樣式中為選擇器添加自定義屬性,從而限制樣式的作用范圍,防止組件之間的樣式沖突問題。

深度選擇器

如果在添加了scoped屬性后還需要讓某些樣式對子組件生效,則可以使用深度選擇器來實現。

深度選擇器通過:deep()偽類來實現,在其小括號中可以定義用于子組件的選擇器。

父組件向子組件傳遞數據

聲明props

在不使用setup語法糖的情況下,可以使用props選項聲明props。

props選項的形式可以是對象或字符串數組。

<script>
export default {props: {message: String,isVisible: Boolean}
}
</script>

如果不需要限制props的類型,可以聲明字符串數組形式的props。

<script>
export default {props: [message,isVisible]
}
</script>

使用setup語法糖時,可使用defineProps()函數聲明props。

<script setup>
const props = defineProps({title: String,count: Number
})
</script>
<script setup>
const props = defineProps(['title', 'count'])
</script>

在組件中聲明了props后,可以直接在模版中輸出每個prop的值。

靜態綁定props

當在父組件中引用了子組件后,如果子組件中聲明了props,則可以在父組件中向子組件傳遞數據。如果傳遞的數據是固定不變的,則可以通過靜態綁定props的方式為子組件傳遞數據。

通過靜態綁定props的方式為子組件傳遞數據。

<子組件標簽名 自定義屬性A=“數據” 自定義屬性B=“數據” />

父組件向子組件的props傳遞了靜態的數據,屬性值默認為字符串類型。

動態綁定props

在父組件中使用v-bind可以為子組件動態綁定props,任意類型的值都可以傳給子組件的props,包括字符串、數字、布爾值、數組、對象等。

字符串類型數據
<template><Child :init="username" />
</template><script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const username = ref('小圓')
</script>
<template></template><script setup>
const props = defineProps(['init'])
console.log(props)
</script>

數字類型數據
<template><Child :init="12" /><Child :init="age" />
</template><script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const age = ref(12)
</script>

布爾值類型數據
<template><Child init /><Child :init="false" /><Child :init="isFlag" />
</template><script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const isFlag = ref(true)
</script>

數組類型數據
<template><Child :init="['唱歌', '跳舞', '滑冰']" /><Child :init="hobby" />
</template><script setup>
import Child from './Child.vue'
import { ref } from 'vue'
const hobby = ref(['唱歌', '跳舞', '滑冰'])
</script>

對象類型數據
<template><Child :init="{ height: '180厘米', weight: '70千克' }" /><Child :height="bodyInfo.height" :weight="bodyInfo.weight" /><Child v-bind="bodyInfo" />
</template>
<script setup>
import Child from './Child.vue'
import { reactive } from 'vue'
const bodyInfo = reactive({height: '180厘米',weight: '70千克'
})
</script>

props 單項數據流

在Vue中,所有的props都遵循單向數據流原則,props數據因父組件的更新而變化,變化后的數據將向下流往子組件,而且不會逆向傳遞,這樣可以防止因子組件意外變更props導致數據流向難以理解的問題。

每次父組件綁定的props發生變更時,子組件中的props都將會刷新為最新的值。

驗證props

使用字符串數組形式的props的缺點是無法為每個prop指定具體的數據類型,而使用對象形式的props的優點是可以對每個prop進行數據類型的校驗。

對象形式的props可以使用多種驗證方案,包括基礎類型檢查、必填項的校驗、屬性默認值、自定義驗證函數等。在聲明props時,可以添加驗證方案。

基礎類型檢查

在開發中,有時需要對從父組件中傳遞過來的props數據進行基礎類型檢查,這時可以通過type屬性檢查合法的類型,如果從父組件中傳遞過來的值不符合此類型,則會報錯。

常見的類型有String(字符串)、Number(數字)、Boolean(布爾值)、Array(數組)、Object(對象)、Date(日期)、Function(函數)、Symbol(符號)以及任何自定義構造函數。

const props = {// 自定義屬性A,類型為字符串自定義屬性A: String, // 自定義屬性B,類型為數字自定義屬性B: Number, // 自定義屬性C,類型為布爾值自定義屬性C: Boolean, // 自定義屬性D,類型為數組自定義屬性D: Array, // 自定義屬性E,類型為對象自定義屬性E: Object, // 自定義屬性F,類型為日期自定義屬性F: Date, // 自定義屬性G,類型為函數自定義屬性G: Function, // 自定義屬性H,類型為符號自定義屬性H: Symbol 
};
必填項的校驗

父組件向子組件傳遞props數據時,有可能傳遞的數據為空,但是在子組件中要求該數據是必須傳遞的。此時,可以在聲明props時通過required屬性設置必填項,強調組件的使用者必須傳遞屬性的值。

props: {自定義屬性: { required: true },
}
屬性默認值

在聲明props時,可以通過default屬性定義屬性默認值,當父組件沒有向子組件的屬性傳遞數據時,屬性將會使用默認值

props: {自定義屬性: { default: 0 },
}
自定義驗證函數

如果需要對從父組件中傳入的數據進行驗證,可以通過?validator()?函數來實現。validator()?函數可以將?prop?的值作為唯一參數傳入自定義驗證函數,如果驗證失敗,則會在控制臺中發出警告。

props: {自定義屬性: {validator(value) {return ['success', 'warning', 'danger'].indexOf(value)!== -1;},},
}

子組件向父組件傳遞數據

在子組件中聲明自定義事件

若想使用自定義事件,首先需要在子組件中聲明自定義事件。

在不使用 setup 語法糖時,可以通過 emits 選項聲明自定義事件。

<script>
export default {emits: ['demo']
}
</script>

在使用 setup 語法糖時,需要通過調用 defineEmits() 函數聲明自定義事件。

<script setup>
const emit = defineEmits(['demo'])
</script>

在子組件中觸發自定義事件

在子組件中聲明自定義事件后,接著需要在子組件中觸發自定義事件。

當使用場景簡單時,可以使用內聯事件處理器,通過調用?$emit()?方法觸發自定義事件,將數據傳遞給使用的組件。

<button @click="$emit('demo', 1)">按鈕</button>

$emit()?方法的第 1 個參數為字符串類型的自定義事件的名稱,第 2 個參數為需要傳遞的數據,當觸發當前組件的事件時,該數據會傳遞給父組件。

除了使用內聯方式外,還可以直接定義方法來觸發自定義事件。

在不使用 setup 語法糖時,可以從?setup()?函數的第 2 個參數(即 setup 上下文對象)來訪問到?emit()?方法。

export default {setup(props, ctx) {const update = () => {ctx.emit('demo', 2)}return { update }}
}

如果使用setup語法糖,可以調用emit()函數來實現。

<script setup>
const update = () => {emit('demo', 2)
}
</script>

在父組件中監聽自定義事件

在父組件中通過?v-on?可以監聽子組件中拋出的事件。

<子組件名 @demo="fun" />

當觸發?demo?事件時,會接收到從子組件中傳遞的參數,同時會執行?fun()?方法。父組件可以通過?value?屬性接收從子組件中傳遞來的參數。

const fun = value => {console.log(value)
}

跨級組件之間的數據傳遞

Vue提供了跨級組件之間數據傳遞的方式——依賴注入。一個父組件相對于其所有的后代組件而言,可作為依賴提供者。而任何后代的組件樹,無論層級多深,都可以注入由父組件提供的依賴。

對于父組件而言,如果要為后代組件提供數據,需要使用provide()函數。對于子組件而言,如果想要注入上層組件或整個應用提供的數據,需要使用inject()函數。

provide()

provide()函數可以提供一個值,用于被后代組件注入。

provide(注入名, 注入值)

provide()函數可以接收2個參數,第1個參數是注入名,后代組件會通過注入名查找所需的注入值;第2個參數是注入值,值可以是任意類型,包括響應式數據。

在不使用 setup 語法糖的情況下,provide()函數必須在組件的 setup()函數中調用。

<script>
import { ref, provide } from 'vue'
export default {setup() {const count = ref(1)provide( 'message', count )}
}
</script>

當使用 setup 語法糖時,使用 provide()函數。

<script setup>
import { provide } from 'vue'
provide('message', 'Hello Vue.js')
</script>

provide()函數除了可以在某個組件中提供依賴外,還可以全局提供依賴。

const app = createApp(App)
app.provide('message', 'Hello Vue.js')

inject()函數

inject()函數可以注入上層組件或者整個應用提供的數據。inject()函數的語法格式。

inject(注入值,默認值,布爾值)

第1個參數是注入值,Vue會遍歷父組件,通過匹配注入的值來確定所提供的值,如果父組件鏈上多個組件為同一個數據提供了值,那么距離更近的組件將會覆蓋更遠的組件所提供的值。

第2個參數是可選的,用于在沒有匹配到注入的值時使用默認值。第2個參數可以是工廠函數,用于返回某些創建起來比較復雜的值。如果提供的默認值是函數,還需要將false作為第3個參數傳入,表明這個函數就是默認值,而不是工廠函數。

第3個參數是可選的,類型為布爾值,當參數值為false時,表示默認值是函數;當參數值為true時,表示默認值為工廠函數;當省略參數值時,表示默認值為其他類型的數據,不是函數或工廠函數。

動態組件

定義動態組件

利用動態組件可以動態切換頁面中顯示的組件。

<component is="要渲染的組價"></component>

標簽必須配合is屬性一起使用,is屬性的屬性值表示要渲染的組件,當該屬性值發生變化時,頁面中渲染的組件也會發生變化。

is屬性的屬性值可以是字符串或組件,當屬性值為組件時,如果要實現組件的切換,需要調用shallowRef()函數定義響應式數據,將組件保存為響應式數據。shallowRef()函數只處理對象最外層屬性的響應,它比ref()函數更適合于將組件保存為響應式數據。

利用KeepAlive組件實現組件緩存

組件緩存可以使組件創建一次后,不會被銷毀。在Vue中可以通過KeepAlive組件來實現組件緩存。

KeepAlive組件可通過標簽來定義,定義時使用標簽包裹需要被緩存的組件。

<KeepAlive>被緩存的組件
</KeepAlive>

組件緩存相關的生命周期函數

當組件被激活時,會觸發組件的onActivated()生命周期函數;當組件被緩存時,會觸發組件的onDeactivated()生命周期函數。

// onActivated()生命周期函數
onActivated(() => { })
// onDeactivated()生命周期函數
onDeactivated(() => { })

KeepAlive組件的常用屬性

在默認情況下,所有被標簽包裹的組件都會被緩存。如果想要實現特定組件被緩存或者特定組件不被緩存的效果,可以通過KeepAlive組件的常用屬性include、exclude屬性來實現。

屬性類型說明
include字符串或正則表達式只有名稱匹配的組件會被緩存
exclude字符串或正則表達式名稱匹配的組件不會被緩存
max數字最多可以緩存組件實例個數

在標簽中使用include屬性和exclude屬性時,多個組件名之間使用英文逗號分隔。

<KeepAlive include="組件名1, 組件名2">被緩存的組件
</KeepAlive>

注意:

在使用KeepAlive組件對名稱匹配的組件進行緩存時,它會根據組件的name選項進行匹配。如果沒有使用setup語法糖,必須手動聲明name選項;如果使用了setup語法糖,Vue會根據文件名自動生成name選項,無須手動聲明name選項。例如,在MyLeft.vue文件中使用setup語法糖時,自動生成的組件名為MyLeft。

插槽

Vue為組件的封裝者提供了插槽(slot),插槽是指開發者在封裝組件時不確定的、希望由組件的使用者指定的部分。也就是說,插槽是組件封裝期間為組件的使用者預留的占位符,允許組件的使用者在組件內展示特定的內容。通過插槽,可以使組件更靈活、更具有可復用性。

定義插槽

在封裝組件時,可以通過標簽定義插槽,從而在組件中預留占位符。假設項目中有一個MyButton組件。

<template><button><slot></slot></button>
</template>

在標簽內可以添加一些內容作為插槽的默認內容。如果組件的使用者沒有為插槽提供任何內容,則默認內容生效;如果組件的使用者為插槽提供了插槽內容,則該插槽內容會取代默認內容。

另外,如果一個組件沒有預留任何插槽,則組件的使用者提供的任何插槽內容都會不起作用。

使用插槽

使用插槽即在父組件中使用子組件的插槽,在使用時需要將子組件寫成雙標簽的形式,在雙標簽內提供插槽內容。

<template><MyButton>按鈕</MyButton>
</template>

因為插槽內容是在父組件模板中定義的,所以在插槽內容中可以訪問到父組件的數據。插槽內容可以是任意合法的模板內容,不局限于文本。

<MyButton><span style="color: yellow;">按鈕</span><MyLeft />
</MyButton>

具名插槽

在Vue中當需要定義多個插槽時,可以通過具名插槽來區分不同的插槽。具名插槽是給每一個插槽定義一個名稱,這樣就可以在對應名稱的插槽中提供對應的數據了。

插槽通過標簽來定義,標簽有一個name屬性,用于給各個插槽分配唯一的名稱,以確定每一處要渲染的內容。添加name屬性的標簽可用來定義具名插槽。

<slot name="插槽名稱"></slot>

在父組件中,如果要把內容填充到指定名稱的插槽中,可以通過一個包含v-slot指令的<template>來實現。

<組件名><template v-slot:插槽名稱></template>
</組件名>

與v-on和v-bind類似,v-slot也有簡寫形式,即吧v-slot替換為#。

作用域插槽

一般情況下,在父組件中不能使用子組件中定義的數據。如果想要在父組件中使用子組件中定義的數據,則需要通過作用域插槽來實現。

作用域插槽是帶有數據的插槽,子組件提供一部分數據給插槽,父組件接收子組件的數據進行頁面渲染。

定義數據

在封裝組件的過程中,可以為預留的插槽定義數據,供父組件接收并使用子組件中的數據。在作用域插槽中,可以將數據以類似傳遞props屬性的形式添加到標簽上。

<slot message="Hello Vue.js"></slot>

接收數據

使用默認插槽和具名插槽接收數據的方式不同,接下來分別進行講解。

在Vue中,每個插槽都有name屬性,表示插槽的名稱。在定義插槽時雖然省略了標簽的name屬性,但是name屬性默認為default,這樣的插槽屬于默認插槽。

在父組件中可以通過v-slot指令接收插槽中定義的數據,即接收作用域插槽對外提供的數據。通過v-slot指令接收到的數據可以在插槽內通過Mustache語法進行訪問。

<MyHeader v-slot="scope"><p>{{ scope.message }}</p>
</MyHeader>

通過v-slot接收從作用域插槽中傳遞的數據,scope為形參,表示從作用域插槽中接收的數據,該形參的名稱可以自定義。

作用域插槽對外提供的數據對象可以使用解構賦值以簡化數據的接收過程。

<MyHeader v-slot="{ message }"><p>{{ message }}</p>
</MyHeader>

通過解構賦值解構對象,解構后子組件中定義的數據可以直接訪問,而不是以“形參.屬性”的方式訪問。

自定義指令

Vue中的自定義指令分為兩類,分別是私有自定義指令和全局自定義指令。

  • 私有自定義指令是指在組件內部定義的指令。私有自定義指令可以在定義該指令的組件內部使用。例如,在組件A中自定義了指令,只能在組件A中使用,組件B、組件C中不能使用。

  • 全局自定義指令是指在全局定義的指令。全局自定義指令可以在全局使用,例如,在src\main.js文件中定義了全局自定義指令,這個指令可以用于任何一個組件。

一個自定義指令由一個包含自定義指令生命周期函數的參數來定義。

函數名說明
created()在綁定元素的屬性前調用
beforeMount()在綁定元素被掛載前調用
mounted()在綁定元素的父組件及自身的所有子節點都掛載完成后調用
beforeUpdate()在綁定元素的父組件更新前調用
updated()在綁定元素的父組件及自身的所有子節點都更新后調用
beforeUnmount()在綁定元素的父組件卸載前調用
unmounted()在綁定元素的父組件卸載后調用
el指令所綁定的元素,可以直接用于操作DOM元素
binding一個對象,包含很多屬性,用于接收屬性的參數值
vnode代表綁定元素底層的虛擬節點
prevNode之前頁面渲染中指令所綁定元素的虛擬節點

binding中包含以下6個常用屬性。

  • value:傳遞給指令的值。
  • arg:傳遞給指令的參數。
  • oldValue:之前的值,僅在beforeUpdate()函數和updated()函數中可用,無論值是否更改都可用。
  • modifiers:一個包含修飾符的對象 (如果有)。例如,在v-my-directive.foo.bar 中,修飾符對象是{ foo: true, bar: true }。
  • instance:使用該指令的組件實例。
  • dir:指令的定義對象。

如果沒有使用setup語法糖,可以在directives屬性中聲明私有自定義指令。

export default {directives: {color: {}}
}

在使用自定義指令時,需要以“v-”開頭。

<h1 v-color>標題</h1>

如果使用setup語法糖,任何以“v”開頭的駝峰式命名的變量都可以被用作一個自定義指令。

<template><span v-color></span>
</template><script setup>
const vColor = {}
</script>

全局自定義指令需要通過Vue應用實例的directive()方法進行聲明。

directive('自定義指令名稱', 對象)

directive()方法的第1個參數類型為字符串,表示全局自定義指令的名稱;第2個參數類型為對象或者函數,可以是對象或者函數形式,用于接收指令的參數值。

在使用自定義指令時,開發人員可以通過自定義指令的參數改變元素的狀態,傳遞的參數由自定義指令的生命周期函數的第2個參數接收。

在標簽中使用自定義指令時,通過等號(=)的方式可以為當前指令綁定參數.

<h1 v-color="color"></h1>

如果指令需要多個值,可以傳遞一個對象。

<div v-demo="{ color: 'red', text: 'hello' }"></div>

對于自定義指令來說,通常僅需要在mounted()函數和updated()函數中操作DOM元素,除此之外,不需要其他的生命周期函數。

將私有自定義指令簡寫為函數形式。

const vFontSize = (el, binding) => {el.style.fontSize = binding.value
}

將全局自定義指令簡寫成函數形式。

app.directive('fontSize', (el, binding) => {el.style.fontSize = binding.value
})

引用靜態資源

組件中,有時需要引用一些靜態資源,例如圖片資源、CSS代碼資源等。通過項目的public目錄和src\assets目錄都可以存放靜態資源,但引用靜態資源的方式不同。

引用public目錄中的靜態資源

public目錄用于存放不可編譯的靜態資源文件,該目錄下的文件會被復制到打包目錄,該目錄下的文件需要使用絕對路徑訪問。

<img src="/demo.png" >

引用src\assets目錄中的靜態資源

src\assets目錄用于存放可編譯的靜態資源文件,例如圖片、樣式文件等。該目錄下的文件需要使用相對路徑訪問。

在引用src\assets目錄中的圖片時,首先將圖片保存到本地,然后使用import語法將圖片導入需要的組件,最后通過img元素的src屬性添加圖片的路徑。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87369.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Yii2 安裝-yii2-imagine

#composer 安裝-如已安裝跳過 php -r "copy(https://install.phpcomposer.com/installer, composer-setup.php);" php composer-setup.php sudo mv composer.phar /usr/local/bin/composer#執行安裝 composer require --prefer-dist yiisoft/yii2-imagine#報錯 Updat…

C#程序設計簡介

一、發展歷史 C#的主要作者是丹麥計算機科學家安德斯海爾斯伯格&#xff08;Anders Hejlsberg&#xff09;&#xff0c;他是該語言的首席設計師&#xff0c;同時也是Turbo Pascal&#xff08;Pascal 語言編譯器&#xff09;、Delphi&#xff08;由 Borland&#xff08;后被 Em…

JavaWeb筆記03

七、Maven1_概述Maven 是專門用于管理和構建 Java 項目的工具&#xff0c;它的主要功能有: 提供了一套標準化的項目結構 提供了一套標準化的構建流程&#xff08;編譯&#xff0c;測試&#xff0c;打包&#xff0c;發布……&#xff09; 提供了一套依賴管理機制1.標準化的項目結…

AIGC自我介紹筆記

AIGC&#xff08;人工智能生成內容&#xff09;項目是指利用人工智能技術&#xff08;如深度學習、生成對抗網絡、大規模預訓練模型等&#xff09;自動生成文本、圖像、音頻、視頻等多模態內容的系統性工程。這類項目通過算法模型學習海量數據&#xff0c;實現內容的自動化、個…

從docker-compose快速入門Docker

不得不提容器化技術是未來的一個發展方向&#xff0c;它徹底釋放了計算虛擬化的威力&#xff0c;極大提高了應用的運行效率&#xff0c;降低了云計算資源供應的成本&#xff01;使用 Docker&#xff0c;可以讓應用的部署、測試和分發都變得前所未有的高效和輕松&#xff01;無論…

【BERT_Pretrain】Wikipedia_Bookcorpus數據預處理(二)

上一篇介紹了wikipedia和bookcopus數據集&#xff0c;這一篇主要講一下如何預處理數據&#xff0c;使其可以用于BERT的Pretrain任務MLM和NSP。 MLM是類似于完形填空的任務&#xff0c;NSP是判斷兩個句子是否連著。因此數據預處理的方式不同。首先&#xff0c;拿到原始數據集&a…

人工智能-基礎篇-14-知識庫和知識圖譜介紹(知識庫是基石、知識圖譜是增強語義理解的知識庫、結構化數據和非結構化數據區分)

在人工智能&#xff08;AI&#xff09;領域&#xff0c;知識圖譜&#xff08;Knowledge Graph&#xff09;和知識庫&#xff08;Knowledge Base&#xff09;是兩種重要的知識表示和管理技術&#xff0c;它們的核心目標是通過結構化的方式組織信息&#xff0c;從而支持智能系統的…

7月1日作業

思維導圖 一、將當前的時間寫入到time.txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次執行支持斷點續寫 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次執行程序 4.2022-04-26 20:00:00 5.2022-04-26 20:0…

DHCP中繼及動態分配

DHCP中繼 在多 VLAN 網絡中為什么不能直接用 DHCP&#xff1f; 比如你現在的網絡是&#xff1a;PC 在 VLAN10、VLAN20 中DHCP服務器&#xff08;Router0&#xff09;在另一個網段&#xff08;比如 192.168.100.0/24&#xff09;PC 的 DHCP Discover 是廣播&#xff0c;無法跨越…

ROS 概述與環境搭建

1. ROS 簡介 1.1 ROS 誕生背景 機器人是一種高度復雜的系統性實現&#xff0c;機器人設計包含了機械加工、機械結構設計、硬件設計、嵌入式軟件設計、上層軟件設計....是各種硬件與軟件集成&#xff0c;甚至可以說機器人系統是當今工業體系的集大成者。 機器人體系是相當龐大的…

mac python3.13 selenium安裝使用

一、安裝 # 進入虛擬環境 workon xxxx pip install selenium二、安裝驅動 查詢自己瀏覽器版本 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --versionGoogle Chrome 138.0.7204.93下載對應的驅動&#xff0c;其他版本 sudo mv ~/Downloads/chromedr…

AI 開發平臺:中小企業的創新破局點在哪里?

在浙江義烏的一個小商品加工廠里&#xff0c;老板王建國最近有點煩。訂單量忽高忽低&#xff0c;原材料價格波動不定&#xff0c;他想通過數據分析提前規劃生產&#xff0c;卻苦于沒有專業的技術團隊&#xff1b;在廣東東莞的一家電子配件公司&#xff0c;業務員李娜每天要處理…

.NET 8.0 Redis 教程

一、環境準備 1. 安裝 Redis 服務器 Windows/macOS/Linux&#xff1a;使用 Docker 快速部署 bash docker run -d --name redis -p 6379:6379 redisLinux&#xff1a;直接安裝 bash sudo apt-get install redis-server sudo systemctl start redis-server2. 創建 .NET 項目 b…

2025年游戲鼠標推薦,游戲鼠標推薦,打CSGO(羅技、雷蛇、卓威、ROG、漫步者、賽睿、達爾優)

可能很多人對于游戲鼠標的了解還是不夠深&#xff0c;會有很多疑問&#xff0c;比如&#xff1a;“游戲鼠標和辦公鼠標的區別”、“游戲鼠標無線好還是有線好”等等一系列的問題&#xff0c;本文將會介紹游戲鼠標領域處于領先地位的幾個廠家&#xff1a;羅技鼠標、雷蛇鼠標、賽…

OpenCV CUDA模塊設備層-----在 GPU上高效地執行兩個uint類型值的最小值比較函數vmin2()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的CUDA模塊&#xff08;cudev&#xff09; 中的一個設備端內聯函數&#xff0c;用于在GPU上高效地執行兩個uint類型值的最小值比較。 該函…

Web3與傳統網絡安全模型對比:關鍵差異解析

隨著互聯網技術的飛速發展&#xff0c;Web3的概念逐漸成為人們關注的焦點。Web3代表著一個更加去中心化、安全和用戶友好的網絡環境。與傳統的網絡安全模型相比&#xff0c;Web3在多個方面展現出了其獨特的優勢和特點。本文將深入探討Web3與傳統網絡安全模型之間的關鍵差異。 …

FLAN:微調語言模型是 Zero-Shot 學習者

摘要 本文探討了一種簡單的方法來提升語言模型的零樣本學習能力。我們展示了指令微調——即在通過指令描述的數據集集合上對語言模型進行微調——能夠顯著提升模型在未見任務上的零樣本表現。 我們以一個擁有1370億參數的預訓練語言模型為基礎&#xff0c;在60多個通過自然語…

springboot中的事件發布和監聽

事件定義 創建一個自定義事件類 UserLoginEvent&#xff0c;繼承 ApplicationEvent&#xff0c;用于攜帶用戶登錄信息&#xff1a; import org.springframework.context.ApplicationEvent;public class UserLoginEvent extends ApplicationEvent { //關鍵點1&#xff1a;ext…

“開源雙軌架構+40億參數擴散Transformer——ComfyUI-OmniGen2本地部署教程:重塑多模態生成的效率邊界!

一、簡介 OmniGen2 是由北京智源研究院最新推出的一個強大、高效的開源多模態生成模型。與 OmniGen v1 不同&#xff0c;OmniGen2 具有兩種不同的文本和圖像模態解碼路徑&#xff0c;利用非共享參數和解耦的圖像分詞器。OmniGen2 在四個主要功能方面具有競爭力的性能&#xff…

Java的SpringAI+Deepseek大模型實戰之會話記憶

文章目錄 背景項目環境實現步驟第一步、定義會話存儲方式方式一、定義記憶存儲ChatMemory方式二、注入記憶存儲ChatMemory 第二步、配置會話記憶方式一、老版本實現方式二、新版本實現 第三步、存儲會話信息 異常處理1、InMemoryChatMemory 無法解析 背景 前兩期【環境搭建】和…