【热门主题】000010 深入 Vue.js 组件开发

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕

共同探索软件研发!敬请关注【宝码香车】
关注描述

csdngif标识

目录

  • 【热门主题】000010 深入 Vue.js 组件开发
  • 📚一、引言
  • 📚二、Vue.js 组件开发基础
    • 📘(一)什么是组件
    • 📘(二)组件的创建方式
    • 📘(三)组件的基本结构
  • 📚三、组件的属性(Props)
    • 📘(一)Props 的定义和使用
    • 📘(二)Props 的类型验证
    • 📘(三)Props 的单向数据流
  • 📚四、组件的事件(Events)
    • 📘(一)自定义事件的触发
    • 📘(二)父组件监听子组件事件
  • 📚五、组件的插槽(Slots)
    • 📘(一)默认插槽
    • 📘(二)具名插槽
    • 📘(三)作用域插槽
  • 📚六、组件的状态管理(Vuex)
    • 📘(一)Vuex 的基本概念
    • 📘(二)Vuex 的核心概念
    • 📘(三)在组件中使用 Vuex
  • 📚七、组件的高级特性
    • 📘(一)动态组件
    • 📘(二)异步组件
    • 📘(三)递归组件
  • 📚八、组件的测试
    • 📘(一)单元测试
    • 📘(二)集成测试
  • 📚九、组件的优化
    • 📘(一)性能优化
    • 📘(二)可维护性优化
  • 📚十、总结


📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣

【热门主题】000010 深入 Vue.js 组件开发

📚一、引言

在前端开发领域,Vue.js 以其简洁、高效和灵活的特性受到了广泛的关注和喜爱。Vue.js 的组件化开发模式更是为构建大型复杂应用提供了强大的支持。本文将深入探讨 Vue.js 组件开发的各个方面,从基础概念到高级技巧,帮助读者全面掌握 Vue.js 组件开发。

📚二、Vue.js 组件开发基础

📘(一)什么是组件

在 Vue.js 中,组件是可复用的 Vue 实例,它们封装了特定的功能和 UI 表现。组件可以接受输入属性(props),并通过自定义事件($emit)向父组件传递数据。
例如,一个简单的按钮组件可以这样定义:

<template>
  <button @click="handleClick">{{ label }}</button>
</template>

<script>
export default {
  name: 'MyButton',
  props: {
    label: {
      type: String,
      required: true
    }
  },
  methods: {
    handleClick() {
      this.$emit('click');
    }
  }
};
</script>

📘(二)组件的创建方式

全局组件
可以使用 Vue.component() 方法创建全局组件,这样在整个应用中都可以使用该组件。

Vue.component('MyGlobalComponent', {
  // 组件定义
});



局部组件
在单个 Vue 实例中,可以通过 components 选项定义局部组件。

new Vue({
  el: '#app',
  components: {
    'MyLocalComponent': {
      // 组件定义
    }
  }
});

📘(三)组件的基本结构

一个 Vue.js 组件通常由三部分组成:模板(template)、脚本(script)和样式(style)。
模板
模板定义了组件的 UI 结构,可以使用 HTML 和 Vue.js 的指令来描述组件的外观。
脚本
脚本部分包含组件的逻辑,如数据、方法、计算属性等。
样式
可以使用 CSS 或预处理器来定义组件的样式,确保组件的外观独立且可维护。

📚三、组件的属性(Props)

📘(一)Props 的定义和使用

Props 是父组件传递给子组件的数据。在子组件中,可以通过 props 选项定义接收的属性。

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  name: 'MyComponent',
  props: {
    message: {
      type: String,
      required: true
    }
  }
};
</script>

📘(二)Props 的类型验证

可以对 Props 进行类型验证,确保传入的数据符合预期。Vue.js 支持多种数据类型的验证,如字符串、数字、布尔值、数组、对象等。

props: {
  count: {
    type: Number,
    default: 0
  },
  isActive: {
    type: Boolean,
    default: false
  },
  names: {
    type: Array,
    default: () => []
  },
  person: {
    type: Object,
    default: () => ({})
  }
}

📘(三)Props 的单向数据流

Vue.js 中的 Props 遵循单向数据流原则,即父组件的属性变化会影响子组件,但子组件不能直接修改父组件传递的 Props。如果需要修改 Props 的值,可以在子组件中使用本地数据来复制 Props 的值,然后修改本地数据。

<template>
  <div>{{ localMessage }}</div>
</template>

<script>
export default {
  name: 'MyComponent',
  props: {
    message: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      localMessage: this.message
    };
  }
};
</script>

📚四、组件的事件(Events)

📘(一)自定义事件的触发

在子组件中,可以使用 $emit 方法触发自定义事件,并传递数据给父组件。

<template>
  <button @click="handleClick">Click me</button>
</template>

<script>
export default {
  name: 'MyComponent',
  methods: {
    handleClick() {
      this.$emit('myEvent', 'data from child component');
    }
  }
};
</script>

📘(二)父组件监听子组件事件

在父组件中,可以使用 v-on 指令监听子组件触发的事件,并在事件处理函数中接收子组件传递的数据。

<template>
  <div>
    <my-component @myEvent="handleChildEvent"></my-component>
  </div>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  name: 'ParentComponent',
  components: {
    MyComponent
  },
  methods: {
    handleChildEvent(data) {
      console.log(data);
    }
  }
};
</script>

📚五、组件的插槽(Slots)

📘(一)默认插槽

默认插槽允许父组件向子组件传递内容,子组件可以在模板中使用 标签来显示父组件传递的内容。

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



父组件使用:

<my-component>
  <h1 slot="header">Header Content</h1>
  Main content
  <p slot="footer">Footer Content</p>
</my-component>

📘(二)具名插槽

具名插槽可以让父组件在向子组件传递内容时指定插槽的名称,子组件可以根据插槽的名称来显示不同的内容。

📘(三)作用域插槽

作用域插槽允许子组件向父组件传递数据,并在父组件中使用这些数据来渲染内容。

<template>
  <div>
    <slot :data="data"></slot>
  </div>
</template>

<script>
export default {
  name: 'MyComponent',
  data() {
    return {
      data: 'data from child component'
    };
  }
};
</script>


父组件使用:

<my-component>
  <template v-slot:default="slotProps">
    {{ slotProps.data }}
  </template>
</my-component>

📚六、组件的状态管理(Vuex)

📘(一)Vuex 的基本概念

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

📘(二)Vuex 的核心概念

State:存储应用的状态数据。
Getters:可以对 State 中的数据进行计算和过滤,类似于 Vue 实例中的计算属性。
Mutations:用于更改 State 中的数据,必须是同步函数。
Actions:用于提交 Mutations,可以包含异步操作。

📘(三)在组件中使用 Vuex

从 Vuex 中获取状态数据
在组件中可以通过 computed 属性来获取 Vuex 中的状态数据。

<template>
  <div>{{ count }}</div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  name: 'MyComponent',
  computed: {
  ...mapState(['count'])
  }
};
</script>

提交 Mutations 和 Actions
在组件中可以通过 methods 属性来提交 Mutations 和 Actions。

methods: {
  increment() {
    this.$store.commit('increment');
  },
  async incrementAsync() {
    await this.$store.dispatch('incrementAsync');
  }
}

📚七、组件的高级特性

📘(一)动态组件

可以使用 标签和 is 属性来动态切换组件。


<template>
  <div>
    <button @click="toggleComponent">Toggle Component</button>
    <component :is="currentComponent"></component>
  </div>
</template>

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

export default {
  name: 'DynamicComponent',
  components: {
    ComponentA,
    ComponentB
  },
  data() {
    return {
      currentComponent: 'ComponentA'
    };
  },
  methods: {
    toggleComponent() {
      this.currentComponent = this.currentComponent === 'ComponentA'? 'ComponentB' : 'ComponentA';
    }
  }
};
</script>

📘(二)异步组件

在大型应用中,可以使用异步组件来懒加载组件,提高应用的性能。

const AsyncComponent = () => import('./AsyncComponent.vue');

export default {
  components: {
    AsyncComponent
  }
};

📘(三)递归组件

递归组件是指在组件内部调用自身的组件。可以使用递归组件来实现树形结构等复杂的 UI 效果。

<template>
  <div>
    <ul>
      <li v-for="item in items" :key="item.id">
        {{ item.name }}
        <tree-view v-if="item.children" :items="item.children"></tree-view>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'TreeView',
  props: {
    items: {
      type: Array,
      required: true
    }
  }
};
</script>

📚八、组件的测试

📘(一)单元测试

可以使用 Jest、Mocha 等测试框架来对 Vue.js 组件进行单元测试。单元测试主要测试组件的单个功能点,如数据、方法、计算属性等。
例如,使用 Jest 测试一个组件的方法:

import { shallowMount } from '@vue/test-utils';
import MyComponent from './MyComponent.vue';

describe('MyComponent', () => {
  it('should call handleClick method when button is clicked', () => {
    const wrapper = shallowMount(MyComponent);
    const button = wrapper.find('button');
    button.trigger('click');
    expect(wrapper.vm.handleClick).toHaveBeenCalled();
  });
});

📘(二)集成测试

集成测试主要测试组件之间的交互和整个应用的功能。可以使用 Cypress、Nightwatch 等测试框架来进行集成测试。
例如,使用 Cypress 测试一个页面的功能:

describe('My Page', () => {
  it('should display correct content', () => {
    cy.visit('/my-page');
    cy.get('h1').should('contain', 'My Page Title');
    cy.get('button').click();
    cy.get('div').should('contain', 'Button clicked');
  });
});

📚九、组件的优化

📘(一)性能优化

避免不必要的重新渲染
可以使用 computed 属性和 watch 选项来避免不必要的重新渲染。例如,使用 computed 属性来计算一个值,只有当依赖的数据发生变化时,才会重新计算该值。

computed: {
  fullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

懒加载组件
可以使用异步组件来懒加载组件,只有当组件需要显示时才会加载,提高应用的性能。

📘(二)可维护性优化

组件的命名规范
使用有意义的名称来命名组件,提高组件的可维护性。例如,使用 MyButton 而不是 Button1 来命名一个按钮组件。
组件的文档化
为组件编写清晰的文档,包括组件的功能、使用方法、输入输出等信息,提高组件的可维护性。

📚十、总结

Vue.js 的组件化开发模式为构建大型复杂应用提供了强大的支持。通过本文的介绍,我们深入了解了 Vue.js 组件开发的各个方面,包括组件的基础概念、属性、事件、插槽、状态管理、高级特性、测试和优化等。在实际开发中,我们可以根据项目的需求和特点,灵活运用这些知识,构建出高效、可维护的 Vue.js 应用。
在组件开发过程中,我们还需要不断学习和探索新的技术和方法,提高自己的开发水平。同时,也要注重代码的质量和可维护性,为项目的长期发展打下坚实的基础

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。


整理不易,点赞关注宝码香车

更多专栏订阅推荐:
👍 html+css+js 绚丽效果
💕 vue
✈️ Electron
⭐️ js
📝 字符串
✍️ 时间对象(Date())操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初见Linux:权限篇

一.权限的定义&#xff1a; 什么是权限?所谓权限在现实中就是权力限制&#xff0c;是对于人&#xff0c;不同人所扮演的角色有着不同的权限。那么在Linux中也存在权限。权限角色事物属性。那么对于一件事情能否去执行以及完成都需要权限。 二.Linux中的用户 2.1&#xff1a;r…

【SpringMVC】web服务器,访问失败的问题,SpringMVC,建立连接,请求

【web服务器】 web服务器可以对http协议进行封装&#xff0c;程序员不需要直接对http协议进行操作&#xff08;不需要去写复杂的网络编程代码&#xff09;&#xff0c;让web开发更加便捷&#xff0c;所以它也有「WWW服务器」的称呼 常见的web服务器:Tomcat&#xff0c;Jboss&…

华为配置 之 STP

目录 简介&#xff1a; STP&#xff1a; RSTP: 如何改变根网桥&#xff1a; &#xff08;1&#xff09;改变优先级&#xff1a; &#xff08;2&#xff09;改变root: 各端口的状态&#xff1a; 总结&#xff1a; 简介&#xff1a; STP&#xff08;Spanning Tree Protoco…

深度学习:Matplotlib篇

一、简介 1.1 什么是 Matplotlib&#xff1f; Matplotlib 是一个广泛使用的 2D 绘图库&#xff0c;它可以用来在 Python 中创建各种静态、动态和交互式的图表。无论是科学计算、数据可视化&#xff0c;还是深度学习模型的训练与评估&#xff0c;Matplotlib 都能提供强大的图形…

虚拟现实新纪元:VR/AR技术将如何改变娱乐与教育

内容概要 在当今科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;技术不仅让我们的娱乐体验如虎添翼&#xff0c;更为教育变革注入了新活力。这些技术的飞跃进展&#xff0c;将原本平淡无奇的场景转变为令人沉醉的沉浸…

深入浅出 C++ STL:解锁高效编程的秘密武器

引言 C 标准模板库&#xff08;STL&#xff09;是现代 C 的核心部分之一&#xff0c;为开发者提供了丰富的预定义数据结构和算法&#xff0c;极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C 开发者来说至关重要。以下是对 STL 的详细介绍&#xff0c;涵盖其基础知…

面向对象编程中类与类之间的关系(一)

目录 1.引言 2."有一个"关系 3."是一个"关系(继承) 4.“有一个”与“是一个”的区别 5.not-a关系 6.层次结构 7.多重继承 8.混入类 1.引言 作为程序员&#xff0c;必然会遇到这样的情况&#xff1a;不同的类具有共同的特征&#xff0c;至少看起来彼…

JavaWeb——Web入门(1/9)-Spring Boot Web介绍(Spring家族,Spring Boot)

目录 Spring家族 Spring Boot 在我们了解完了 Maven 这款项目构建工具的基本使用之后&#xff0c;接下来我们正式的进入到 Web 后端开发的学习。 第一篇章要了解的是 Spring Boot Web 的入门。 在正式开始之前&#xff0c;我们先需要介绍一下什么是 Spring 以及什么是 Spri…

H3C Hybrid 实验

实验拓扑 图 1-1 注&#xff1a;如无特别说明&#xff0c;描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备&#xff0c;R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设备&#xff0c;以此类推&#xff1b;另外&#xff0c;同一网段中&#xff0c;IP 地址的主机位为…

【NOI】C++函数入门二(自定义函数)

文章目录 前言一、概念1.导入1.1 首先什么是函数呢&#xff1f; 2.函数分类3.为什么要定义函数呢&#xff1f;4.函数结构5.函数使用注意事项 二、例题讲解问题&#xff1a;1137 - 纯粹素数问题&#xff1a;1258 - 求一个三位数问题&#xff1a;1140 - 亲密数对问题&#xff1a;…

Flutter仿京东商城APP实战 用户中心基础布局

用户中心界面 pages/tabs/user/user.dart import package:flutter/material.dart; import package:jdshop/utils/zdp_screen.dart; import package:provider/provider.dart;import ../../../store/counter_store.dart;class UserPage extends StatefulWidget {const UserPage…

如何在Node.js中执行解压缩文件操作

一、解压文件 1.安装依赖&#xff1a; 安装adm-zip依赖包&#xff1a;npm install adm-zip --save 安装iconv-lite依赖包&#xff1a;npm install iconv-lite --save 解压前的file文件夹结构&#xff1a; update-1.0.2.zip压缩包内容&#xff1a; 2.在depresssFile.js文件&…

Vue学习笔记(六)

模板引用(获取DOM 操作) 虽然Vue的声明性渲染模型为你抽象了大部分对DOM的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层DOM元素。要实现这一点&#xff0c;我们可以使用特殊的refattribute。 挂载结束后引用都会被暴露在this.$refs之上。 <s…

华为原生鸿蒙操作系统:我国移动操作系统的新篇章

华为原生鸿蒙操作系统&#xff1a;我国移动操作系统的新篇章 引言 在移动操作系统领域&#xff0c;苹果iOS和安卓系统一直占据主导地位。然而&#xff0c;随着华为原生鸿蒙操作系统的正式发布&#xff0c;这一格局正在发生深刻变化。作为继苹果iOS和安卓系统后的全球第三大移动…

android studio编译错误提示无法下载仓库

一、调整方法之一 buildscript {repositories {google()jcenter()//maven { url https://maven.aliyun.com/repository/google }//maven { url https://maven.aliyun.com/repository/central }}dependencies {// classpath "com.android.tools.build:gradle:4.1.1"c…

Prompt Engineering (Prompt工程)

2 prompt工程2大原则 2.1 给出清晰&#xff0c;详细的指令 策略1&#xff1a;使用分割符清晰的指示输出的不同部分&#xff0c;比如"",<>,<\tag>等分隔符 策略2&#xff1a;指定一个结构化的输出&#xff0c;比如json,html等格式 策略3&#xff1a;要…

C++STL之stack

1.stack的使用 函数说明 接口说明 stack() 构造空的栈 empty() 检测 stack 是否为空 size() 返回 stack 中元素的个数 top() 返回栈顶元素的引用 push() 将元素 val 压入 stack 中 pop() 将 stack 中尾部的元素弹出 2.stack的模拟实现 #include<vector> namespace abc { …

监控-08-skywalking监控告警

文章目录 前言一、准备二、配置skywalking2.1 修改alarm-settings.yml2.2 重启skywalking 三、收到告警邮件总结 前言 skywalking根据监控规则&#xff0c;通过webhook调后端微服务接口&#xff0c;从而发送告警邮件。 一、准备 根据上几章内容&#xff0c;保证skywalking能监…

Spring IoC DI

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 目录 1. 应用分层 1.1 如何分层: 1.2 MVC与三层架构区别联系 2. Spring 3.IoC & DI⼊⻔ 3.1 什么是IoC&#xff1f; 3.2 DI 介绍 …

CANFD SSP第二采样点引发的“风波”分析

案例背景&#xff1a; 近几年来&#xff0c;主机厂逐渐大范围使用CANFD通信。在CAN网络中&#xff0c;因SSP第二采样点引发的错误帧偶有发生&#xff0c;所以在主机厂的SPEC需求中&#xff0c;明确要求启用CAN控制器的TDC收发器延迟补偿&#xff0c; 目录 1 CANFD的SSP第二采…