Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

Vue 组件

组件 在 Vue 中,使我们可以将网页分解成更容易处理的小部分。

我们可以独立于网页的其余部分使用 Vue 组件,它有自己的内容和逻辑。

网页通常由多个 Vue 组件组成。

什么是组件?

组件是可重用且自包含的代码片段,它封装了用户界面的特定部分,因此我们可以创建可扩展且易于维护的 Vue 应用程序。

我们可以自己创建 Vue 组件,也可以使用稍后会学习的内置组件,例如 <Teleport><KeepAlive>。在这里,我们将重点介绍我们自己创建的组件。


创建组件

Vue 中的组件是一个非常强大的工具,因为它使我们的网页更具可扩展性,也让大型项目更容易处理。

让我们创建一个组件并将其添加到我们的项目中。

  1. src 文件夹中创建一个名为 components 的新文件夹。

  2. components 文件夹中,创建一个名为 FoodItem.vue 的新文件。通常用 PascalCase 命名约定命名组件,不带空格,所有新单词以大写字母开头,第一个单词也是如此。

  3. 确保 FoodItem.vue 文件看起来像这样

FoodItem.vue 组件中的代码

<template>
  <div>
    <h2>{{ name }}</h2>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: 'Apples',
      message: 'I like apples'
    }
  }
};
</script>

<style></style>

如上面的例子所示,组件也包含 <template><script><style> 标签,就像我们的主 App.vue 文件一样。


添加组件

请注意,上面的例子中 <script> 标签以 export default 开头。这意味着包含数据属性的对象可以在另一个文件中接收或导入。我们将使用它通过 main.js 文件将 FoodItem.vue 组件导入到我们现有的项目中。

首先,将您原始 main.js 文件中的最后一行重写为两行

main.js:

import { createApp } from 'vue'

import App from './App.vue'

const app = createApp(App)
app.mount('#app')

现在,通过在您的 main.js 文件中插入第 4 行和第 7 行,添加 FoodItem.vue 组件

main.js:

import { createApp } from 'vue'

import App from './App.vue'
import FoodItem from './components/FoodItem.vue'

const app = createApp(App)
app.component('food-item', FoodItem)
app.mount('#app')

在第 7 行,添加了组件,以便我们可以在 App.vue 文件中 <template> 标签内将其用作自定义标签 <food-item/>,如下所示

App.vue:

<template>
  <h1>Food</h1>
  <food-item/>
  <food-item/>
  <food-item/>
</template>

<script></script>

<style></style>

最后,让我们在 App.vue 文件的 <style> 标签中添加一些样式。确保开发服务器正在运行,然后查看结果。

示例

App.vue:

<template>
  <h1>Food</h1>
  <food-item/>
  <food-item/>
  <food-item/>
</template>

<script></script>

<style>
  #app > div {
    border: dashed black 1px;
    display: inline-block;
    margin: 10px;
    padding: 10px;
    background-color: lightgreen;
  }
</style>
运行示例 »

开发模式: 在使用 Vue 项目时,通过在终端中运行以下代码行,始终将项目置于开发模式非常有用

npm run dev

独立组件

在使用 Vue 中的组件时,一个非常有用且强大的特性是我们可以使它们独立运行,而无需像使用纯 JavaScript 时那样用唯一的 ID 标记元素。Vue 会自动处理每个组件的独立性。

让我们在点击 <div> 元素时进行计数。

在我们的主应用程序文件 App.vue 中添加的唯一内容是在 CSS 中,以使光标在悬停时看起来像一只指向的手,暗示存在某种点击功能。

添加到 App.vue<style> 标签的 CSS 代码

#app > div:hover {
  cursor: pointer;
}

在我们的组件文件 FoodItem.vue 中,我们必须添加一个数据属性 count,一个指向 <div> 元素的点击监听器,一个在点击发生时运行以递增计数器的函数,以及文本插值 {{}} 来显示计数。

示例

FoodItem.vue:

<template>
  <div v-on:click="countClicks">
    <h2>{{ name }}</h2>  
    <p>{{ message }}</p>
    <p id="red">You have clicked me {{ clicks }} times.</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: 'Apples',
      message: 'I like apples',
      clicks: 0
    }
  },
  methods: {
    countClicks() {
      this.clicks++;
    }
  }
}
</script>

<style>
  #red {
    font-weight: bold ;
    color: rgb(144, 12, 12);
  }
</style>
运行示例 »

我们无需定义唯一的 ID 或执行任何额外的工作,Vue 会自动处理每个 <div> 元素的独立计数。

但是除了计数器值不同之外,<div> 元素的内容仍然相同。在下一页我们将学习更多关于组件的知识,以便我们可以以更合理的方式使用组件。例如,在每个 <div> 元素中显示不同种类的食物会更有意义。


Vue 练习

通过练习测试自己

练习

下面在 main.js 中的代码将一个组件添加到我们的 Vue 项目中

app.component('fish-type', FishType)

我们如何将此组件添加到 App.vue 中?

<template>
  <h1>Fish</h1>
  
</template>

开始练习



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.