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

news2024/10/28 0:14:42

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

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

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())操作

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HarmonyOS Next】原生沉浸式界面

背景 在实际项目中&#xff0c;为了软件使用整体色调看起来统一&#xff0c;一般顶部和底部的颜色需要铺满整个手机屏幕。因此&#xff0c;这篇帖子是介绍设置的方法&#xff0c;也是应用沉浸式效果。如下图&#xff1a;底部的绿色延伸到上面的状态栏和下面的导航栏 UI 在鸿蒙…

Android 判断手机放置的方向

#1024程序员节&#xff5c;征文# 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 需求 老板&#xff1a;我有个手持终端&#xff0c;不能让他倒了&#xff0c;当他倒或者倾斜的时候要发出报警&#xff1b; 程序猿&#xff1a;我这..... 老板…

断点续传技术是什么?大型文件传输的新模式!

随着科技的不断进步&#xff0c;文件传输已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;传输大型文件时常常会遇到网络不稳定、传输中断等问题&#xff0c;导致传输失败或者重新传输。为解决这一问题&#xff0c;断点续传技术应运而生。 一、断点续传技术是什么…

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…

猫头虎 分享:MySQL 中 TEXT 与 LONGTEXT 数据类型详解与使用场景分析

今天猫头虎带大家深入探讨一番&#xff0c;关于 MySQL 中 TEXT 和 LONGTEXT 数据类型的区别与具体使用场景问题。最近有粉丝私信我说&#xff1a;“猫哥&#xff0c;TEXT 和 LONGTEXT 到底应该怎么选择啊&#xff1f;” 我相信很多开发者在面对 MySQL 中的这两个数据类型时&…

Scrapy框架原理与使用流程

一.Scrapy框架特点 框架&#xff08;Framework&#xff09;是一种软件设计方法&#xff0c;它提供了一套预先定义的组件和约定&#xff0c;帮助开发者快速构建应用程序。框架通常包括一组库、工具和约定&#xff0c;它们共同工作以简化开发过程。scrapy框架是python写的 为了爬…

C++的相关习题(2)

初阶模板 下面有关C中为什么用模板类的原因&#xff0c;描述错误的是? ( &#xff09; A.可用来创建动态增长和减小的数据结构 B.它是类型无关的&#xff0c;因此具有很高的可复用性 C.它运行时检查数据类型&#xff0c;保证了类型安全 D.它是平台无关的&#xff0c;可移植…

局部变量和全局变量(Python)

引入例子拆解 源码 class A:def __init__(self):self.test 0def add(c, k):c.test c.test 1k k 1def main():Count A()k 0for i in range(0, 25):add(Count, k)print("Count.test", Count.test)print("k", k)main() 运行结果如下图 代码解析 这…

HTML+JavaScript案例分享: 打造经典俄罗斯方块,详解实现全过程

在本文中,我们将深入探讨如何使用 JavaScript 实现经典的俄罗斯方块游戏。俄罗斯方块是一款广为人知的益智游戏,通过操纵各种形状的方块,使其在游戏区域内排列整齐,以消除完整的行来获得分数。 效果图如下: 一、游戏界面与布局 我们首先使用 HTML 和 CSS 来创建游戏的界面…

Uni-App-03

登录功能开发 实现POST提交 HTTP协议规定请求消息内容类型(Content-Type)有哪些&#xff1f;—— 只有四种 text/plain 没有编码的普通数据 application/x-www-form-urlencoded 编码后的普通数据 multipart/form-data 请求主体中包含文件上传域 application/json 请求主体是 J…

微信小程序版本更新管理——实现自动更新

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

js构造函数和原型对象,ES6中的class,四种继承方式

一、构造函数 1.构造函数是一种特殊的函数&#xff0c;主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…

1 vsCode安装与使用

1 下载地址 Visual Studio Code - Code Editing. Redefined 2 安装 3 安装插件 安装完要重启 chinese:中文插件 open in browser &#xff1a;快速打开浏览器插件 ----------------------------------------------------------------------------------------------------- 重…

嵌入式学习-网络-Day02

嵌入式学习-网络-Day02 1.优化代码&#xff1a; 网络问题&#xff1a; 2.1虚拟机网络修复 2.2 网络调试 ping netstat 3.UDP编程 3.1通信流程 3.2函数接口 1.优化代码&#xff1a; 1.端口和ip地址通过命令行传参到代码中。 2.设置客户端退出&#xff0c;服务器结束循环接收。 通…

unity中GameObject介绍

在 Unity 中&#xff0c;Cube和Sphere等基本几何体是 Unity 引擎的内置预制体&#xff08;Prefabs&#xff09;&#xff0c;它们属于 Unity 中的GameObject 系统&#xff0c;可以在 Unity 的 Hierarchy 视图或 Scene 视图中右键点击&#xff0c;然后在弹出的菜单中选择 3D Obje…

论文阅读与写作入门

文章目录 1.阅读第一篇论文(1)论文结构(2)目标 2.使用GPT辅助论文的阅读与写作3.专有名词(1)架构(2)网络(3)机器学习 4.文献翻译软件5.从哪里下载文献&#xff1f;6.如何判断(你自己的)研究工作的价值or贡献【论文精读李沐】7.经典论文(1)AlexNet 2012(2)FCN 全卷积 2014(3)Res…

C++《vector的模拟实现》

在之前《vector》章节当中我们学习了STL当中的vector基本的使用方法&#xff0c;了解了vector当中各个函数该如何使用&#xff0c;在学习当中我们发现了vector许多函数的使用是和我们之前学习过的string类的&#xff0c;但同时也发现vector当中一些函数以及接口是和string不同的…

【纯血鸿蒙】HarmonyOS和OpenHarmony 的区别

一、开源鸿蒙&#xff08;Open Harmony&#xff09; 鸿蒙系统愿来的设计初衷&#xff0c;就是让所有设备都可以运行一个系统&#xff0c;但是每个设备的运算能力和功能都不同&#xff0c;所以内核的设计上&#xff0c;采用了微内核的设计&#xff0c;除了最基础的功能放在内核…

云岚到家 即刻体检 优惠卷管理 总结不熟练的点

多个条件的分页查询 public PageResult<ActivityInfoResDTO> queryPage(ActivityQueryForPageReqDTO reqDTO) {Page<Activity> pagequery new Page<>(reqDTO.getPageNo(),reqDTO.getPageSize());LambdaQueryWrapper<Activity> wrapper new LambdaQ…

C++ | Leetcode C++题解之第500题键盘行

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> findWords(vector<string>& words) {vector<string> ans;string rowIdx "12210111011122000010020202";for (auto & word : words) {bool isValid true;cha…