Vue 3 组件基础与模板语法详解


title: Vue 3 组件基础与模板语法详解
date: 2024/5/24 16:31:13
updated: 2024/5/24 16:31:13
categories:

  • 前端开发

tags:

  • Vue3特性
  • CompositionAPI
  • Teleport
  • Suspense
  • Vue3安装
  • 组件基础
  • 模板语法

在这里插入图片描述

Vue 3 简介

1. Vue 3 的新特性

Vue 3引入了许多新的特性,以提高框架的性能和可维护性。下面是一些主要的新特性:

  • Composition API:这是Vue 3中最大的变化之一,它提供了一种更灵活的方式来组织和重用组件的逻辑。
  • Teleport:这是一个新的API,允许我们在组件树中将元素“传送”到其他位置。
  • Suspense:这是一个新的API,允许我们在组件树中等待异步数据加载。
  • Fragment:这是一个新的内置组件,允许我们在组件中渲染多个根节点。
  • v-memo:这是一个新的指令,允许我们在渲染过程中缓存组件的输出。
  • 更快的渲染速度:Vue 3中的渲染器已经重写,提供了更快的渲染速度。

2. 安装与配置

要使用Vue 3,我们需要先安装它。可以使用npm或yarn来安装Vue 3:

npm install vue@next
# or
yarn add vue@next

安装完成后,我们可以在JavaScript中使用Vue 3:

import { createApp } from 'vue'

const App = {
data() {
return {
message: 'Hello Vue 3!'
}
}
}

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

或者在HTML中使用Vue 3:


<script src="https://unpkg.com/vue@next"></script>

<div id="app">
  {{ message }}
</div>

<script>
  const {createApp} = Vue

  const App = {
    data() {
      return {
        message: 'Hello Vue 3!'
      }
    }
  }

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

Vue 3 组件基础

1. 组件的概念

在Vue中,组件是构成应用程序的基本单位。组件是独立的、可复用的Vue实例,具有自己的属性、事件、生命周期钩子等。组件可以看作是页面的最小单位,通过组合这些组件,我们可以构建出复杂的页面。

2. 组件的创建与注册

创建Vue组件的方式有多种,可以通过Vue的构造函数,也可以使用defineComponent函数。

// 使用Vue构造函数
const MyComponent = new Vue({
data() {
return {
message: 'Hello'
}
},
template: '
<div>{{ message }}</div>'
})

// 使用defineComponent
const MyComponent = defineComponent({
data() {
return {
message: 'Hello'
}
},
template: '
<div>{{ message }}</div>'
})

注册组件可以通过app.component方法,也可以在组件内部使用components选项。

// 全局注册
const app = createApp({})
app.component('my-component', MyComponent)

// 局部注册
const MyApp = createApp({})
MyApp.component('my-component', MyComponent)

3. 组件的数据传递

组件之间的数据传递主要通过propsemit实现。

Props:用于父组件向子组件传递数据。子组件可以通过defineComponentprops选项声明接收的数据。

const MyComponent = defineComponent({
props: {
message: {
type: String,
required: true
}
},
template: '
<div>{{ message }}</div>'
})

Emits:用于子组件向父组件传递数据。子组件可以通过emit方法触发事件,并传递数据。

const MyComponent = defineComponent({
methods: {
sendMessage() {
this.$emit('message', 'Hello from child')
}
},
template: `
<button @click="sendMessage">Send</button>`
})

4. Props和Emits

  • Props是父组件传递给子组件的数据。
  • Emits是子组件发送给父组件的事件。

5. Slots:插槽是Vue提供的一种机制,允许组件的内容被分发到组件的模板中。

// 父组件
<template>
  <MyComponent>
    <template v-slot:default>Default Slot Content</template>
    <template v-slot:other>Other Slot Content</template>
  </MyComponent>
</template>

// 子组件
<template>
  <div>
    <slot name="default"></slot>
    <slot name="other"></slot>
  </div>
</template>

6. 组件的生命周期

Vue组件的生命周期包括创建、挂载、更新和销毁四个阶段。每个阶段都有对应的生命周期钩子,可以在这个阶段执行特定的操作。

defineComponent({
created() {
// 组件创建完成后调用
},
mounted() {
// 组件挂载到DOM后调用
},
updated() {
// 组件更新后调用
},
destroyed() {
// 组件销毁后调用
}
})

7. 组件的样式

Vue组件的样式可以通过几种方式来定义:

  • 在组件的<style>标签中定义样式。
  • 使用scoped属性来限制样式的作用域,使其只应用于当前组件。
  • 通过外部CSS文件引入样式。

<style scoped>
  .my-class {
    color: red;
  }
</style>

Vue 3 模板语法

1. 插值表达式 (Interpolation)

在Vue 3中,使用{{ }}包围的表达式会进行数据绑定。例如:

<p>Message: {{ message }}</p>

message的值改变时,页面会自动更新显示。

2. 指令基础

Vue的指令是HTML元素上可以附加的行为。常见的指令有v-bind,v-model, 和v-on

  • v-bind:用于数据绑定,等同于v-bind:attr="expression",如v-bind:class="{ active: isActive }".
  • v-model:用于双向数据绑定,主要用于表单输入,如<input v-model="username">.
  • v-on:用于监听事件,如<button v-on:click="doSomething">Click me</button>.

3. v-bind, v-model, v-on

  • v-bindv-bind:key用于绑定列表元素的唯一标识,v-bind:class用于动态绑定CSS类。
  • v-model:用于数据双向绑定,v-model:value绑定数据,v-model:expression用于计算属性。
  • v-onv-on:click用于绑定点击事件,v-on:input用于监听输入事件。

4. v-for

v-for指令用于渲染数组或对象的每个元素,如:


<ul>
  <li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>

5. v-if 与 v-show

  • v-if:条件渲染,当表达式为真时元素会被渲染,为假时会被移除。
  • v-show:条件渲染,无论条件是否满足,元素都会被添加到DOM中,只是通过display属性的noneblock来切换可见性。

6. 计算属性与侦听器

  • 计算属性data对象中的函数,当依赖的propsdata属性改变时,计算属性会自动重新计算。
  • 侦听器watch对象,监听数据的变化,当数据变化时执行回调。
data() {
return {
count: 0
}
},
computed: {
formattedCount() {
return this.count.toLocaleString();
}
},
watch: {
count(newCount) {
console.log('Count has changed:', newCount);
}
}

7. 条件渲染与列表渲染

  • 条件渲染:v-ifv-show用于根据条件展示或隐藏元素。
  • 列表渲染:v-for遍历数组或对象,可以嵌套使用,方便生成动态列表。

8. 事件处理

  • 使用v-on绑定事件,如<button v-on:click="doSomething">Click</button>
  • 可以使用.sync修饰符同步原生事件,如<input v-model.sync="value">

9. 表单输入绑定

  • v-model用于表单输入的双向绑定,如<input type="text" v-model="username">
  • v-model.numberv-model.integer等修饰符用于类型验证。

高级组件开发

1. 动态组件

动态组件允许你在运行时切换组件。要使用动态组件,你可以使用const component = new VueComponent()
创建一个组件实例,然后使用this.$refs.someRef.component = component来替换它。

// 定义一个动态组件
const DynamicComponent = {
template: '
<div>Dynamic Component</div>'
}

// 在组件中动态替换组件
new Vue({
el: '#app',
components: {
'dynamic-component': DynamicComponent
},
methods: {
changeComponent() {
this.$refs.dynamicComponent.component = DynamicComponent
}
}
})

2. 异步组件

异步组件是为了减少初始加载时间而设计的。你可以通过返回一个Promise来定义一个异步组件:

const AsyncComponent = () => ({
// 这里可以使用Promise
component: import('./MyComponent'),
loading: LoadingComponent, // 加载中的组件
error: ErrorComponent // 加载错误的组件
})

在组件中使用异步组件:

components: {
'async-component': AsyncComponent
}

3. 递归组件

递归组件是指那些可以调用自身的组件。为了防止无限递归,Vue提供了一个max属性来限制递归深度:

const RecursiveComponent = {
template: `
<div>
  {{ message }}
  <recursive-component :max="max - 1" :message="message"></recursive-component>
</div>
`,
props: {
max: {
type: Number,
default: 5
},
message: String
}
}

4. 函数式组件

函数式组件不接受props,也不维护任何实例状态。它们只是返回一个渲染函数:

const FunctionalComponent = () => {
// 函数式组件的逻辑
return
<div>Functional Component</div>
}

在组件中使用函数式组件:

components: {
'functional-component': FunctionalComponent
}

5. 自定义指令

自定义指令允许你定义自己的HTML attribute,这些指令可以应用于任何元素,并且可以绑定不同的行为。

Vue.directive('my-directive', (el, binding, vnode) => {
// 指令的逻辑
})

在组件中使用自定义指令:


<div v-my-directive="someValue"></div>

构建一个简单的博客应用

1. 环境准备

  • 使用 Vue CLI 创建一个新的 Vue.js 项目。
  • 安装所需的依赖,如vue-router用于页面路由,vuex用于状态管理,axios用于 HTTP 请求等。

2. 项目结构

simple-blog/
|-- public/
|-- src/
|   |-- assets/
|   |-- components/
|   |   |-- BlogPost.vue
|   |   |-- Navigation.vue
|   |-- views/
|   |   |-- Home.vue
|   |   |-- PostList.vue
|   |-- App.vue
|   |-- main.js
|-- package.json

3. 实现逻辑

  • Navigation.vue:实现顶部导航栏。
  • Home.vue:实现首页布局。
  • PostList.vue:实现博客文章列表。
  • BlogPost.vue:实现单篇博客文章的展示。
  • main.js:入口文件,创建 Vue 实例,配置路由等。

4. 示例代码

// main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'

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

<!-- App.vue -->
<template>
  <div id="app">
    <Navigation/>
    <router-view/>
  </div>
</template>

<script>
  import Navigation from './components/Navigation.vue'

  export default {
    components: {
      Navigation
    }
  }
</script>
<!-- Navigation.vue -->
<template>
  <nav>
    <!-- 导航链接 -->
  </nav>
</template>
<!-- PostList.vue -->
<template>
  <div>
    <h1>博客文章列表</h1>
    <ul>
      <li v-for="post in posts" :key="post.id">
        {{ post.title }}
      </li>
    </ul>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        posts: [] // 从后端 API 获取数据
      }
    },
    created() {
      // 调用 API 获取文章列表
    }
  }
</script>
<!-- BlogPost.vue -->
<template>
  <div>
    <h1>{{ post.title }}</h1>
    <p>{{ post.content }}</p>
  </div>
</template>

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

5. 运行项目

使用npm run serve命令启动项目,然后访问http://localhost:8080查看效果。

这是一个基本的博客应用,可以根据实际需求继续扩展和优化。

附录

Vue 3 资源推荐

  1. 官方文档:Vue 3 官方文档提供了详尽的指南和 API 参考,是学习 Vue 3 的最佳起点。
  2. Vue Mastery:Vue Mastery提供了许多免费的 Vue 3 教程视频,适合初学者和进阶开发者。
  3. Vue School:Vue School提供了付费的 Vue 3 课程,涵盖从基础到高级的所有内容。
  4. GitHub 仓库:Vue 3 的 GitHub 仓库是查看源代码和贡献代码的好地方。
  5. 社区论坛:Vue.js 论坛是提问和分享经验的好地方。

常见问题解答

  1. 如何升级到 Vue 3?

    • 首先,确保你的项目依赖支持 Vue 3。然后,更新package.json中的 Vue 依赖版本到 3.x。最后,检查并更新你的代码以适应 Vue 3
      的新特性和变化。
  2. Vue 3 和 Vue 2 有什么主要区别?

    • Vue 3 引入了 Composition API,提供了更好的逻辑复用和代码组织方式。此外,Vue 3 在性能上有所提升,包括更快的虚拟 DOM
      和更小的包体积。
  3. 如何在 Vue 3 中使用 Vuex?

    • Vuex 4 是专为 Vue 3 设计的版本。你可以通过安装vuex@next来使用 Vuex 4,并在你的 Vue 3 项目中配置和使用它。
  4. Vue 3 支持 TypeScript 吗?

    • 是的,Vue 3 对 TypeScript 提供了更好的支持。你可以使用 TypeScript 来编写 Vue 3 组件,并利用 Vue 3 的类型声明来提高开发效率。
  5. 如何处理 Vue 3 中的响应式数据?

    • Vue 3 使用refreactive函数来创建响应式数据。ref用于创建单个响应式数据,而reactive用于创建响应式对象。
  6. Vue 3 中的 Teleport 是什么?

    • Teleport 是 Vue 3 中的一个新特性,允许你将组件的内容渲染到 DOM 树的另一个位置,这在创建模态框或弹出菜单时非常有用。
  7. Vue 3 中的 Fragment 是什么?

    • 在 Vue 3 中,组件可以返回多个根节点,这被称为 Fragments。这允许你编写更简洁的模板,而不需要额外的包装元素。
  8. 如何调试 Vue 3 应用程序?

    • 你可以使用浏览器的开发者工具来调试 Vue 3 应用程序。Vue 3 支持 Vue 2 的开发者工具扩展,你可以通过它来检查组件状态和追踪事件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路由引入实验(华为)

思科设备参考&#xff1a;路由引入实验&#xff08;思科&#xff09; 技术简介 路由引入技术在网络通信中起着重要的作用&#xff0c;能够实现不同路由协议之间的路由传递&#xff0c;并在路由引入时部署路由控制&#xff0c;实现路径或策略的控制 实验目的 不同的路由协议之…

【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有的资料&#x…

yolov8seg 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

之前写过yolov8seg部署&#xff0c;但在实际项目中没有真正的用&#xff0c;最近在项目尝试使用yolov8seg&#xff0c;把之前的yolov8目标检测的优化给同步到yolov8seg中。 特别说明&#xff1a;如有侵权告知删除&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在git…

一套车间生产管理和调度执行MES系统源码,采用springboot + vue-element+uniapp+mysql技术开发,适合二次开发项目使用。

MES系统源码&#xff0c;车间生产管理系统源码&#xff0c;商业源码&#xff0c;适合上项目 MES系统是制造企业中用于管理和监控生产过程的关键系统&#xff0c;它的核心功能包括生产调度、数据管理、计划排产管理、库存管理、质量管理、设备管理、采购管理、成本管理、项目看板…

《异常检测——从经典算法到深度学习》28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

TypeScript(持续更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安装nodejs 2&#xff09;安装TypeScript编译器 npm i -g typescript 3.编译ts文件 //注意&#xff1a;需要在ts文件同级目录执行此命令&#xff0c;否则会报找不到…

Go语言(Golang)的开发框架

在Go语言&#xff08;Golang&#xff09;的开发中&#xff0c;有多种开发框架可供选择&#xff0c;它们各自具有不同的特点和优势。以下是一些流行的Go语言开发框架&#xff0c;选择Go语言的开发框架时&#xff0c;需要考虑项目需求、团队熟悉度、社区支持、框架性能和可维护性…

Java时间工具类(Date和LocalDateTime)

Date package com.qiangesoft.utils.date;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具类** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] C…

vue从入门到精通(四):MVVM模型

一,MVVM MVVM&#xff08;Model–view–viewmodel&#xff09;是一种软件架构模式。MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑&#xff08;数据模型&#xff09;的开发分离开来。详见MVVM 二,Vue中的MVVM Vue虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设…

nacos-opera(k8s)安装问题解决

整理一些关于k8s部署nacos出现的一些恶心的问题 网上说其他说的更改数据库连接都未解决。 在用nacos-opera想安装高可用nacos时连接mysql数据库报错: 报错具体项: No DataSource set 具体就是说没找到数据源。 第一个 检查一下nacos连接数据库配置 : 第二个 检查一下数据库…

2024 电工杯高校数学建模竞赛(B题)| 平衡膳食食谱 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;运用负载均衡&#xff0c;多目标规划等强大工具&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&am…

【MySQL数据库】CRUD 增 删 改 查 超详解,有这一篇就够了!

​ ​ &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 目录 ⚗️一.CRUD &#x1f9ea;二.新增&#xff08;Create&#xff09; &#x1f9eb;1.基本操作 &#x1f9ec;2.使用SELECT插入 &#x…

169. Majority Element

文章目录 题目描述(简单难度)解法一解法二 位运算摩尔投票法参考文献 题目描述(简单难度) 给一个数组&#xff0c;存在一个数字超过了半数&#xff0c;找出这个数。 解法一 这种计数问题&#xff0c;直接就会想到 HashMap&#xff0c;遍历过程中统计每个数字出现的个数即可。…

Python入门全系列教程(更新中……)

最近辞职了&#xff0c;有点时间&#xff0c;打算写一套Python入门的全系列教程&#xff0c;需要的人欢迎关注蹲守&#xff01;&#xff01;&#xff01; 【Python基础篇】&#xff1a;入门基础知识—轻松踏上编程巅峰&#xff01;" 【Python基础篇】—基本语句详解 【Py…

jenkins插件之xunit

分析测试工具执行的结果&#xff0c;并图形化&#xff0c;比如phpunit&#xff0c;phpstan,可分析junit格式的结果 安装jenkins插件 搜索xunit并安装 项目配置 配置 - Build Steps 您的项目 - 配置 - Build Steps, 新增 Run with timeout 超时时间根据实际情况配置 Build…

unidbg入门笔记

一、unidbg 介绍 unidbg 是凯神 在 2019 年初开源的一个轻量级模拟器&#xff0c;一个基于Java的跨平台解密引擎&#xff0c;专门用于动态分析和逆向工程应用程序。它可以模拟不同CPU架构、操作系统和指令集&#xff0c;从而使用户能够在一个统一的环境中分析各种不同类型的二…

Mac下QT开发环境搭建详细教程

QT Qt是一个跨平台的C应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序&#xff0c;同时也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是设计成通用、可移植和高效的&#xff0c;它广泛应用于全球的企业和开发者社区中…

Codigger编码场景介绍(二):驾驶舱场景(Cockpit)

Codigger&#xff0c;一个专为开发人员设计的工具&#xff0c;致力于为不同的开发场景提供最佳的切换体验。Codigger囊括了多种场景&#xff0c;如传统场景、调试场景、设计器场景、驾驶舱场景以及纯净场景等。在上一篇文章中&#xff0c;我们介绍了传统场景模式&#xff0c;今…

宠物空气净化器:过敏星人的终极武器,让猫毛无处藏身~

猫毛过敏者虽畏惧猫毛&#xff0c;但对猫的热爱让他们选择继续养猫。过敏反应通常由猫的皮屑、唾液和尿液中的蛋白质引发&#xff0c;这些颗粒在空气中传播&#xff0c;导致打喷嚏、咳嗽和皮肤红疹等症状。宠物空气净化器&#xff0c;专为去除猫毛、异味和消毒灭菌设计&#xf…

【Vue3】env环境变量的配置和使用(区分cli和vite)

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、env文件二、vue3cli加载env1..env配置2..dev配置&#xff08;其他环境参考&#xff09;3.package.json文件4.使用 三、vue3vite加载e…