做(zuò)自(zì)由與創造的先行(xíng)者

插件

Vue.js中文手冊

介紹 ​

插件 (Plugins) 是一(yī)種能(néng)為(wèi) Vue 添加全局功能(néng)的工(gōng)具代碼。下(xià)面是如(rú)何安裝一(yī)個插件的示例:

js

import { createApp } from 'vue'

const app = createApp({})

app.use(myPlugin, {

/* 可(kě)選的選項 */

})

一(yī)個插件可(kě)以是一(yī)個擁有 install() 方法的對象,也可(kě)以直接是一(yī)個安裝函數(shù)本身。安裝函數(shù)會接收到安裝它的應用實例和(hé)傳遞給 app.use() 的額外(wài)選項作(zuò)為(wèi)參數(shù):

js

const myPlugin = {

install(app, options) {

// 配置此應用

}

}

插件沒有嚴格定義的使用範圍,但(dàn)是插件發揮作(zuò)用的常見(jiàn)場景主要(yào)包括以下(xià)幾種:

通(tōng)過 app.component() 和(hé) app.directive() 注冊一(yī)到多個全局組件或自(zì)定義指令。

通(tōng)過 app.provide() 使一(yī)個資源可(kě)被注入進整個應用。

向 app.config.globalProperties 中添加一(yī)些全局實例屬性或方法

一(yī)個可(kě)能(néng)上(shàng)述三種都(dōu)包含了(le)的功能(néng)庫 (例如(rú) vue-router)。

編寫一(yī)個插件 ​

為(wèi)了(le)更好地(dì)理解如(rú)何構建 Vue.js 插件,我們可(kě)以試着寫一(yī)個簡單的 i18n (國(guó)際化 (Internationalization) 的縮寫) 插件。

讓我們從(cóng)設置插件對象開(kāi)始。建議(yì)在一(yī)個單獨的文件中創建并導出它,以保證更好地(dì)管理邏輯,如(rú)下(xià)所示:

js

// plugins/i18n.js

export default {

install: (app, options) => {

// 在這(zhè)裏編寫插件代碼

}

}

我們希望有一(yī)個翻譯函數(shù),這(zhè)個函數(shù)接收一(yī)個以 . 作(zuò)為(wèi)分隔符的 key 字符串,用來在用戶提供的翻譯字典中查找對應語言的文本。期望的使用方式如(rú)下(xià):

template

<h1>{{ $translate('greetings.hello') }}</h1>

這(zhè)個函數(shù)應當能(néng)夠在任意模闆中被全局調用。這(zhè)一(yī)點可(kě)以通(tōng)過在插件中将它添加到 app.config.globalProperties 上(shàng)來實現:

js

// plugins/i18n.js

export default {

install: (app, options) => {

// 注入一(yī)個全局可(kě)用的 $translate() 方法

app.config.globalProperties.$translate = (key) => {

// 獲取 `options` 對象的深層屬性

// 使用 `key` 作(zuò)為(wèi)索引

return key.split('.').reduce((o, i) => {

if (o) return o[i]

}, options)

}

}

}

我們的 $translate 函數(shù)會接收一(yī)個例如(rú) greetings.hello 的字符串,在用戶提供的翻譯字典中查找,并返回翻譯得到的值。

用于查找的翻譯字典對象則應當在插件被安裝時(shí)作(zuò)為(wèi) app.use() 的額外(wài)參數(shù)被傳入:

js

import i18nPlugin from './plugins/i18n'

app.use(i18nPlugin, {

greetings: {

hello: 'Bonjour!'

}

})

這(zhè)樣,我們一(yī)開(kāi)始的表達式 $translate('greetings.hello') 就會在運行(xíng)時(shí)被替換為(wèi) Bonjour! 了(le)。

TypeScript 用戶請(qǐng)參考:擴展全局屬性

TIP

請(qǐng)謹慎使用全局屬性,如(rú)果在整個應用中使用不同插件注入的太多全局屬性,很(hěn)容易讓應用變得難以理解和(hé)維護。

插件中的 Provide / Inject ​

在插件中,我們可(kě)以通(tōng)過 provide 來為(wèi)插件用戶供給一(yī)些內(nèi)容。舉例來說,我們可(kě)以将插件接收到的 options 參數(shù)提供給整個應用,讓任何組件都(dōu)能(néng)使用這(zhè)個翻譯字典對象。

js

// plugins/i18n.js

export default {

install: (app, options) => {

app.config.globalProperties.$translate = (key) => {

return key.split('.').reduce((o, i) => {

if (o) return o[i]

}, options)

}

app.provide('i18n', options)

}

}

現在,插件用戶就可(kě)以在他(tā)們的組件中以 i18n 為(wèi) key 注入并訪問(wèn)插件的選項對象了(le)。

js

export default {

inject: ['i18n'],

created() {

console.log(this.i18n.greetings.hello)

}

}

網站建設開(kāi)發|APP設計開(kāi)發|小程序建設開(kāi)發
下(xià)一(yī)篇:Transition
上(shàng)一(yī)篇:自(zì)定義指令