搜索
首页web前端js教程与VUE组件合作的初学者指南

A Beginner’s Guide to Working With Components in Vue

Vue.js 的组件化架构让构建用户界面变得高效便捷。它允许你将应用分解成更小、可复用的组件,然后用这些组件构建更复杂的结构。

本指南将为您提供 Vue 组件的高级入门介绍。我们将探讨如何创建组件,如何在组件之间传递数据(通过 props 和事件总线),以及如何使用 Vue 的 <slot></slot> 元素在组件内渲染附加内容。每个示例都将附带可运行的 CodePen 演示。

关键要点

  • Vue 的组件化架构有助于将 UI 分解成可重用、易于管理的片段,从而增强代码的可重用性和组织性。
  • 组件可以使用 Vue.component 全局创建,也可以在单文件组件中局部创建,对于复杂的项目来说,后者由于封装了模板、脚本和样式,更适合使用。
  • 可以使用 props 将数据传递给子组件,从而提供一种清晰且结构化的方式来管理和传递组件树中的数据。
  • 可以使用事件总线有效地管理从子组件到父组件的通信,允许子组件将数据发送回组件层次结构。
  • Vue 的 <slot></slot> 元素有助于在组件内嵌套内容,使其更灵活,并能够接收来自父组件的内容,这些内容可以用回退内容覆盖。

如何在 Vue 中创建组件

组件本质上是具有名称的可重用 Vue 实例。在 Vue 应用中创建组件的方法有很多种。例如,在小型到中型项目中,您可以使用 Vue.component 方法注册全局组件,如下所示:

Vue.component('my-counter', {
  data() {
    return {
      count: 0
    }
  },
  template: `<div>{{ count }}</div>`
})

new Vue({ el: '#app' })

组件的名称是 my-counter。它可以这样使用:

<div>
  <my-counter></my-counter>
</div>

命名组件时,您可以选择使用 kebab-case(my-custom-component)或 Pascal-case(MyCustomComponent)。在模板中引用组件时,可以使用任何一种变体,但在直接在 DOM 中引用组件时(如上例所示),只有 kebab-case 标签名称有效。

您可能还会注意到,在上例中,data 是一个返回对象字面量的函数(而不是对象字面量本身)。这样做的目的是为了让组件的每个实例都拥有自己的数据对象,而不必与所有其他实例共享一个全局实例。

定义组件模板的方法有几种。上面我们使用了模板字面量,但我们也可以使用带有 text/x-template 的标记或 DOM 内模板。您可以在这里阅读有关定义模板的不同方法的更多信息。

单文件组件

在更复杂的项目中,全局组件很快就会变得难以管理。在这种情况下,将应用程序设计为使用单文件组件是有意义的。顾名思义,这些是具有 .vue 扩展名的单个文件,其中包含 <template></template>

而 MyCounter 组件可能如下所示:
Vue.component('my-counter', {
  data() {
    return {
      count: 0
    }
  },
  template: `<div>{{ count }}</div>`
})

new Vue({ el: '#app' })

如您所见,使用单文件组件时,可以直接在需要它们的组件中导入和使用它们。

Vue.component()在本指南中,我将使用

方法注册组件来展示所有示例。

使用单文件组件通常涉及构建步骤(例如,使用 Vue CLI)。如果您想了解更多信息,请查看本 Vue 系列中的“Vue CLI 入门指南”。

通过 Props 向组件传递数据

Props 使我们能够将数据从父组件传递到子组件。这使得我们的组件可以分成更小的块来处理特定的功能。例如,如果我们有一个博客组件,我们可能想要显示诸如作者详细信息、帖子详细信息(标题、正文和图像)和评论等信息。

我们可以将这些分解成子组件,以便每个组件处理特定的数据,使组件树看起来像这样:
<div>
  <my-counter></my-counter>
</div>

如果您仍然不相信使用组件的好处,请花点时间意识到这种组合方式有多么有用。如果您将来要重新访问此代码,您会立即清楚页面是如何构建的,以及您应该在哪里(即在哪个组件中)查找哪个功能。这种声明式的方式来组合界面也使得不熟悉代码库的人更容易快速上手并提高效率。

由于所有数据都将从父组件传递,它可能如下所示:
<template>
  <div>{{ count }}</div>
</template>

<🎜>

author-detail在上例组件中,我们定义了作者详细信息和帖子信息。接下来,我们必须创建子组件。让我们将子组件命名为

。因此,我们的 HTML 模板将如下所示:
<blogpost>
  <authordetails></authordetails>
  <postdetails></postdetails>
  <comments></comments>
</blogpost>

owner我们将作者对象作为名为 owner 的 props 传递给子组件。这里需要注意区别。在子组件中,author 是我们从父组件接收数据的 props 名称。我们想要接收的数据称为

,我们在父组件中定义了它。

author-detail要访问此数据,我们需要在

组件中声明 props:
new Vue({
  el: '#app',
  data() {
    return {
      author: {
        name: 'John Doe',
        email: 'jdoe@example.com'
      }
    }
  }
})

我们还可以在传递 props 时启用验证,以确保传递正确的数据。这类似于 React 中的 PropTypes。要在上面的示例中启用验证,请将我们的组件更改为如下所示:
<div>
  <author-detail :owner="author"></author-detail>
</div>

如果我们传递错误的 prop 类型,您将在控制台中看到类似于我下面显示的错误:
Vue.component('author-detail', {
  template: `
    <div>
      <h2 id="owner-name">{{ owner.name }}</h2>
      <p>{{ owner.email }}</p>
    </div>
  `,
  props: ['owner']
})

Vue 文档中有一份官方指南,您可以使用它来了解 prop 验证。

通过事件总线从子组件到父组件的通信

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境