Vue2/Vue3 自定義組件庫


文章使用示例代碼地址:FFFirer/vuedemo (github.com)

在文件夾 bootstrap-vue-component-demo 下

參考文章:vue自定義組件庫_coder tanrj的博客-CSDN博客

創建項目

這邊使用的 vue3 及對應的 vue-cli,選擇 vue3 默認項目模板

vue create <your-project-name>

創建好的目錄結構如下所示

參照 element-ui 的項目結構我們將src文件改名為 examples,這里放置一些控件的 demo 或者測試,新建一個 packages 文件夾這個文件夾主要存放為自定義控件的內容。

創建 vue.config.js,寫入如下配置

const path = require('path')
const {
    config
} = require('process')

const resolve = dir => path.join(__dirname, dir)

module.exports = {
    pages: {
        index: {
            entry: 'examples/main.js',
            template: 'public/index.html',
            filename: 'index.html'
        }
    },

    chainWebpack: config => {
        config.module
            .rule('js')
            .include
            .add(resolve('packages'))
            .end()
            .use('babel')
            .loader('babel-loader')
            .tap(option => {
                return option
            })
    }
}

定義組件

在 packages 文件夾下新建一個組件,文件結構如下

在 packages/datePicker/src/datePicker.vue 中,編寫如下代碼,注意Vue2和Vue3的區別,Vue3使用defineComponent({})

Vue2版本

<template>
  <div>這是一個datePicker組件!</div>
</template>

<script>
export default {
  name: "datePicker"
};
</script>

<style lang="scss">
</style>

Vue3版本

<template>
  <div>這是一個datePicker組件!</div>
</template>

<script>
import { defineComponent } from "vue";
export default defineComponent({
  name: "datePicker"
});
</script>

在 packages/datePicker/index.js 中,編寫如下代碼

import datePicker from './src/datePicker.vue'

datePicker.install = function (Vue) {
    Vue.component(datePicker.name, datePicker);
}

export default datePicker;

在 packages/index.js 中,注冊組件

import datePicker from './datePicker/index'

const components = [

    datePicker,
]

// Vue2
// const install = function (Vue) {
//     components.forEach(component => {
//         Vue.component(component.name, component);
//     });
// }

const install = function (Vue) {
    components.forEach(component => {
        Vue.component(component.name, component);
    });
}

// Vue2 使用的Vue.component(..)注冊
// if (typeof window != 'undefined' && window.Vue) {
//     install(window.Vue);
// }

// Vue3 將組件都掛載到window上,
// 需要createApp({})之后手動調用app.use(...),具體看下面示例
if (typeof window != 'undefined' && window.Vue) { window.b4Components = { install, datePicker, } } export { install, datePicker, }

 

本地測試

在 examples 文件中調用上門我們寫的自定義組件,看是否能正常調用

在 examples/main.js 中引入組件

import {
    createApp
} from 'vue'
import App from './App.vue' import { datePicker } from '../packages/index'

var app = createApp(App).use(datePicker)
app.config.productionTip = false
app.mount('#app')

在頁面上直接使用

<template>
  <img alt="Vue logo" src="./assets/logo.png" />
  <HelloWorld msg="Welcome to Your Vue.js App" />
  <date-picker></date-picker>
</template>

<script>
import HelloWorld from "./components/HelloWorld.vue";

export default {
  name: "App",
  components: {
    HelloWorld
  }
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

查看效果

 

打包文件

在 package.json 中添加如下命令

"build-lib": "vue-cli-service build --target lib --name bootstrap-vue-component-demo --dest lib packages/index.js"

執行命令

npm run build-lib

打包好的文件結構

 

在瀏覽器直接引用打包后后的文件

注意,應該使用名字中帶umd的js文件,代表在瀏覽器和node環境中都可以調用。

頁面代碼

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <meta charset="utf-8">
    <title>bootstrap-vue-component-demo</title>
    <link rel="stylesheet" href="./b4Components.css">
    <link rel="stylesheet" href="https://unpkg.com/element-plus/lib/theme-chalk/index.css">
</head>

<body>
    <div id="app">
        <date-picker></date-picker>
    </div>
</body>

</html>

<script src="https://unpkg.com/vue@next"></script>
<script src="./b4Components.umd.js"></script>
<script>
    const app = Vue.createApp({
        data: function () {
            return {
                demoDropdownList: [{
                        label: "test A",
                        value: 1,
                        href: "#"
                    },
                    {
                        label: "test B",
                        value: 2,
                        href: "#"
                    }
                ]
            };
        }
    });
    app.use(b4Components); // 使用自定義的組件庫
    app.mount("#app");
</script>

頁面效果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM