封装一个vue3的公共组件

在Vue 3中,封装公共组件的场景包括但不限于以下几种情况:

  • 重复使用的组件:如果你发现某个组件在多个地方重复使用,那么将其封装成公共组件是很有意义的。比如,页面中的各种表单控件(输入框、下拉框、日期选择器等)经常可以被封装成公共组件。

  • 业务无关的通用组件:当有一些组件是业务无关的,并且可以在不同的项目中重复使用时,将其封装成公共组件。比如各种Loading、提示框、消息提示等。

  • 复杂组件的拆分:有些复杂的组件可以被拆分成若干公共组件,每个公共组件承担不同的责任,这样做不但提高了可维护性,也方便了代码的重用。

  • 提高可维护性:封装公共组件可以提高代码的可维护性和可读性。通过组件封装,将业务逻辑和UI组件分离,使得代码结构更加清晰。

  • 标准化UI风格:封装公共组件有助于保持一致的UI风格。例如,如果你希望所有的表单输入框都具有相同的风格和交互行为,那么可以封装一个通用的表单输入框组件。

这里使用的场景是重复使用的组件:定义一个公共的快递组件选择,首先在项目的src下面定义一个文件夹components,然后在里面创建文件ExpressList.vue。
在这里插入图片描述
ExpressList.vue文件里面的代码

<template>
    <div class="expressValue-list">
        <el-select v-model="expressValue" class="w-220" placeholder="请选择" @change="changeExpress">
            <el-option label="全部" value="" v-if="isAll" />
            <el-option v-for="(item, index) in expressList" :key="item.id" :value="isId ? item.id : item.code" :label="item.name" />
        </el-select>
    </div>
</template>
<script setup >
import { onBeforeMount, ref, watch } from "vue" 
const expressList = ref([])
const props = defineProps({
    listValue: [String, Number],
    isId: {
        default: false,
        type: Boolean
    }, //是否需要id传默认false
    isAll: {
        default: false,
        type: Boolean
    },//是否开启查找全部功能,默认false
    //可以加其它任何根据项目需要的条件,上面的只是举例
})
const emits = defineEmits(['update:listValue']);
const expressValue = computed({
    get: () => { return props.listValue },
    set: newVal => emits('update:listValue', newVal)
});
const changeExpress = (value) => {
    expressValue.value = value
}
//这里真实项目掉接口获取
const getExpress = () => { 
    expressList.value =    [
        {
            "id": "1",
            "code": "YD",
            "name": "韵达速递",
        },
        {
            "id": "2",
            "code": "ZTO",
            "name": "中通快递",
        },
        {
            "id": "3",
            "code": "SF",
            "name": "顺丰速运",
        },
        {
            "id": "4",
            "code": "YTO",
            "name": "圆通速递",
        },
        {
            "id": "5",
            "code": "YZPY",
            "name": "邮政快递包裹",
        },
        {
            "id": "6",
            "code": "STO",
            "name": "申通快递",
        },
        {
            "id": "7",
            "code": "JD",
            "name": "京东快递",
        },
        {
            "id": "8",
            "code": "EMS",
            "name": "EMS",
        },
        {
            "id": "9",
            "code": "HTKY",
            "name": "百世快递",
        },
        {
            "id": "10",
            "code": "JTSD",
            "name": "极兔速递",
        },
        {
            "id": "11",
            "code": "DNWL",
            "name": "丹鸟",
        },
        {
            "id": "12",
            "code": "EMS",
            "name": "邮政电商标快",
        },
        {
            "id": "13",
            "code": "SF",
            "name": "顺丰快运",
        }
    ]
}
onBeforeMount(() => {
    getExpress()
})
</script>

<style lang="scss" scoped>
.expressValue-list {
.w-220{
	width:220px;
}
</style>

到这里一个基础的下拉选择快递的公共组件模版就完成了,最后那么在项目里面怎么使用呢???
向下面这样使用

//父组件
<template>
    <div class="page">
      <ExpressList v-model:listValue="express" :isAll="true"/>
    </div>
</template>
 //express就是双向 绑定的选择下拉框的值
 //isAll=ture ,开启全部查找的功能

最后看截图
在这里插入图片描述
注 :因为公共组件会在项目里面多次使用,所以可以全局注册组件,
关于如何注册全局组件可以看官网 组件注册

### 创建和使用 Vue3 公共组件的最佳实践 #### 一、定义公共组件 为了提高代码的重用性和维护性,创建一个独立于具体页面逻辑之外的公共组件是非常必要的。假设要构建一个通用的消息提示框 `MessageAlert`。 ```vue <!-- MessageAlert.vue --> <template> <div v-if="visible" class="message-alert"> {{ message }} </div> </template> <script setup lang="ts"> import { ref } from &#39;vue&#39;; const props = defineProps({ message: { type: String, required: true } }); // 控制消息框显示隐藏的状态 let visible = ref(false); defineExpose({ setVisible }); function setVisible(flag:boolean){ visible.value = flag; } </script> <style scoped> .message-alert{ /* 添加样式 */ } </style> ``` 这段代码展示了如何定义一个带有简单属性绑定以及内部状态管理的基础公共组件[^1]。 #### 二、全局注册公共组件 为了让整个应用程序都能访问该组件而不必每次都手动导入并局部声明,可以通过插件的形式将其作为全局组件来注册: ```typescript // plugins/messageAlertPlugin.ts import { App, Plugin } from "vue"; import MessageAlert from "@/components/MessageAlert.vue"; export default ((app:App<Element>)=>{ app.component("MessageAlert", MessageAlert); }) as Plugin; // main.ts 中应用此插件 import messageAlertPlugin from &#39;./plugins/messageAlertPlugin&#39;; createApp(App).use(messageAlertPlugin).mount(&#39;#app&#39;); ``` 这样做的好处在于可以在任何地方直接使用 `<MessageAlert>` 而无需额外配置[^3]。 #### 三、按需懒加载公共组件 当项目规模较大时,考虑性能优化问题,可以采用异步加载的方式来延迟加载不常用的公共组件: ```javascript const AsyncComponent = () => import(/* webpackChunkName:"group-messagealert" */ &#39;@/components/MessageAlert.vue&#39;) ``` 这种方式不仅减少了初始包体积,还能让用户体验更加流畅。 #### 四、组合式API增强公共组件的功能性 借助Vue3的新特性——组合式API,能够更好地组织复杂业务场景下的逻辑关系。比如针对上述提到的消息提醒功能,如果想要增加更多交互行为(如定时关闭),就可以利用setup语法糖配合ref/reactive等响应式工具轻松实现[^4]: ```typescript import { onMounted, nextTick, watchEffect } from &#39;vue&#39; onMounted(() => { let timer:any|null=null; const startTimer=()=>{ clearTimeout(timer); timer=setTimeout(()=>{ setVisible(false); },3000); // 自动消失时间设置为3秒 } watchEffect((onInvalidate)=>{ if(visible.value===true){ nextTick(startTimer); onInvalidate(()=>clearTimeout(timer)); } }); }); ``` 以上就是在Vue3框架下创建高效灵活的公共组件的一些基本思路和技术要点。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jet_closer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值