当前位置: 首页 > news >正文

Vue开发日志:自定义组件:通用开发流程

自定义组件:通用开发流程

  • 通用流程
    • 一组概念:key,value,label
    • Props:required和default同时存在的必要性
    • 让我们简单梳理一下

通用流程

在 Vue.js 中开发自定义组件的通用流程如下:

  1. 定义组件模板
    创建一个 .vue 文件,里面包含模板、样式和脚本部分。例如:

    <!-- MyCustomComponent.vue -->
    <template><div class="my-custom-component"><!-- 组件的HTML结构 --></div>
    </template><script>
    export default {name: 'MyCustomComponent',// 组件的数据属性、计算属性、方法等props: {}, // 如果有传入属性data() {return {// 组件内部的状态数据};},computed: {},methods: {},// 生命周期钩子函数created() {},mounted() {},updated() {},beforeDestroy() {},
    };
    </script><style scoped>
    .my-custom-component {/* 组件的CSS样式 */
    }
    </style>
    
  2. 定义组件属性(props):
    如果组件需要接收外部传递的参数,需要在 props 对象中定义。例如:

    props: {title: {type: String,required: true,},value: {type: [String, Number],default: '',},
    },
    
  3. 组件内部状态管理
    data 函数中定义组件内部需要用到的状态变量,也可以使用 refreactive(Vue 3)来创建响应式数据。

  4. 计算属性与方法
    根据业务逻辑定义计算属性和方法。计算属性用于根据组件内部状态生成新的值,方法用于处理事件或其他业务逻辑。

  5. 事件监听与触发
    在组件内部使用 @event 监听事件,并使用 $emit 触发事件,使得父组件可以捕获并处理子组件的事件。

  6. 样式设置
    <style> 标签内编写组件的样式,通常使用 scoped 属性确保样式只作用于当前组件。

  7. 注册组件
    在需要使用自定义组件的父组件或入口文件中,通过 components 选项将其注册。

    // Vue 2
    import MyCustomComponent from './MyCustomComponent.vue';
    export default {components: {MyCustomComponent,},// ...
    };// Vue 3
    import { defineComponent } from 'vue';
    import MyCustomComponent from './MyCustomComponent.vue';export default defineComponent({components: {MyCustomComponent,},// ...
    });
    
  8. 在模板中使用组件
    注册完成后,可以在父组件的模板中使用自定义组件标签。

    <my-custom-component :title="pageTitle" v-model="selectedValue"></my-custom-component>
    

通过以上步骤,你可以完成一个基础的自定义组件开发。当然,实际开发过程中还可能涉及到更复杂的逻辑,比如 slots(插槽)、异步数据加载、自定义指令等。

一组概念:key,value,label

在Vue中,props传入的对象数组包含keyvaluelabel通常是用于列表展示或者其他需要关联显示和隐藏值的场景,特别是在制作Select、Option、Radio、Checkbox等类型的UI组件时很常见。这三个字段分别代表:

  • key:通常用于唯一标识数组中的每个选项,它在内部处理和比较时使用,避免直接使用对象进行比较,提高性能。在一些特定场景下(如Vue Router的路由配置等)key字段是必须的。

  • value:表示选项的实际值,这个值将会作为最终选定的值绑定到父组件的状态中。例如在Select组件中,当你选择了某一项后,组件将返回value作为选中的值。

  • label:表示选项的显示文本,它是用户在界面上看到的内容。在列表中,label通常用于显示在选项上,便于用户阅读和理解。

下面是一个简单的Vue组件使用示例,展示了如何接收一个包含keyvaluelabel的对象数组,并用它来填充一个下拉列表(Select):

<!-- ParentComponent.vue -->
<template><div><CustomSelect :options="selectOptions" v-model="selectedValue" /></div>
</template><script>
import CustomSelect from './CustomSelect.vue';export default {components: {CustomSelect,},data() {return {selectOptions: [{ key: 'opt1', value: 'value1', label: 'Label One' },{ key: 'opt2', value: 'value2', label: 'Label Two' },// 更多选项...],selectedValue: '', // 初始化选中的值为空};},
};
</script><!-- CustomSelect.vue -->
<template><el-select v-model="internalValue"><el-optionv-for="option in options":key="option.key":label="option.label":value="option.value"></el-option></el-select>
</template><script>
export default {props: {options: {type: Array,required: true,default: () => [],},modelValue: {type: [String, Number, Boolean, Object],default: null,},},emits: ['update:modelValue'],computed: {internalValue: {get() {return this.modelValue;},set(value) {this.$emit('update:modelValue', value);},},},
};
</script>

在这个例子中:

  • 父组件 ParentComponent 定义了一个包含 keyvaluelabel 的对象数组 selectOptions,并通过 v-modelselectedValue 传递给 CustomSelect 组件。

  • 子组件 CustomSelect 接收 options 作为 props,并在 el-select 组件中遍历这些选项,用 option.key 作为 el-option 的 key,option.label 作为显示文本,option.value 作为选中时返回的值。

  • 子组件通过 computed 属性 internalValuev-model 结合,实现了 modelValue 的双向绑定,当用户在下拉列表中选择一个选项时,会触发 update:modelValue 事件,从而更新父组件的 selectedValue

Props:required和default同时存在的必要性

在Vue的props配置中,required属性和default属性一起使用是有意义的,尤其是在处理组件库和团队协作时。

  1. required: true 表示该prop是必需的,父组件在使用该子组件时必须传递这个prop。如果不传递,Vue会在控制台抛出警告。

  2. default属性则定义了当父组件未传递该prop时,子组件应当使用的默认值。这对于开发者来说是一种友好的提示和保护措施,即使忘记传递该prop,子组件也能正常使用,不会立即导致程序崩溃。

结合两者来看,required: true强调了开发规范上的要求,提醒开发者必须传递这个prop;而default则是为可能出现的疏漏提供了兜底方案,确保即使在某些情况下未传递所需prop,组件仍能正常运行。

举个例子,假设我们维护一个大型项目,团队成员众多,要求每个使用CustomSelect组件的人都必须传递options,这时我们可以设置required: true。同时,为了防止由于疏忽未传递options而导致组件表现异常,我们又提供了一个默认的空数组作为default值,这样即便忘记传递,组件也不会因为缺少必要数据而无法渲染或报错。

让我们简单梳理一下

首先,当v-model="fatherValue"时,fatherValue的值肯定首先会渲染到子组件中,这也是父传子的第一步。
其次,当我们修改子组件输入框中的内容时,会发起一个事件冒泡,将经过子组件处理后的fatherValue值,打包传入到父组件的监听器处,即靠港。
接着,卸货将其搬运到data本地数据存储区,进行存放,从而实现了贸易往来,也就是父子之间的双绑联动。

相关文章:

  • 鸿蒙一次开发,多端部署(十三)功能开发的一多能力介绍
  • 说说webpack中常见的Loader?解决了什么问题?
  • 锂电池寿命预测 | Matlab基于ALO-SVR蚁狮优化支持向量回归的锂离子电池剩余寿命预测
  • 腾讯春招后端一面(八股篇)
  • 路由器里如何设置端口映射?
  • Java练手游戏--俄罗斯方块
  • GEE高阶案例——Landsat/Sentinel/MODIS影像进行缨帽变换一行代码实现
  • 【小程序开发】位置 API 集合(二)
  • M4A与MP3:两种音频格式的比较
  • IP地址、子网掩码、网关
  • Unbuntu20.04 git push和pull相关问题
  • 探索软件工程:构建可靠、高效的数字世界
  • Web 常见的攻击方式有哪些?
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • sqlalchemy和moke生成实体类(一)
  • php的引用
  • SegmentFault for Android 3.0 发布
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【个人向】《HTTP图解》阅后小结
  • Android Studio:GIT提交项目到远程仓库
  • Android 架构优化~MVP 架构改造
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Fundebug计费标准解释:事件数是如何定义的?
  • Github访问慢解决办法
  • happypack两次报错的问题
  • IDEA常用插件整理
  • Javascript编码规范
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Objective-C 中关联引用的概念
  • VuePress 静态网站生成
  • vue数据传递--我有特殊的实现技巧
  • Vue学习第二天
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 回流、重绘及其优化
  • 软件开发学习的5大技巧,你知道吗?
  • 使用Swoole加速Laravel(正式环境中)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • ​如何在iOS手机上查看应用日志
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Java)【深基9.例1】选举学生会
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Mysql的优化设置
  • (转)mysql使用Navicat 导出和导入数据库
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net程序集学习心得
  • @Async注解的坑,小心
  • @Repository 注解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ C++ ] STL_list 使用及其模拟实现