Vue 3 插件構建指南
插件是向 Vue 應用程序添加可重用功能的好方法。憑藉大量現有的用於組件、路由等的插件,Vue 生態系統爲許多常見用例提供了漂亮的解決方案。
常用的一些插件例如vue-router
、vue custom-element
和vue-touch
等等。
但是,有時你找不到與項目完美匹配的插件,或者你想自己來構建插件與世界分享,那怎麼辦呢?
請看今天的教程——如何構建你自己的 Vue 3 插件。
我們可以用 Vue 插件做什麼?
簡單地說,Vue 插件允許我們提取任何類型的功能到獨立的代碼中,而這些代碼可在不同的項目中重複使用。
通常,它們用於向 Vue 應用程序添加全局級別的功能。根據 Vue 文檔,以下是插件的一些最常見用途。
-
添加全局組件
-
添加全局指令、轉換或其他資源
-
通過全局混入(如 vue-router)添加組件選項
-
l 添加附加屬性到 Vue 實例(通過
app.config.globalProperties
)
我們將在本教程深入探討這些情況,但是首先,讓我們繼續創建插件。
創建 Vue 3 插件
這裏我們將製作一個插件:允許我們向 Vue 應用程序添加 UI 元素和樣式。
對於這個插件,我們要創建一個名爲MyPlugin.js
的文件,並在其中使用install
方法創建export default
。這個install
方法有兩個參數:
-
app
:來自 Vue 的createApp
方法的應用程序 -
options
:將插件添加到 Vue 實例時傳入的任何選項
MyFirstPlugin.js
export default {
install: (app, options) => {
/* our code for the plugin goes here
app is the result of createApp()
options is user options passed in
*/
}
}
然後,爲了將這個插件真正插入到 Vue app 中,我們前往main.js
文件並使用app.use()
。
main.js
import { createApp } from 'vue'
import App from './App.vue'
import MyFirstPlugin from './plugin'
const app = createApp(App)
app.use(MyFirstPlugin, /* can pass options as second param */)
app.mount('#app')
下面開始向插件添加功能。
從 Vue 插件添加全局組件
Vue 插件的一個優勢是,可以添加能在 Vue 項目的任何地方使用的全局組件,而無需顯式導入這些組件。
通過使用 app 參數(此參數允許我們訪問 Vue 實例),我們可以使用app.component
語法聲明全局組件。
通過使用app.component
,我們可以使用單個文件組件或直接在 Javascript 文件中聲明組件。今天我們將製作我們自己的 SFC。
假設我們要創建一個 header 組件——將其命名爲MyHeader.vue
——包含文章帖子的信息。
MyHeader.vue
<template>
<div>
<h1 class="header-title">
<slot />
</h1>
<h2 class="title-author">
<slot />
</h2>
</div>
</template>
爲了將其添加到插件中,我們可以轉到MyFirstPlugin.js
並將其添加到install
方法中。
import MyHeader from './components/MyHeader.vue'
export default {
install: (app, options) => {
/* declare global component */
app.component('my-header', MyHeader)
}
}
現在,我們可以在 Vue app 的任意位置使用全局的MyHeader
。
再讓我們在App.vue
中檢查一下。不需要導入,就可以將它添加到模板中。
<template>
<my-header>
<template #title>
Building Your Own Vue 3 Plugin - <i> A Full Guide </i>
</template>
<template #author>
Matt Maribojoc
</template>
</my-header>
</template>
最終的結果是這樣的!
很棒哦。
我們還可以在組件中添加樣式
如果我們向組件添加任何非作用域樣式,就可以設置 Vue app 的樣式,非常簡單。
例如,如果我們想更改整個項目的字體大小和背景顏色,則可以在MyHeader
組件中進行。
<template>
<div>
<h1 class="header-title">
<slot />
</h1>
<h2 class="title-author">
<slot />
</h2>
</div>
</template>
<style>
html, body, * {
font-size: 1.2em;
background: #fafafa;
}
</style>
再回過頭去看瀏覽器。
超酷!一切都根據樣式更新了,並且總是可以同其他 CSS 一樣在子組件中被覆蓋。
使用 Vue 插件添加全局指令
我最喜歡 Vue 的原因之一是能夠創建自己的指令。
指令是 Vue 允許開發人員直接編輯 DOM 的一種方式。其示例包括:v-if
、v-show
、v-bind
等。如果你用過 Vue,你肯定不會對指令陌生。
藉助插件,我們可以使用app.directive
輕鬆創建跨項目使用的指令。
假設我們要創建一個目標是改變文本大小的指令。
也就是說,接受一個確定元素字體大小的指令參數,然後更改該元素(通過el
)的樣式以使用合適的尺寸。
MyFirstPlugin.js
export default {
install: (app, options) => {
app.component('my-header', MyHeader)
app.directive("font-size", (el, binding, vnode) => {
var size = 16;
switch (binding.arg) {
case "small":
size = 12;
break;
case "large":
size = 24;
break;
default:
size = 18;
break;
}
el.style.fontSize = size + "px";
})
}
}
然後,在App.vue
中——或在任意組件中都可,因爲是全局可用的——我們可以像這樣使用指令。
App.vue
<template>
<p v-font-size:small>Small</p>
<p v-font-size:medium>Medium</p>
<p v-font-size:large>Large</p>
<my-header>
<template #title>
Building Your Own Vue 3 Plugin - <i> A Full Guide </i>
</template>
<template #author>
Matt Maribojoc
</template>
</my-header>
</template>
結果如下所示。
使用插件選項提供自定義
現在我們來討論install
方法的第二個參數——options
。爲插件添加選項能夠使其更靈活地面對不同的用例。
假設我們希望開發人員能夠控制small
、medium
和large
參數的確切尺寸大小。
如果我們回到main.js
,可以向添加插件到 Vue app 的app.use
函數添加第二個參數。
接着創建對象來指定每種字體大小。
main.js - adding options
app.use(MyFirstPlugin, {
fontSize: {
small: 12,
medium: 24,
large: 36
}
})
然後,回到插件中,我們可以使用options
對象來提取傳遞給插件的內容,而不是硬編碼字體的大小。
MyFirstPlugin.js - using options
app.directive("font-size", (el, binding, vnode) => {
var size = 16;
switch (binding.arg) {
case "small":
size = options.fontSize.small;
break;
case "large":
size = options.fontSize.large;
break;
default:
size = options.fontSize.medium;
break;
}
el.style.fontSize = size + "px";
})
現在,如果我們回頭看,可以看到我們在應用程序中成功地使用了指定的字體大小。
使用 Mixin 添加方法、數據和其他組件選項
插件向 Vue 應用程序添加可重用功能的一種常見方式,是使用 Vue mixins。Mixins 是一種向 Vue 組件添加組件選項的方法。
我們可以添加任何組件選項,如生命週期鉤子、數據和方法,如果組件使用此 mixins,這些選項將與該組件的選項合併。
瞭解這些選項是如何合併的很重要。例如,mixin 生命週期鉤子將在組件鉤子之前被調用,如果存在命名衝突,組件數據將優先於 mixin 數據。
我們可以使用app.mixin
方法創建全局的 mixin。
假設我們要添加一個只會向控制檯輸出日誌語句的created
鉤子,還想提供一個data
屬性,該屬性提供一個外部 URL,使用這個 URL 可以更改整個 app 中鏈接的href
屬性。
MyFirstPlugin.js
export default {
install: (app, options) => {
app.mixin({
data() {
return {
featuredLink: 'https://learnvue.co'
}
},
created() {
console.log("Printing from created.")
},
})
}
}
在我們使用的組件中,這個created
鉤子都會運行,並且我們可以訪問featuresLink
屬性。我們有兩條打印輸出——一條是通過App.vue
,一條是通過MyHeader.vue
。
使用 Vue 插件的 provide 和 inject
讓特定組件訪問不同屬性和方法的一種強大方法是使用 Vue 中的provide
和inject
模式。
這允許插件提供屬性或方法,並允許組件注入值。
讓我們來看一個創建logout
方法的示例。我們不需要這個方法對每個組件都可用,只要創建了這個方法就行。
我們在插件中聲明方法,並調用app.provide
將其提供給應用程序的其餘部分。app.provide
的語法是(key, value)
MyFirstPlugin.js
import { provide } from 'vue'
export default {
install: (app, options) => {
const logout = () => {
console.log('Logout is being called')
}
app.provide('logout', logout)
}
}
然後,我們可以在任意組件內注入這個方法,接下來我們要創建一個調用logout
方法的按鈕。
App.vue
<template>
<button @click="logout"> Logout </button>
<p v-font-size:small>Small</p>
<p v-font-size:medium>Medium</p>
<p v-font-size:large>Large</p>
<a :href="featuredLink"> Featured Link </a>
<my-header>
<template #title>
Building Your Own Vue 3 Plugin - <i> A Full Guide </i>
</template>
<template #author>
Matt Maribojoc
</template>
</my-header>
</template>
<script setup>
import { inject } from 'vue'
const logout = inject('logout')
</script>
所以現在每當我們點擊按鈕時,插件的日誌語句就會打印到控制檯。
超讚的!
寫在最後的話
設計 Vue 3 插件的可能性是無窮無盡的,因爲我們有衆多出色的變換、路由等插件。今天我們介紹的是一些複雜工具的核心構建塊。
希望這篇教程能對大家有所幫助。祝編碼快樂!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/wEOmjL9MH2J5Dv__qe4hmA