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

本文详细介绍了Vue.js中开发自定义组件的通用流程,包括组件模板、属性定义、状态管理、事件处理和样式设置。重点讲解了props中的key、value、label概念以及它们在组件间通信中的作用,同时阐述了required和default属性的必要性。
摘要由CSDN通过智能技术生成

通用流程

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

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中使用自定义组件包括以下几个步骤: 1. 创建自定义组件:在 Vue 项目中创建一个.vue文件,其中包含组件的模板、样式和逻辑代码。例如,创建一个名为 "MyComponent.vue" 的文件。 2. 在需要使用自定义组件的地方,引入自定义组件。可以使用 import 语句或者直接在 Vue 实例中注册组件。 - 使用 import 语句引入自定义组件: ```javascript import MyComponent from './MyComponent.vue'; ``` - 在 Vue 实例中注册组件: ```javascript Vue.component('my-component', MyComponent); ``` 3. 在 Vue 模板中使用自定义组件。在模板中使用组件的方式是将组件的标签作为普通 HTML 标签使用,并传递相应的属性和数据。 ```html <template> <div> <my-component :prop1="value1" :prop2="value2"></my-component> </div> </template> ``` 注意,这里的 "my-component" 是组件标签名,需要与注册组件时的名称保持一致。 4. 在自定义组件中,可以通过 props 接收传递给组件的数据,并在组件内部进行处理和渲染。 ```html <template> <div> <h1>{{ prop1 }}</h1> <p>{{ prop2 }}</p> </div> </template> <script> export default { props: ['prop1', 'prop2'], // 组件的其他逻辑代码 } </script> ``` 这样,你就可以在 Vue 项目中使用自定义组件了。记得在需要使用组件的地方引入自定义组件,并在模板中使用组件的标签。同时,可以通过 props 向组件传递数据,组件内部可以通过 props 接收并使用这些数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值