做自(zì)由與創造的先行者

插件

Vue.js中文(wén)手冊

介紹 ​

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

js

import { createApp } from 'vue'

const app = createApp({})

app.use(myPlugin, {

/* 可選的選項 */

})

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

js

const myPlugin = {

install(app, options) {

// 配置此應用(yòng)

}

}

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

通過 app.component() 和(hé) app.directive() 注冊一到(dào)多個全局組件或自(zì)定義指令。

通過 app.provide() 使一個資源可被注入進整個應用(yòng)。

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

一個可能(néng)上(shàng)述三種都包含了(le)的功能(néng)庫 (例如 vue-router)。

編寫一個插件 ​

爲了(le)更好(hǎo)地理(lǐ)解如何構建 Vue.js 插件,我們可以試着寫一個簡單的 i18n (國際化 (Internationalization) 的縮寫) 插件。

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

js

// plugins/i18n.js

export default {

install: (app, options) => {

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

}

}

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

template

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

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

js

// plugins/i18n.js

export default {

install: (app, options) => {

// 注入一個全局可用(yòng)的 $translate() 方法

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

// 獲取 `options` 對(duì)象的深層屬性

// 使用(yòng) `key` 作(zuò)爲索引

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

if (o) return o[i]

}, options)

}

}

}

我們的 $translate 函數會(huì)接收一個例如 greetings.hello 的字符串,在用(yòng)戶提供的翻譯字典中查找,并返回翻譯得到(dào)的值。

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

js

import i18nPlugin from './plugins/i18n'

app.use(i18nPlugin, {

greetings: {

hello: 'Bonjour!'

}

})

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

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

TIP

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

插件中的 Provide / Inject ​

在插件中,我們可以通過 provide 來(lái)爲插件用(yòng)戶供給一些(xiē)内容。舉例來(lái)說,我們可以将插件接收到(dào)的 options 參數提供給整個應用(yòng),讓任何組件都能(néng)使用(yòng)這(zhè)個翻譯字典對(duì)象。

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)

}

}

現(xiàn)在,插件用(yòng)戶就可以在他(tā)們的組件中以 i18n 爲 key 注入并訪問插件的選項對(duì)象了(le)。

js

export default {

inject: ['i18n'],

created() {

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

}

}

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