深入解析 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,一经查实,立即删除!

相关文章

用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…

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…

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; …

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

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

3.如何标注数据集

软件安装&#xff1a; Labelme&#xff0c;打开链接之后跳转如下&#xff1a; 这里往下翻&#xff0c;如下&#xff1a; 选择上图圈起来的exe进行下载就可以了&#xff0c;下载完成之后就可以双击直接打开了。如果通过github下载很慢的话可以直接选择通过网盘分享的文件&…

【分布式理论7】分布式调用之:服务间的(RPC)远程调用

文章目录 一、RPC 调用过程二、RPC 动态代理&#xff1a;屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC序列化与协议编码1. RPC 序列化2. RPC 协议编码2.1. 协议编码的作用2.2. RPC 协议消息组成 四、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC…

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现

SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现 目录 SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来Matlab实现预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-TCN麻雀算法优化时间卷积神经网络时间序列预测未来&#xff08;优…

智慧停车场解决方案(文末联系,领取整套资料,可做论文)

一、方案概述 本智慧停车场解决方案旨在通过硬件设备与软件系统的深度整合&#xff0c;实现停车场的智能化管理与服务&#xff0c;提升车主的停车体验&#xff0c;优化停车场运营效率。 二、硬件架构 硬件设备说明&#xff1a; 车牌识别摄像机&#xff1a;安装在停车场入口和…

DeepSeek开源多模态大模型Janus-Pro部署

DeepSeek多模态大模型部署 请自行根据电脑配置选择合适环境配置安装conda以及gitJanus 项目以及依赖安装运行cpu运行gpu运行 进入ui界面 请自行根据电脑配置选择合适 本人家用电脑为1060&#xff0c;因此部署的7B模型。配置高的可以考虑更大参数的模型。 环境配置 安装conda…

C#常用集合优缺点对比

先上结论&#xff1a; 在C#中&#xff0c;链表、一维数组、字典、List<T>和ArrayList是常见的数据集合类型&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的比较&#xff1a; 1. 一维数组 (T[]) 优点&#xff1a; 性能高&#xff1a;数组在内存中…

python-leetcode-删除有序数组中的重复项 II

80. 删除有序数组中的重复项 II - 力扣&#xff08;LeetCode&#xff09; class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 2:return len(nums)j 2 # 允许最多两个相同的元素for i in range(2, len(nums)):if nums[i] ! nums[j - 2…

如何启用 Apache Rewrite 重写模块 ?

Apache 的 mod_rewrite 是最强大的 URL 操作模块之一。使用 mod_rewrite&#xff0c;您可以重定向和重写 url&#xff0c;这对于在您的网站上实现 seo 友好的 URL 结构特别有用。在本文中&#xff0c;我们将引导您了解如何在基于 Debian 和基于 RHEL 的系统上在 Apache 中启用 …