Vue.js组件开发指南

news2024/11/19 17:24:00

Vue.js组件开发指南

Vue.js 是一个渐进式的 JavaScript 框架,用于构建用户界面。它的核心是基于组件的开发模式。通过将页面分解为多个独立的、可复用的组件,开发者能够更轻松地构建复杂的应用。本文将深入探讨 Vue.js 组件开发的基础知识,并通过代码示例展示如何开发和使用组件。
在这里插入图片描述

1. 组件的基本概念

在 Vue.js 中,组件是独立的、可复用的 Vue 实例。每个组件包含自己的逻辑、模板、样式,并且可以通过 props 和事件与其他组件进行交互。组件可以像HTML标签一样使用,从而使得开发者能够通过模块化的方式构建页面。

1.1 组件的基本结构

Vue.js 组件的基本结构通常包括三部分:

  • template: 定义了组件的HTML结构。
  • script: 定义了组件的逻辑,如数据、方法和生命周期钩子。
  • style: 定义了组件的样式,通常是局部作用域的样式。
<template>
  <div class="my-component">
    <h1>{{ title }}</h1>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  name: 'MyComponent',
  data() {
    return {
      title: 'Hello Vue!',
      message: 'This is a basic Vue component'
    }
  }
}
</script>

<style scoped>
.my-component {
  text-align: center;
}
</style>

1.2 注册组件

在 Vue.js 中,组件可以通过两种方式进行注册:

  • 局部注册:仅在某个父组件中使用子组件。
  • 全局注册:在整个应用程序中都能使用该组件。
局部注册

局部注册意味着组件只能在声明它的父组件中使用。注册方式如下:

<template>
  <div>
    <my-component></my-component>
  </div>
</template>

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

export default {
  components: {
    MyComponent
  }
}
</script>
全局注册

全局注册意味着组件在应用的任何地方都可以使用。通常在应用的入口文件(如 main.js)中注册:

import Vue from 'vue';
import MyComponent from './components/MyComponent.vue';

Vue.component('my-component', MyComponent);

new Vue({
  render: h => h(App),
}).$mount('#app');

在这里插入图片描述

2. 组件之间的通信

Vue.js 提供了多种方式来实现组件之间的通信。最常用的方式是通过 propsevents

2.1 使用 props 向子组件传递数据

props 是一种将数据从父组件传递到子组件的机制。在子组件中定义 props,然后在父组件中传递数据。

子组件:

<template>
  <div>
    <h1>{{ title }}</h1>
  </div>
</template>

<script>
export default {
  props: {
    title: {
      type: String,
      required: true
    }
  }
}
</script>

父组件:

<template>
  <div>
    <child-component :title="'Hello from Parent'"></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  }
}
</script>

2.2 使用事件向父组件发送消息

当子组件需要与父组件通信时,通常使用事件。Vue.js 提供了 $emit 方法,子组件可以通过它向父组件发送自定义事件,父组件可以通过 v-on 监听该事件。

子组件:

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

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from Child');
    }
  }
}
</script>

父组件:

<template>
  <div>
    <child-component @message="handleMessage"></child-component>
    <p>{{ message }}</p>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: ''
    }
  },
  methods: {
    handleMessage(payload) {
      this.message = payload;
    }
  }
}
</script>

2.3 使用插槽传递内容

Vue 提供了一种机制,允许父组件向子组件传递嵌套内容,这就是 插槽 (Slots)。通过插槽,父组件可以将 HTML 代码块传递给子组件进行渲染。

子组件:

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

父组件:

<template>
  <div>
    <child-component>
      <p>This is passed from the parent component</p>
    </child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  }
}
</script>

Vue 还支持 具名插槽作用域插槽,用于更复杂的内容传递。
在这里插入图片描述

3. 组件生命周期

Vue.js 组件有一系列的生命周期钩子,这些钩子函数可以让开发者在组件的不同阶段执行特定逻辑。

3.1 生命周期钩子

常见的生命周期钩子有:

  • created: 组件实例刚刚创建完成时调用。
  • mounted: 组件被挂载到 DOM 后调用。
  • updated: 组件更新时调用。
  • destroyed: 组件销毁时调用。
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello Vue!'
    }
  },
  created() {
    console.log('Component created');
  },
  mounted() {
    console.log('Component mounted');
  },
  updated() {
    console.log('Component updated');
  },
  destroyed() {
    console.log('Component destroyed');
  }
}
</script>

在这里插入图片描述

4. 组件的复用性和动态组件

4.1 动态组件

Vue 提供了一个 <component> 标签,允许动态切换组件。通过绑定 is 属性,可以根据条件渲染不同的组件。

<template>
  <div>
    <button @click="currentComponent = 'compA'">Load A</button>
    <button @click="currentComponent = 'compB'">Load B</button>
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
import CompA from './CompA.vue';
import CompB from './CompB.vue';

export default {
  data() {
    return {
      currentComponent: 'compA'
    }
  },
  components: {
    compA: CompA,
    compB: CompB
  }
}
</script>

在这里插入图片描述

5. 实践示例:TodoList 组件

接下来,我们将开发一个简单的 TodoList 组件,演示组件开发的整个流程。

TodoItem.vue

<template>
  <li :class="{ completed: todo.completed }">
    <input type="checkbox" v-model="todo.completed" />
    <span>{{ todo.text }}</span>
    <button @click="$emit('remove')">Remove</button>
  </li>
</template>

<script>
export default {
  props: {
    todo: Object
  }
}
</script>

<style scoped>
.completed {
  text-decoration: line-through;
}
</style>

TodoList.vue

<template>
  <div>
    <h1>Todo List</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a todo" />
    <ul>
      <todo-item v-for="(todo, index) in todos" :key="index" :todo="todo" @remove="removeTodo(index)" />
    </ul>
  </div>
</template>

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

export default {
  components: {
    TodoItem
  },
  data() {
    return {
      newTodo: '',
      todos: []
    }
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim()) {
        this.todos.push({ text: this.newTodo, completed: false });
        this.newTodo = '';
      }
    },
    removeTodo(index) {
      this.todos.splice(index, 1);
    }
  }
}
</script>

<style scoped>
ul {
  list-style-type: none;
  padding: 0;
}
</style>

在这里插入图片描述

6. 结论

Vue.js 的组件开发模式为构建复杂的应用提供了良好的结构和复用性。通过组件化开发,可以将复杂的用户界面分解

为易于管理的、独立的模块。在实际项目中,合理的组件划分和数据通信方式是确保项目稳定性和可维护性的关键。
在这里插入图片描述

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

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

相关文章

基于springoot新能源充电系统的设计与实现

新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统新能源充电系统信息管理难度…

国产纯电SUV都在秀,只有Model Y在挨揍

文/王俣祺 导语&#xff1a;如果想知道纯电SUV应该怎么选&#xff0c;一定有人告诉你“无脑选Model Y”&#xff0c;虽说特斯拉确实粉丝多&#xff0c;但这也恰恰证明Model Y一度成为了纯电SUV的标杆。有标杆自然就有挑战者&#xff0c;随着阿维塔07、智己LS6以及乐道L60先后上…

云南省职业院校技能大赛赛项规程(软件测试)

赛项名称&#xff1a;软件测试 英文名称&#xff1a;Software Testing 赛项组别&#xff1a;高等职业教育 赛项编号&#xff1a;GZ034 目录 一、 赛项信息 二、竞赛目标 三、竞赛内容 1、本赛项考查的技术技能和涵盖的职业典型工作任务 2、专业核心能力与职业综合能力…

商标名称注册查询,到底是查询什么!

在商标注册前是需要商标名称注册查询&#xff0c;那这个到底是查询什么&#xff0c;普推知产商标老杨发现&#xff0c;近日国家知产局发布《商标代理委托合同示范文本》征求意见稿&#xff0c;虽然是参考使用不具有强制性&#xff0c;里面对商标名称注册查询描述是申请前商标检…

完成UI界面的绘制

绘制UI 接上文&#xff0c;在Order90Canvas下创建Image子物体&#xff0c;图片资源ui_fish_lv1&#xff0c;设置锚点&#xff08;CountdownPanelImg同理&#xff09;&#xff0c;命名为LvPanelImg,创建Text子物体&#xff0c;边框宽高各50&#xff0c; &#xff0c;重名为LvT…

阻焊层解析:PCB的“保护伞”是什么?

在电子制造行业中&#xff0c;尤其是PCBA贴片加工领域&#xff0c;阻焊层是一个重要的概念。以下是对阻焊层的详细讨论分析&#xff0c;包括其定义、作用以及类型。 阻焊层的定义 阻焊层&#xff0c;顾名思义&#xff0c;是一种用于阻止焊接的材料层。在PCB&#xff08;印刷电…

11.C++程序中的常用函数

我们将程序中反复执行的代码封装到一个代码块中&#xff0c;这个代码块就被称为函数&#xff0c;它类似于数学中的函数&#xff0c;在C程序中&#xff0c;有许多由编译器定义好的函数&#xff0c;供大家使用。下面就简单说一下&#xff0c;C中常用的函数。 1.sizeof sizeof函…

Perceptually Optimized Deep High-Dynamic-RangeImage Tone Mapping

Abstract 我们描述了一种深度高动态范围&#xff08;HDR&#xff09;图像色调映射算子&#xff0c;该算子计算效率高且感知优化。 我们首先将 HDR 图像分解为归一化拉普拉斯金字塔&#xff0c;并使用两个深度神经网络 (DNN) 根据归一化表示估计所需色调映射图像的拉普拉斯金字…

Mybatis缓存机制(图文并茂!)

目录 一级缓存 需求我们在一个测试中通过ID两次查询Monster表中的信息。 二级缓存 案例分许(和上述一样的需求) EhCache第三方缓存 在了解缓存机制之前&#xff0c;我们要先了解什么是缓存&#xff1a; ‌缓存是一种高速存储器&#xff0c;用于暂时存储访问频繁的数据&…

利用大模型改进知识图谱补全的研究

人工智能咨询培训老师叶梓 转载标明出处 尽管现有的基于描述的KGC方法已经利用预训练语言模型来学习实体和关系的文本表示&#xff0c;并取得了一定的成果&#xff0c;但这些方法的性能仍然受限于文本数据的质量和结构的不完整性。 为了克服这些限制&#xff0c;中国科学技术…

PG高可靠模拟

模拟延迟 主库故障&#xff0c;备库尝试切换为主库

9.29 LeetCode 3304、3300、3301

思路&#xff1a; ⭐进行无限次操作&#xff0c;但是 k 的取值小于 500 &#xff0c;所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ &#xff0c;单独处理使其变为 ‘a’ 得到得到操作后的新字符串&#xff0c;和原字符串拼接 class Solution { …

MySQL - 运维篇

一、日志 1. 错误日志 2. 二进制日志 3. 查询日志 记录了所有的增删改查语句以及DDL语句 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 三、分库分表 1. 介绍 2. Mycat概述 3. Mycat入门 4. Mycat配置 5. Mycat分片 6. Mycat管理及监控 四、读写分离 1. 介绍 2. 一…

【ADC】使用运算放大器驱动 SAR 型 ADC 时的线性输入范围

概述 本文学习于TI 高精度实验室课程&#xff0c;总结使用运算放大器驱动 SAR ADC 时的注意事项。具体包括&#xff1a;了解运算放大器共模范围和输出摆幅限制如何影响 SAR ADC 性能&#xff0c;研究运算放大器设计技术以避免共模和输出摆幅限制&#xff0c;讨论轨到轨放大器与…

PCB敷铜敷不了相同网络的线怎么办?

图片上的情况就是今天需要讲的内容&#xff0c;可以看出出来的线头是GND,敷的铜也是GND但是相同网络就是不能连在一起。 解释&#xff1a; 这是因为我们敷铜的时候属性选的是连接相同的net,如图所示&#xff1a; 解决办法&#xff1a; 只需要设置改为相同的Object就可以了&…

[Linux#60][HTTPS] 加密 | 数字指纹 | 详解HTTPS工作方案 | CA认证

目录 一.预备知识 1. 什么是HTTPS&#xff1f; 2. HTTP与HTTPS的区别 3. 什么是加密&#xff1f; 4. 常见的加密方式 4.1 对称加密 4.2 非对称加密 4.3 数据摘要与数据指纹 4.4 数字签名 二. HTTPS的工作方案 1 方案一&#xff1a;对称加密 2 方案二&#xff1a;非…

图像增强论文精读笔记-Deep Retinex Decomposition for Low-Light Enhancement(Retinex-Net)

1. 论文基本信息 论文标题&#xff1a;Deep Retinex Decomposition for Low-Light Enhancement 作者&#xff1a;Chen Wei等 发表时间和期刊&#xff1a;2018&#xff1b;BMVC 论文链接&#xff1a;https://arxiv.org/abs/1808.04560 2. 研究背景和动机 低光照条件下拍摄的…

LLM工程师启航:生成式AI简明教程

编者按&#xff1a; 大模型发展了近两年&#xff0c;Baihai IDP公众号也分享了近百篇LLM各环节的技术洞察&#xff0c;有前沿探讨、有落地实践、有应用经验。但回头来看&#xff0c;我们似乎从来没有认真、从0开始探讨过LLM的基本原理。 最近&#xff0c;一些企业客户和伙伴来询…

【IP限流】⭐️通过切面实现无校验保护接口的防刷逻辑

目录 &#x1f378;前言 &#x1f37b;一、实现方法 &#x1f37a;二、伪代码实现 &#x1f379;三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;上次写了一篇文章记录了最近自己装台式电脑中遇到的问题&#xff0c;以及整体的安装步骤和本地的配置选择&#xff0c…

【JavaEE初阶】网络原理

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 ⽹络互连 IP地址 端口号 协议 协议分层 优势 TCP/IP 五层网络模型 数据在网络通信中的整体流程 封装和分用 封装 分用 ⽹络互连 随着时代的发展&#xff0c;越来越需…