深入解析 Vue 组件的构成

        Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。Vue 组件是 Vue 应用的核心,它们封装了可复用的逻辑和视图,使得开发大型应用变得更加简单和高效。在 Vue 3 中,组件的构成更加灵活和强大,主要得益于 Composition API 的引入。本文将详细介绍一个典型的 Vue 3 组件的各个部分,并通过一个完整的示例来展示如何构建一个功能完整的 Vue 3 组件。


1.模板(Template)

        模板部分定义了组件的结构和布局,使用 HTML 语法和 Vue 的模板语法。模板中可以包含数据绑定、指令、事件处理等。


<template>
  <div class="my-component">
    <h1>{ { title }}</h1>
    <button @click="handleClick">Click Me</button>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

在模板中:

  •  `{ { title }}`是数据绑定,用于动态显示响应式数据`title`。
  •  `@click="handleClick"`是事件绑定,用于监听按钮点击事件并调用`handleClick`方法。


2.脚本(Script)

        在 Vue 3 中,脚本部分通常使用`defineComponent`和`setup`函数来定义组件的逻辑。`setup`函数是 Composition API 的核心,用于定义组件的响应式数据、计算属性、方法和生命周期钩子。


<script lang="ts">
import { defineComponent, ref, watch, onMounted, onUnmounted } from 'vue';

export default defineComponent({
  name: 'MyComponent',
  props: {
    message: {
      type: String,
      required: true,
    },
  },
  setup(props) {
    // 响应式数据
    const title = ref('Hello, Vue!');

    // 计算属性
    const reversedTitle = ref('');
    watch(title, (newValue) => {
      reversedTitle.value = newValue.split('').reverse().join('');
    });

    // 方法
    function handleClick() {
      alert('Button clicked!');
    }

    // 生命周期钩子
    onMounted(() => {
      console.log('Component mounted');
    });

    onUnmounted(() => {
      console.log('Component unmounted');
    });

    // 返回响应式数据和方法
    return {
      title,
      reversedTitle,
      handleClick,
    };
  },
});
</script>

在脚本中:

  • 使用`defineComponent`包裹组件逻辑,以提供更好的 TypeScript 支持。
  • 使用`ref`创建响应式数据。
  • 使用`watch`监听数据变化并执行逻辑。
  • 使用`onMounted`和`onUnmounted`定义生命周期钩子。
  • 返回一个对象,包含需要在模板中使用的响应式数据和方法。


3.样式(Style)

        样式部分定义了组件的样式,可以使用 CSS、SCSS、LESS 等。样式可以是全局的,也可以是局部的(使用`scoped`属性)。

<style scoped>
.my-component {
  color: blue;
}
</style>


在样式中:

  • `scoped`属性确保样式只应用于当前组件,避免全局样式冲突。


4.属性(Props)

        组件可以接收外部传入的数据,称为属性(props)。在`props`中定义的属性可以在组件内部使用。


props: {
  message: {
    type: String,
    required: true,
  },
},

5.插槽(Slots)

        插槽允许父组件在子组件中插入内容,提供了更大的灵活性。可以使用具名插槽和默认插槽。


<template>
  <div>
    <slot></slot> <!-- 默认插槽 -->
    <slot name="footer"></slot> <!-- 具名插槽 -->
  </div>
</template>
 

6.计算属性(Computed Properties)

        计算属性是基于响应式数据的派生状态,可以在模板中直接使用。它们会根据依赖的数据变化自动更新。


const reversedTitle = ref('');
watch(title, (newValue) => {
  reversedTitle.value = newValue.split('').reverse().join('');
});
 

7.观察者(Watchers)

        观察者用于观察数据的变化并执行相应的逻辑。可以用于异步操作或复杂逻辑。


watch(title, (newValue, oldValue) => {
  console.log(`Title changed from ${oldValue} to ${newValue}`);
});
 

8.生命周期钩子(Lifecycle Hooks)

        生命周期钩子是 Vue 组件在不同阶段(如创建、挂载、更新、销毁)调用的函数。常用的生命周期钩子包括`onMounted`和`onUnmounted`。


onMounted(() => {
  console.log('Component mounted');
});

onUnmounted(() => {
  console.log('Component unmounted');
});
 

9.事件处理(Event Handling)

        可以在模板中使用`@`符号来监听事件,并在脚本中定义相应的处理方法。


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

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  setup() {
    function handleClick() {
      console.log('Button clicked!');
    }

    return {
      handleClick,
    };
  },
});
</script>

示例:完整的 Vue 3 组件

以下是一个包含上述所有部分的典型 Vue 3 组件示例:


<template>
  <div class="my-component">
    <h1>{ { title }}</h1>
    <p>Reversed Title: { { reversedTitle }}</p>
    <button @click="handleClick">Click Me</button>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref, watch, onMounted, onUnmounted } from 'vue';

export default defineComponent({
  name: 'MyComponent',
  props: {
    message: {
      type: String,
      required: true,
    },
  },
  setup(props) {
    // 响应式数据
    const title = ref('Hello, Vue!');

    // 计算属性
    const reversedTitle = ref('');
    watch(title, (newValue) => {
      reversedTitle.value = newValue.split('').reverse().join('');
    });

    // 方法
    function handleClick() {
      alert('Button clicked!');
    }

    // 生命周期钩子
    onMounted(() => {
      console.log('Component mounted');
    });

    onUnmounted(() => {
      console.log('Component unmounted');
    });

    // 返回响应式数据和方法
    return {
      title,
      reversedTitle,
      handleClick,
    };
  },
});
</script>

<style scoped>
.my-component {
  color: blue;
}
</style>
 

总结

        一个典型的 Vue 3 组件通常包含模板、脚本、样式、属性、插槽、计算属性、观察者、生命周期钩子和事件处理等部分。通过合理使用这些部分,你可以构建出高效、可复用且易于维护的 Vue 3 组件。Vue 3 的 Composition API 提供了更灵活的组件定义方式,使得组件的逻辑更加清晰和易于管理。

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

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

相关文章

PHP 运算符

PHP 运算符 概述 PHP 是一种广泛使用的开源服务器端脚本语言,它具有丰富的运算符集,这些运算符是编写 PHP 程序的基础。运算符用于执行各种数学、逻辑和比较操作。本篇文章将详细介绍 PHP 中常用的运算符,包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 算术运…

用AI写游戏1——js实现贪吃蛇

使用模型通义千问 提示词&#xff1a; 用js html css 做一个贪吃蛇的动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Snake Game</title><link rel"stylesheet" href"c…

解决com.kingbase8.util.KSQLException: This _connection has been closed.

问题描述 一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend.java.net.SocketTime…

ubuntu24.04安装布置ros

最近换电脑布置机器人环境&#xff0c;下了24.04&#xff0c;但是网上的都不太合适&#xff0c;于是自己试着布置好了&#xff0c;留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…

什么是中间件中间件有哪些

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…

linux下Maven的安装配置详解

一. maven下载 官网下载后上传到服务器 二. 压缩文件解压安装 tar -zxvf 压缩包.tar.gz -C 目标目录 tar -zxvf apache-maven-3.9.9-bin.tar.gz -C /usr/local三. 更换国内镜像 进入maven文件夹内部 创建依赖仓库 mkdir repository2. 编辑setting.xml 文件 vim conf/…

(1/100)每日小游戏平台系列

每日小游戏平台 项目简介以及地址 准备开发一个一百天小游戏平台&#xff0c;使用Flask构建的简单游戏导航网站&#xff0c;无需登录&#xff0c;让大家在返工的同时也可以愉快的摸鱼玩耍。 每天更新一个小游戏上传&#xff0c;看看能不能坚持一百天。 这些小游戏主要使用前端…

解锁Spring Boot 3.1 + JDK 17:分布式系统的变革力量

分布式系统发展的现状与挑战 在当今数字化时代&#xff0c;分布式系统已成为互联网技术领域的核心支撑。从电商平台的海量交易处理&#xff0c;到社交网络的实时互动&#xff0c;再到金融领域的安全交易保障&#xff0c;分布式系统无处不在&#xff0c;它如同无形的纽带&#…

Qt:Qt Creator项目创建

目录 认识Qt Creator Qt Creator概览 使用Qt Creator新建项目 选择项目模板 选择项目路径 选择构建系统 填写类信息设置界面 选择语言和翻译文件 选择Qt套件 选择版本控制系统 最终效果 认识Qt Creator Qt Creator概览 从开始菜单或者快捷方式打开Qt Creator集成开…

Vue笔记(六)

一、路由设计配置--一级路由配置 在路由文件&#xff08;一般是 router/index.js &#xff09;里定义路由对象数组&#xff0c;每个对象包含 path &#xff08;路由路径&#xff0c;如 / 代表首页&#xff09;、 name &#xff08;路由名称&#xff0c;方便代码引用&#xff09…

深度学习-神经机器翻译模型

以下为你介绍使用Python和深度学习框架Keras&#xff08;基于TensorFlow后端&#xff09;实现一个简单的神经机器翻译模型的详细步骤和代码示例&#xff0c;该示例主要处理英 - 法翻译任务。 1. 安装必要的库 首先&#xff0c;确保你已经安装了以下库&#xff1a; pip insta…

webpack【初体验】使用 webpack 打包一个程序

打包前 共 3 个文件 dist\index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Webpack 示例&…

Spring Boot接入Deep Seek的API

1&#xff0c;首先进入deepseek的官网&#xff1a;DeepSeek | 深度求索&#xff0c;单击右上角的API开放平台。 2&#xff0c;单击API keys&#xff0c;创建一个API&#xff0c;创建完成务必复制&#xff01;&#xff01;不然关掉之后会看不看api key&#xff01;&#xff01;&…

02.07 TCP服务器与客户端的搭建

一.思维导图 二.使用动态协议包实现服务器与客户端 1. 协议包的结构定义 首先&#xff0c;是协议包的结构定义。在两段代码中&#xff0c;pack_t结构体都被用来表示协议包&#xff1a; typedef struct Pack {int size; // 记录整个协议包的实际大小enum Type type; …

Java 读取 PDF 模板文档并替换内容重新生成 PDF

朋友们&#xff01;在实际开发里&#xff0c;经常会遇到需要根据 PDF 模板文档生成特定 PDF 的需求&#xff0c;比如合同、证书等。咱们可以借助 iText 库来实现读取 PDF 模板文档、替换指定内容&#xff0c;最后重新生成新 PDF 的功能。下面我就详细给大家讲讲具体怎么做。 1.…

动手写ORM框架 - GeeORM第一天 database/sql 基础

文章目录 1 初识 SQLite2 database/sql 标准库3 实现一个简单的 log 库4 核心结构 Session本文是7天用Go从零实现ORM框架GeeORM的第一篇。介绍了 SQLite 的基础操作(连接数据库,创建表、增删记录等)。使用 Go 语言标准库 database/sql 连接并操作 SQLite 数据库,并简单封装…

DeepSeek和ChatGPT的对比

最近DeepSeek大放异彩&#xff0c;两者之间有什么差异呢&#xff1f;根据了解到的信息&#xff0c;简单做了一个对比。 DeepSeek 和 ChatGPT 是两种不同的自然语言处理&#xff08;NLP&#xff09;模型架构&#xff0c;尽管它们都基于 Transformer 架构&#xff0c;但在设计目标…

如何在 Java 应用中实现数据库的主从复制(读写分离)?请简要描述架构和关键代码实现?

在Java应用中实现数据库主从复制&#xff08;读写分离&#xff09; 一、架构描述 &#xff08;一&#xff09;整体架构 主库&#xff08;Master&#xff09; 负责处理所有的写操作&#xff08;INSERT、UPDATE、DELETE等&#xff09;。它是数据的源头&#xff0c;所有的数据变…

笔灵ai写作技术浅析(六):智能改写与续写

笔灵AI写作中的智能改写和续写技术是其核心功能之一,旨在帮助用户生成高质量、多样化的文本内容。 一、智能改写技术 1. 基本原理 智能改写的目标是在保持原文语义不变的前提下,对文本进行重新表述,生成语法正确、语义连贯且风格多样的新文本。其核心思想是通过语义理解和…

Rust语言的计算机基础

Rust语言的计算机基础 引言 在当今计算机科学的广阔领域中&#xff0c;编程语言是技术发展的基础。不同的编程语言应运而生&#xff0c;各自具有不同的特性和应用场景。Rust语言作为一种新兴的系统编程语言&#xff0c;凭借其卓越的性能和安全性&#xff0c;逐渐受到开发者的…