Vue 自定义组件创建与调用全流程解析

作者:山岚

时间:2026-10-23

浏览:293

本文详细解析 Vue 中自定义组件的创建与调用方法。通过封装独立组件(如 Loading 或提交状态组件),利用 props 实现父传子数据传递,并通过 $emit 实现子向父的事件通信。文章涵盖组件文件创建、index.js 导出配置、main.js 全局注册及页面模板使用,结合代码示例说明组件化开发的最佳实践。

文章目录

Vue 组件通信机制概述

在 Vue 开发中,掌握组件化思维至关重要。父组件向子组件传递数据主要依靠 props,而子组件向父组件反馈状态或触发逻辑则依赖 $emit。可以将组件比作汽车的车轮:props 决定了车轮的外观风格(如花纹、图案),使其符合整车设计;而 $emit 则确保车轮能与车身完美配合,实现动态交互与功能闭环。

核心机制包括两点:一是通过 props 实现父子组件间的数据单向传递;二是通过 this.$emit() 方法触发父组件中定义的事件回调,从而实现子组件对父组件行为的调用。

组件创建与代码结构

第一步,在项目的 components 目录下创建对应的组件文件。

Vue 组件通信机制概述

第二步,编写组件的具体代码逻辑与模板结构。

以 index.vue 为例,定义组件的基础模板与样式。

组件内部状态处理示例


<template>
  <div class="cusdealed">
    <div class="submited" v-if="showStatus==1">
      <div class="submitRes">
        <img class="resImg" src="../../common/img/repectSubmit.png" alt="">
      </div>
      <div class="submitTip tipwidth">该单据已经提交过了,不用重复提交哦!</div>
    </div>

     <div class="submited" v-if="showStatus==2">
      <div class="submitRes">
        <img class="resImg" src="../../common/img/invalid.png" alt="">
      </div>
      <div class="submitTip">单据已失效,不能扫单入库!</div>
    </div>

    <div class="submited" v-if="showStatus==3">
      <div class="submitRes">
        <img class="resImg" src="../../common/img/invalid.png" alt="">
      </div>
      <div class="submitTip">找不到该单据,不能扫单入库!</div>
    </div>
    
  </div>
</template>
<script type="text/javascript" src="./logic.js"></script>
<style lang="less" scoped>
  @import './style.css';
</style>
style.less

//样式文件
@import '../../common/less/px2rem.less';
@import '../../common/less/base.less';

.cusdealed {
 .submited {
  .submitRes {
   .px2rem(150);
   width: @px2rem;
   height: @px2rem;
  }

  .submitRes {
   .px2rem(227);
   margin: @px2rem auto 0;

   .resImg {
    width: 100%;
    height: 100%;
    display: block;
   }
  }

  .submitTip {
  .px2rem(58);
  //  height: @px2rem;
   font-family: PingFangSC-Regular;
   font-weight: 400;
   color: rgba(51, 51, 51, 1);
   line-height: @px2rem;
  }
  .submitTip{
    .px2rem(32);
    font-size: @px2rem;
  }
  .tipwidth{
    .px2rem(384);
    width: @px2rem;
  }
  .submitTip{
    .px2rem(50);
    margin: @px2rem auto 0;
  }
 }
}
logic.js

//逻辑文件
import { Spinner } from 'vux'

export default {
  name: 'cusDealing',
  data() {
    return {
     showStatus:1
    }
  },
  components: {
    Spinner,
  },
  props: {
    // showStatus: Number
   },
   computed: {
  
   },
   watch: {
    showStatus(val) {
     console.log(val, 'showStatus---')
     return val;
    }
   },
  methods: {
    
  },
  mounted() {
   
  }
}

组件引入与页面调用

第三步,演示如何在实际项目中调用已封装的组件。

首先需要在项目中引入该组件,确保路径正确。

Vue 组件通信机制概述

接着在页面模板中直接使用自定义组件标签进行渲染。

HTML 模板部分,通过标签名引用组件。

组件在模板中的使用


 <!-- 处理完弹窗 -->
  <div class="dealed" :style="'padding-top:'+marginTop+'px;height:'+bodyheight+'px;'" v-if="dealStatus==2">
    <div class="dealedContent">
      <Cusdealed :showStatus="showStatus"></Cusdealed>
      <div class="Iknow" @click="Iknow">我知道了</div>
    </div>
  </div>

JavaScript 逻辑部分,处理组件交互与状态更新。

Vue 组件通信机制概述

最终在浏览器中查看组件渲染效果及交互反馈。

Vue 组件通信机制概述

实战案例:封装 Loading 组件

接下来,结合具体案例深入解析组件化的实际应用场景。

许多开发者关心如何编写 Vue 组件并将其集成到项目中。这就像煮米饭一样,需要遵循特定的步骤与规范。

首先,需要准备“米”,即创建组件源文件。假设我们要封装一个 Loading 效果组件,新建 loading.vue。其代码编写需遵循 Vue template 规范,此处仅展示最简示例,省略复杂逻辑。

Vue 组件通信机制概述

组件导出配置 (index.js)

有了源文件(米),接下来需要配置“锅”,即创建统一的导出文件。通常每个组件对应一个独立文件夹,并包含一个 index.js 作为统一入口。虽然文件名可自定义,但约定俗成使用 index.js 以方便后续调用时的路径管理。

Vue 组件通信机制概述

在 index.js 中,主要包含三个关键部分:红色区域标识引入刚才创建的 loading.vue 源文件;黄色区域是核心配置,通过 ES6 模块导出机制暴露组件,其中的命名(如 Loading)即为在其他文件中引用该组件时的标签名,例如使用 <Loading></Loading>;白色区域则是将该组件导出至 main.js 以便全局注册或局部引用。

组件注册与全局应用

3.原材料大米也有了 饭锅也有了 现在是万事俱备只欠东风 那我们第三部就是一个字”煮“ 两字:”开火“ 这里就是我们要把我们这个自己创建的组件应用到我们的页面之中 详情请看下图

Vue 组件通信机制概述

在 main.js 主入口文件中,引入刚才定义的组件模块,并将其注册为全局或局部组件,完成组件的挂载与初始化。

完成上述步骤后,即可在任何需要的页面中插入 <Loading></Loading> 标签。组件对应的样式与 JS 逻辑已封装在第一步创建的源文件中,从而实现组件的复用与高效应用。

注:本实例基于 vue init webpack-simple xxx 基础模板构建。作为示例文章,内容可能存在未尽之处,敬请谅解。

总结

至此,关于 Vue 自定义组件的写法与用法详解已完成。更多相关 Vue 组件内容,请搜索本站历史文章或继续浏览后续教程。感谢支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章