首页 > 其他分享 >Vue.js 组件开发进阶指南

Vue.js 组件开发进阶指南

时间:2024-12-25 13:28:54浏览次数:5  
标签:Vue 进阶 default 插槽 js export 组件 动态

这里写目录标题

引言

Vue.js 是一个优秀的渐进式框架,其核心特性之一是 组件化开发
通过组件,开发者可以将页面分解成独立的可复用模块,从而提高开发效率和代码的可维护性。

本文将从 动态组件开发父子组件通信 入手,结合实际案例,探讨 Vue 组件开发中的一些进阶技巧。


一、组件基础回顾

1. 什么是 Vue 组件?

Vue 组件是一个独立、可复用的视图模块,通常包括 HTML 模板逻辑代码样式

  • 组件基本结构:
<template>
  <div>
    <h2>{{ title }}</h2>
  </div>
</template>

<script>
export default {
  props: ["title"],
};
</script>

<style scoped>
h2 {
  color: #42b983;
}
</style>

二、动态组件开发

动态组件是 Vue 提供的一个功能,用于在同一位置动态切换多个组件。

1. 使用 component 标签实现动态加载

<template>
  <div>
    <button @click="currentComponent = 'ComponentA'">加载 A</button>
    <button @click="currentComponent = 'ComponentB'">加载 B</button>
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
import ComponentA from "./ComponentA.vue";
import ComponentB from "./ComponentB.vue";

export default {
  data() {
    return {
      currentComponent: "ComponentA",
    };
  },
  components: {
    ComponentA,
    ComponentB,
  },
};
</script>

2. 动态组件缓存:<keep-alive>

在动态切换组件时,默认会销毁当前组件并重新加载。如果希望缓存已加载的组件,可以使用 <keep-alive>

<template>
  <keep-alive>
    <component :is="currentComponent"></component>
  </keep-alive>
</template>

三、父子组件通信进阶

1. 父组件向子组件传递数据:props

案例:多级标题的动态生成

<!-- ParentComponent.vue -->
<template>
  <div>
    <ChildComponent :level="1" :text="'一级标题'" />
    <ChildComponent :level="2" :text="'二级标题'" />
  </div>
</template>

<script>
import ChildComponent from "./ChildComponent.vue";

export default {
  components: { ChildComponent },
};
</script>
<!-- ChildComponent.vue -->
<template>
  <component :is="'h' + level">{{ text }}</component>
</template>

<script>
export default {
  props: {
    level: { type: Number, required: true },
    text: { type: String, required: true },
  },
};
</script>

2. 子组件向父组件传递数据:$emit

子组件可以通过 $emit 将事件通知父组件。

案例:自定义按钮组件

<!-- ButtonComponent.vue -->
<template>
  <button @click="handleClick">{{ label }}</button>
</template>

<script>
export default {
  props: ["label"],
  methods: {
    handleClick() {
      this.$emit("button-clicked", this.label);
    },
  },
};
</script>
<!-- ParentComponent.vue -->
<template>
  <div>
    <ButtonComponent label="按钮 A" @button-clicked="onButtonClicked" />
    <ButtonComponent label="按钮 B" @button-clicked="onButtonClicked" />
  </div>
</template>

<script>
import ButtonComponent from "./ButtonComponent.vue";

export default {
  components: { ButtonComponent },
  methods: {
    onButtonClicked(label) {
      alert(`你点击了:${label}`);
    },
  },
};
</script>

3. 非父子组件通信:EventBus

如果两个组件没有直接的父子关系,可以使用事件总线进行通信。

案例:跨组件通知

// event-bus.js
import Vue from "vue";
export const EventBus = new Vue();
<!-- ComponentA.vue -->
<template>
  <button @click="sendMessage">发送消息</button>
</template>

<script>
import { EventBus } from "./event-bus";

export default {
  methods: {
    sendMessage() {
      EventBus.$emit("message", "Hello from ComponentA!");
    },
  },
};
</script>
<!-- ComponentB.vue -->
<template>
  <p>消息:{{ message }}</p>
</template>

<script>
import { EventBus } from "./event-bus";

export default {
  data() {
    return {
      message: "",
    };
  },
  created() {
    EventBus.$on("message", (msg) => {
      this.message = msg;
    });
  },
};
</script>

四、高级特性:插槽 (Slot)

1. 默认插槽

插槽可以让父组件在子组件中插入内容。

<template>
  <div>
    <slot></slot>
  </div>
</template>

2. 具名插槽

通过具名插槽,可以在子组件中定义多个插槽。

<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

使用具名插槽:

<ChildComponent>
  <template v-slot:header>我是标题</template>
  <p>我是内容</p>
  <template v-slot:footer>我是页脚</template>
</ChildComponent>

3. 作用域插槽

作用域插槽可以让子组件的数据传递给插槽内容。

<template>
  <slot :user="user"></slot>
</template>

<script>
export default {
  data() {
    return {
      user: { name: "Vue.js", age: 5 },
    };
  },
};
</script>

父组件使用:

<ChildComponent v-slot="{ user }">
  <p>用户名:{{ user.name }}</p>
</ChildComponent>

五、总结

在 Vue.js 中,组件开发不仅关乎 UI 的拆分,还涉及到灵活的数据传递和动态功能的实现。
通过熟练掌握动态组件、父子通信、插槽等进阶特性,可以更高效地开发复杂的前端应用。


参考资料

标签:Vue,进阶,default,插槽,js,export,组件,动态
From: https://blog.csdn.net/wds326598/article/details/144709989

相关文章

  • 全国消费水平系统|Java|SSM|JSP| 
                            【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服......
  • 详细讲一下Vue2.x,Vue3.x,React的Vdom和Diff算法
    1.Vue的vdom和Diff1.1.Vue的实现://Vue2.x的VNode结构{tag:'div',//标签名data:{//节点数据class:'container',attrs:{id:'app'},on:{click:handler}},childr......
  • 计算机毕业设计 | SpringBoot+vue高校专业实习管理系统 大学生实训管理(附源码+论文)
    1,绪论1.1项目背景随着高等教育的快速发展,专业实习已成为培养学生实践能力、创新能力和职业素养的重要环节。然而,传统的人工管理方式存在效率低、易出错、信息不透明等问题,难以满足当前高校对专业实习管理的需求。因此,开发一套高效、便捷、智能化的高校专业实习管理系统显......
  • 计算机毕业设计 | SpringBoot+vue库存管理系统 企业采购进存销仓库管理(附源码+论文)
    1,绪论1.1选题动因在现在社会,对于信息处理方面,是有很高的要求的,因为信息的产生是无时无刻的,并且信息产生的数量是呈几何形式的增加,而增加的信息如何存储以及短时间分析检索,也是有时效性的,所以,不管是任何的企业和个人,只要需要处理信息,必然是要寻找到一个适合自己的解决方案......
  • 计算机毕业设计 | SpringBoot+vue车辆管理系统 汽车保养事故维修违章处理平台(附源码+
    1,绪论1.1研究背景近年来,第三产业发展非常迅速,诸如计算机服务、旅游、娱乐、体育等服务行业,对整个社会的经济建设起到了极大地促进作用,这一点是毋庸置疑的。现下,国家也出台了一些列的政策来支持和鼓励第三服务产业的发展与完善,用以带动社会经济的发展。所以,整体来说,国家是......
  • AI大模型应用入门实战与进阶:构建你的第一个大模型:实战指南
    2017年是机器学习领域历史性的一年。GoogleBrain团队的研究人员推出了Transformer,它的性能迅速超越了大多数现有的深度学习方法。著名的注意力机制成为未来Transformer衍生模型的关键组成部分。Transformer架构的惊人之处在于其巨大的灵活性:它可以有效地用于各种机器......
  • HTML页面的哈希(hash)路由原理+原生js案例
    HTML页面的哈希(hash)路由原理+原生js案例|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|-......
  • jsgrid多个自定义控件按钮?
    jsgrid多个自定义控件按钮?|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|-------------|......
  • 前端依赖-时间管理工具(moment.js)详细使用文档
    1.安装和引入npmimoment//安装importmomentfrom'moment';//引入2.基本使用(1)获取当前时间(2)格式化时间:①年份:YYYY四位数字完整表示的年份如:2014或2000YY两位数字表示的年份如:14或98②月份:MMMM月份,完整的文本格式January到Dece......
  • jstl一些标签 中timestamp类型在页面去掉时分秒!
    jstl一些标签中timestamp类型在页面去掉时分秒!|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|--------......