1.在packages下新建components和utils文件夹,分别执行pnpm init,并将他们的包名改为@dlx-ui/components和@dlx-ui/utils,目录结构如下:
组件目录

组件编写
button.vue
js
<!-- button组件 -->
<template>
<button class="button" :class="typeClass" @click="handleClick">
测试按钮
<slot></slot>
</button>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { defineProps, defineEmits } from 'vue'
const props = defineProps({
type: {
type: String,
default: 'default',
},
})
const typeClass = ref('')
const handleClick = () => {
console.log('click')
}
</script>
<style lang="less" scoped>
.button {
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
background: #fff;
border: 1px solid #dcdfe6;
}
</style>
然后在button/index.ts将其导出
js
import Button from './button'
export { Button }
export default Button
因为我们后面会有很多组件的,比如 Icon,Upload,Select 等,所以我们需要在components/src/index.ts集中导出所有组件
js
// components/src/index.ts
export * from './button'
最后在components下的index.ts中,导出所有组件,供其他页面使用
js
export * from './src/index'
局部引用组件
在play项目中,安装@dlx-ui/components,并且在app.vue中使用
在play目录下执行pnpm add @dlx-ui/components
然后在app.vue中引入button
js
<template>
<Button>按钮</Button>
</template>
<script setup lang="ts">
import { Button } from '@dlx-ui/components'
</script>
<style scoped>
</style>

全局挂载组件
有的时候我们使用组件的时候想要直直接使用 app.use()挂载整个组件库,其实使用 app.use()的时候它会调用传入参数的 install 方法,因此首先我们给每个组件添加一个 install 方法,然后再导出整个组件库,我们将 button/index.ts 改为
js
import _Button from './button.vue'
import type { App, Plugin } from "vue";
type SFCWithInstall<T> = T & Plugin;
const withInstall = <T>(comp: T) => {
(comp as SFCWithInstall<T>).install = (app: App) => {
const name = (comp as any).name;
//注册组件
app.component(name, comp as SFCWithInstall<T>);
};
return comp as SFCWithInstall<T>;
};
export const Button = withInstall(_Button);
export default Button;
components/index.ts修改为
js
import * as components from "./src/index";
export * from "./src/index";
import { App } from "vue";
export default {
install: (app: App) => {
for (let c in components) {
app.use(components[c]);
}
},
};
组件命名
此时我们需要给button.vue一个name:dlx-button好在全局挂载的时候作为组件名使用 在setup语法糖中使用defineOptions
js
defineOptions({
name: 'dlx-button',
})
main.ts全局挂载组件库
js
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import dlxui from '@dlx-ui/components'
const app = createApp(App)
app.use(dlxui)
createApp(App).mount('#app')
在app.vue中引入
js
<template>
<dlx-button>全局挂载的按钮</dlx-button>
</template>
<script setup lang="ts"></script>
