日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 Vue 正文

Vue3.0插件執行原理與實戰_vue.js

作者:前端點線 ? 更新時間: 2022-04-10 Vue

一、編寫插件

Vue項目能夠使用很多插件來豐富自己的功能,例如Vue-Router、Vuex……,這么多插件供我們使用,節省了我們大量的人力和物力,那這些插件是開發出來的呢?是不是我們自己也想擁有一個屬于自己的vue插件,下面就展示一下如何寫一個自己的Vue插件。

1.1 包含install()方法的Object

Vue插件可以是一個包含install方法的Object對象,此時插件被調用時會調用install方法,

如下所示:

export default {
    // 接收兩個參數
    // app: 應用上下文的實例
    // options:插件輸入的選項
    install: (app, options) => {
        console.log('app', app);
        console.log('options', options);
        // 做一些處理
        // ……
    }
}

1.2 通過function的方式

Vue插件也可以是一個function函數,此時插件被調用時會調用function函數本身,

如下所示:

export default function TestPlugin(app, options) {
    console.log('app', app);
    console.log('options', options);
}

二、使用插件

上述已經闡述了如何編寫自己的插件,插件編寫完了之后就需要使用這些插件了,那這些插件應該如何使用呢?其實用起來很簡單,應用上下文的實例上提供了對應的use方法。

app.use(plugin, [options]); // 返回一個應用實例,所以其可以鏈式添加新的插件

三、app.use()是如何執行插件的

為什么app.use()可以使用這些插件呢?本著“知其然而知其所以然”的精神,一起來扒一扒為什么。如下是對應的源碼:

function createApp(rootComponent, rootProps = null) {
    // ……
    const installedPlugins = new Set();
    const app = (context.app = {
        // ……
        use(plugin, ...options) {
            if (installedPlugins.has(plugin)) {
                warn(`Plugin has already been applied to target app.`);
            }
            else if (plugin && shared.isFunction(plugin.install)) {
                installedPlugins.add(plugin);
                plugin.install(app, ...options);
            }
            else if (shared.isFunction(plugin)) {
                installedPlugins.add(plugin);
                plugin(app, ...options);
            }
            else {
                warn(`A plugin must either be a function or an object with an "install" ` +
                    `function.`);
            }
            return app;
        },
        // ……
    });
    return app;
};

上述代碼讀起來很簡單,其實現了以下幾件事情:

  • 利用Set結構存儲插件,當存在該插件時拋出異常;
  • 通過判斷是否存在install方法或是否是函數,執行對應的插件;
  • 執行插件時將app上下文實例和options作為參數傳入;

原文鏈接:https://developer.51cto.com/article/700581.html

欄目分類
最近更新