首页 > 其他分享 >Vue开发日志:自定义组件:通用开发流程

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

时间:2024-03-23 09:31:14浏览次数:31  
标签:Vue 自定义 default value label 开发 key 组件

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

通用流程

在 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-option
      v-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本地数据存储区,进行存放,从而实现了贸易往来,也就是父子之间的双绑联动。

标签:Vue,自定义,default,value,label,开发,key,组件
From: https://blog.csdn.net/HadesNyx/article/details/136883495

相关文章

  • 产业园区开发运营及盈利模式分析
    摘要:产业园区一般由政府或企业开发建设,是区域经济和产业发展的重要空间载体,具有显著的资源集聚能力和产业规模效益,承担着产业要素集聚、新型产业培育、经济高质量发展和新型城镇化建设等重要使命。然而,当前国内部分产业园区因前期开发投入规模大、后期招商及运营管理模式不健全,导......
  • Android开发笔记[16]-简单使用wasmedge运行时
    摘要使用wasmedge运行时在Android实现"容器化"运行,将fibonacci计算函数打包进入wasm然后打包进入APK中.关键信息AndroidStudio:Iguana|2023.2.1Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zipjvmTarget='1.8'minSdk24targe......
  • Vue-组件
    Vue组件一、概念Vue基于可以重用、独立的思想,设计出组件这一概念,组件可以使程序员对每个部分进行单独设计。如下图为组件很形象的定义![image-20240322222233651](/Users/zhangqi/Library/ApplicationSupport/typora-user-images/image-20240322222233651.png)二、非单文件......
  • 函数 (XI) 开发手册和开发文档、函数(XII) 告阶函数【变得麻烦了】、54 永久存储
    查看刚才写的函数注释类型注释内省函数(XII)高阶函数高阶函数就是函数的参数也是函数,比如生成器那节课!高阶函数几乎就可以说是函数式编程的·灵魂所在·54永久存储......
  • Mall4j开源商城系统-基于SpringBoot+Vue系统开发介绍
     今天来介绍一款非常不错的Mall4j开源商城系统Mall4j开源商城,一个基于springboot、springoauth2.0、mybatis、redis的轻量级、前后端分离、防范xss攻击、拥有分布式锁,为生产环境多实例完全准备,数据库为b2b2c设计,拥有完整sku和下单流程的开源商城。目录 今天来介绍一......
  • Android开发笔记[15]-设置页
    摘要使用MMKV数据框架实现设置页数据同步,设置页可以对其他页面进行设置;设置页数据通过MMKV框架持久化存储,重启APP不丢失.关键信息AndroidStudio:Iguana|2023.2.1Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zipjvmTarget='1.......
  • python 教你如何创建一个自定义库 colorlib.py
    目录Colorlib生成代码模块代码导入测试测试一测试二应用测试颜色列表colorList随机颜色元组randcolorTuples随机颜色字串randcolorStringsColor类测试测试一测试二题外话Colorlib有没有碰到过这样的场景:写代码时想要用上丰富的色彩,但苦思冥想搜肠刮肚只记......
  • 蓝桥杯单片机快速开发笔记——利用定时器计数器设置定时器
    一、基本原理        参考本栏http://t.csdnimg.cn/iPHN0二、具体步骤三、主要事项    如果使用中断功能记得打开总中断EA四、示例代码voidTimer0_Isr(void)interrupt1{}voidTimer0_Init(void) //10毫秒@12.000MHz{ AUXR&=0x7F; //定时......
  • 嵌入式开发学习---Linux所有命令、shell命令
    Linux命令系统维护命令df命令df-Th:查看磁盘使用情况文件系统 文件类型大小已使用可用使用比例挂载点FilesystemTypeSizeUsedAvailUse%Mountedon/dev/sda1ext419G6.6G12G38%/mount......
  • 01-Spark的Local模式与应用开发入门
    1Spark的local模式Spark运行模式之一,用于在本地机器上单机模拟分布式计算的环境。在local模式下,Spark会使用单个JVM进程来模拟分布式集群行为,所有Spark组件(如SparkContext、Executor等)都运行在同一个JVM进程中,不涉及集群间通信,适用本地开发、测试和调试。1.1重......