這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助
1. provide/inject
provide/inject 是 Vue.js 中用于跨組件傳遞資料的一種高級技術,它可以將資料注入到一個組件中,然后讓它的所有子孫組件都可以訪問到這個資料,通常情況下,我們在父組件中使用 provide 來提供資料,然后在子孫組件中使用 inject 來注入這個資料,
使用 provide/inject 的好處是可以讓我們在父組件和子孫組件之間傳遞資料,而無需手動進行繁瑣的 props 傳遞,它可以讓代碼更加簡潔和易于維護,但需要注意的是,provide/inject 的資料是非回應式的,這是因為provide/inject是一種更加底層的 API,它是基于依賴注入的方式來傳遞資料,而不是通過回應式系統來實作資料的更新和同步,
具體來說,provide方法提供的資料會被注入到子組件中的inject屬性中,但是這些資料不會自動觸發子組件的重新渲染,如果provide提供的資料發生了變化,子組件不會自動感知到這些變化并更新,
如果需要在子組件中使用provide/inject提供的資料,并且希望這些資料能夠回應式地更新,可以考慮使用Vue的回應式資料來代替provide/inject,例如,可以將資料定義在父組件中,并通過props將其傳遞給子組件,子組件再通過$emit來向父組件發送資料更新的事件,從而實作回應式的資料更新,
下面是一個簡單的例子,展示了如何在父組件中提供資料,并在子孫組件中注入這個資料:
<!-- 父組件 -->
<template>
<div>
<ChildComponent />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
provide: {
message: 'Hello from ParentComponent',
},
components: {
ChildComponent,
},
};
</script>
//上面provide還可以寫成函式形式
export default {
provide(){
return {
message: this.message
}
}
}
<!-- 子組件 -->
<template>
<div>
<GrandchildComponent />
</div>
</template>
<script>
import GrandchildComponent from './GrandchildComponent.vue';
export default {
inject: ['message'],
components: {
GrandchildComponent,
},
};
</script>
<!-- 孫子組件 -->
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
inject: ['message'],
};
</script>
在上面的例子中,父組件中提供了一個名為 message 的資料,子孫組件中都可以使用 inject 來注入這個資料,并在模板中使用它,注意,子孫組件中的 inject 選項中使用了一個陣列,陣列中包含了需要注入的屬性名,在這個例子中,我們只注入了一個 message 屬性,所以陣列中只有一個元素,
2. 自定義v-model
要使自定義的Vue組件支持v-model,需要實作一個名為value的prop和一個名為input的事件,在組件內部,將value prop 系結到組件的內部狀態,然后在對內部狀態進行修改時觸發input事件,
下面是一個簡單的例子,展示如何創建一個自定義的輸入框組件并支持v-model:
<template>
<input :https://www.cnblogs.com/smileZAZ/archive/2023/05/06/value="value" @input="$emit('input', $event.target.value)" />
</template>
<script>
export default {
name: 'MyInput',
props: {
value: String
}
};
</script>
在上面的組件中,我們定義了一個value prop,這是與v-model系結的資料,我們還將內置的input事件轉發為一個自定義的input事件,并在事件處理程式中更新內部狀態,現在,我們可以在父組件中使用v-model來系結這個自定義組件的值,就像使用普通的輸入框一樣:
<template>
<div>
<my-input v-model="message" />
<p>{{ message }}</p>
</div>
</template>
<script>
import MyInput from './MyInput.vue';
export default {
components: {
MyInput
},
data() {
return {
message: ''
};
}
};
</script>
在上面的代碼中,我們通過使用v-model指令來雙向系結message資料和MyInput組件的值,當用戶在輸入框中輸入文本時,MyInput組件會觸發input事件,并將其更新的值發送給父組件,從而實作了雙向系結的效果,
3. 事件總線(EventBus)
Vue事件總線是一個事件處理機制,它可以讓組件之間進行通信,以便在應用程式中共享資訊,在Vue.js應用程式中,事件總線通常是一個全域實體,可以用來發送和接收事件,
以下是使用Vue事件總線的步驟:
3.1 創建一個全域Vue實體作為事件總線:
import Vue from 'vue'; export const eventBus = new Vue();
3.2 在需要發送事件的組件中,使用$emit方法觸發事件并傳遞資料:
eventBus.$emit('eventName', data);
3.3 在需要接收事件的組件中,使用$on方法監聽事件并處理資料:
eventBus.$on('eventName', (data) => {
// 處理資料
});
需要注意的是,事件總線是全域的,所以在不同的組件中,需要保證事件名稱的唯一性,
另外,需要在組件銷毀前使用$off方法取消事件監聽:
eventBus.$off('eventName');
這樣就可以在Vue.js應用程式中使用事件總線來實作組件之間的通信了,
4. render方法
Vue 的 render 方法是用來渲染組件的函式,它可以用來替代模板語法,通過代碼的方式來生成 DOM 結構,相較于模板語法,render 方法具有更好的型別檢查和代碼提示,
下面詳細介紹 Vue 的 render 方法的使用方法:
4.1 基本語法
render 方法的基本語法如下:
render: function (createElement) {
// 回傳一個 VNode
}
其中 createElement 是一個函式,它用來創建 VNode(虛擬節點),并回傳一個 VNode 物件,
4.2 創建 VNode
要創建 VNode,可以呼叫 createElement 函式,該函式接受三個引數:
- 標簽名或組件名
- 可選的屬性物件
- 子節點陣列
例如,下面的代碼創建了一個包含文本節點的 div 元素:
render: function (createElement) {
return createElement('div', 'Hello, world!')
}
如果要創建一個帶有子節點的元素,可以將子節點作為第三個引數傳遞給 createElement 函式,例如,下面的代碼創建了一個包含兩個子元素的 div 元素:
render: function (createElement) {
return createElement('div', [
createElement('h1', 'Hello'),
createElement('p', 'World')
])
}
如果要給元素添加屬性,可以將屬性物件作為第二個引數傳遞給 createElement 函式,例如,下面的代碼創建了一個帶有樣式和事件處理程式的 button 元素:
render: function (createElement) {
return createElement('button', {
style: { backgroundColor: 'red' },
on: {
click: this.handleClick
}
}, 'Click me')
},
methods: {
handleClick: function () {
console.log('Button clicked')
}
}
4.3 動態資料
render 方法可以根據組件的狀態動態生成內容,要在 render 方法中使用組件的資料,可以使用 this 關鍵字來訪問組件實體的屬性,例如,下面的代碼根據組件的狀態動態生成了一個帶有計數器的 div 元素:
render: function (createElement) {
return createElement('div', [
createElement('p', 'Count: ' + this.count),
createElement('button', {
on: {
click: this.increment
}
}, 'Increment')
])
},
data: function () {
return {
count: 0
}
},
methods: {
increment: function () {
this.count++
}
}
4.4 JSX
在使用 Vue 的 render 方法時,也可以使用 JSX(JavaScript XML)語法,這樣可以更方便地撰寫模板,要使用 JSX,需要在組件中匯入 Vue 和 createElement 函式,并在 render 方法中使用 JSX 語法,例如,下面的代碼使用了 JSX 語法來創建一個計數器組件:
import Vue from 'vue'
export default {
render() {
return (
<div>
<p>Count:{this.count}</p>
<button onClick={this.increment}>Increment</button>
</div>
)
},
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
}
}
}
注意,在使用 JSX 時,需要使用 {} 包裹 JavaScript 運算式,
4.5 生成函式式組件
除了生成普通的組件,render 方法還可以生成函式式組件,函式式組件沒有狀態,只接收 props 作為輸入,并回傳一個 VNode,因為函式式組件沒有狀態,所以它們的性能比普通組件更高,
要生成函式式組件,可以在組件定義中將 functional 屬性設定為 true,例如,下面的代碼定義了一個函式式組件,用于顯示串列項:
export default {
functional: true,
props: ['item'],
render: function (createElement, context) {
return createElement('li', context.props.item);
}
}
注意,在函式式組件中,props 作為第二個引數傳遞給 render 方法,本文轉載于:
https://juejin.cn/post/7225921305597820985
如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/551836.html
標籤:其他
上一篇:vue-router
下一篇:返回列表

