当前位置: 首页 > news >正文

Vue笔记-001-声明式渲染

https://cn.vuejs.org/tutorial/#step-2icon-default.png?t=O83Ahttps://cn.vuejs.org/tutorial/#step-2

Vue 单文件组件 (Single-File Component,缩写为 SFC)

        单文件组件是一种可复用的代码组织形式,它将从属于同一个组件的 HTML、CSS 和 JavaScript 封装在使用 .vue 后缀的文件中。

声明式渲染

        Vue 的核心功能是声明式渲染:通过扩展于标准 HTML 的模板语法,我们可以根据 JavaScript 的状态来描述 HTML 应该是什么样子的。当状态改变时,HTML 会自动更新。

        能在改变时触发更新的状态被称作是响应式的。我们可以使用 Vue 的 reactive() API 来声明响应式状态。由 reactive() 创建的对象都是 JavaScript Proxy,其行为与普通对象一样。

   reactive() 只适用于对象 (包括数组和内置类型,如 Map 和 Set)。而另一个 API ref() 则可以接受任何值类型。ref 会返回一个包裹对象,并在 .value 属性下暴露内部值。

template是一个内容模板,里面是内容的各个小模块。

<template><div><h1>{{ message }}</h1><p>Count is: {{ counter.count }}</p><button @click="increment">Increase Count</button><h1>Make me dynamic!</h1></div>
</template>

script setup是业务逻辑层

<script setup>
import { ref, reactive } from 'vue'// 定义响应式数据
const counter = reactive({count: 0
})const message = ref('Hello, Vue!')// 定义方法
function increment() {counter.count++
}// 初始化时递增一次
console.log(counter.count) // 0
counter.count++
</script>

 style是内容模块的美化层

<style scoped>
/* 添加一些样式,使页面更美观 */
div {text-align: center;margin-top: 50px;
}button {padding: 10px 20px;font-size: 16px;
}
</style>

示例

<!-- CounterComponent.vue -->
<template><div class="counter-container"><h1 class="message">{{ message }}</h1><p class="count-display">Count is: {{ counter.count }}</p><button class="increment-button" @click="increment">Increase Count</button><h1 class="dynamic-header">Make me dynamic!</h1></div>
</template><script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'// 定义计数器接口
interface Counter {count: number
}// 定义响应式数据
const counter = reactive<Counter>({count: 0
})// 定义消息内容
const message = ref<string>('Hello, Vue!')// 定义增加计数的方法
function increment(): void {counter.count++
}// 生命周期钩子:组件挂载后执行
onMounted(() => {console.log(`Initial count: ${counter.count}`) // 0counter.count++
})
</script><style scoped>
/* 容器样式 */
.counter-container {text-align: center;margin-top: 50px;
}/* 消息样式 */
.message {font-size: 2em;color: #42b983;
}/* 计数显示样式 */
.count-display {font-size: 1.5em;margin: 20px 0;
}/* 按钮样式 */
.increment-button {padding: 10px 20px;font-size: 16px;cursor: pointer;border: none;background-color: #42b983;color: white;border-radius: 5px;transition: background-color 0.3s;
}.increment-button:hover {background-color: #369870;
}/* 动态标题样式 */
.dynamic-header {margin-top: 30px;font-size: 1.2em;color: #333;
}
</style>

 

1. 文件整体结构

        这段代码是一个单文件组件(Single File Component),通常保存在一个以 .vue 结尾的文件里,比如 CounterComponent.vue。它被分成三个主要部分:

  1. <template>:页面上要显示的结构(HTML)。
  2. <script setup lang="ts">:组件的逻辑和数据处理部分。这里用了 TypeScript(lang="ts")。
  3. <style scoped>:样式部分,给这个组件的元素增加视觉样式,并用 scoped 限制样式范围。

        Vue 3 推荐使用这种“单文件组件”格式,让结构、逻辑、样式都集中在同一个文件里,便于管理和协作。


2. <template> 部分:页面结构与显示内容

 
<template><div class="counter-container"><h1 class="message">{{ message }}</h1><p class="count-display">Count is: {{ counter.count }}</p><button class="increment-button" @click="increment">Increase Count</button><h1 class="dynamic-header">Make me dynamic!</h1></div>
</template>

  • <div class="counter-container">:这是最外层的容器,用于包裹整段内容。给它一个类名是为了在样式里定位并做样式修饰。
  • <h1 class="message">{{ message }}</h1>
    • {{ message }}插值语法,用于显示脚本中定义的 message 变量的值。
    • class="message" 用于给 <h1> 元素添加样式。
  • <p class="count-display">Count is: {{ counter.count }}</p>
    • 同样使用插值语法,counter.count 表示一个名为 counter 的对象的 count 属性。
    • class="count-display" 用于样式管理。
  • <button class="increment-button" @click="increment">Increase Count</button>
    • 这是一个按钮,点击后会触发 increment() 方法(事件绑定语法@click="increment")。
    • class="increment-button" 用于样式管理。
  • <h1 class="dynamic-header">Make me dynamic!</h1>
    • 纯文本标题,让页面看起来更丰富一些,暂时没有绑定任何逻辑。

小结<template> 就像是 HTML,但是可以使用 Vue 的插值和指令(如 @click)来展示和控制数据。


3. <script setup lang="ts"> 部分:业务逻辑与数据管理

 
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'// 定义计数器接口
interface Counter {count: number
}// 定义响应式数据
const counter = reactive<Counter>({count: 0
})// 定义消息内容
const message = ref<string>('Hello, Vue!')// 定义增加计数的方法
function increment(): void {counter.count++
}// 生命周期钩子:组件挂载后执行
onMounted(() => {console.log(`Initial count: ${counter.count}`) // 0counter.count++
})
</script>

3.1 import { ref, reactive, onMounted } from 'vue'

  • refreactiveonMounted 是 Vue 3 组合式 API 的核心方法。
    • ref():创建一个单值的响应式数据,通常用于字符串、数字、布尔值等基本类型。
    • reactive():创建一个对象数组的响应式数据,能让其中所有属性都具备响应式。
    • onMounted():Vue 的生命周期钩子,当组件第一次加载(挂载)到页面上时会执行这里的回调。

3.2 TypeScript 接口 Counter

 
interface Counter {count: number
}

  • 这是 TypeScript 的语法,定义了一个接口 Counter,表示这个对象里应该有一个 count 属性且类型为 number
  • reactive 用上这个接口,可以让代码编辑器对 counter.count 做类型检查,更好地规避错误。

3.3 定义响应式数据 counter

 
const counter = reactive<Counter>({count: 0
})

  • reactive<Counter>() 表示用 Counter 这个接口来约束对象结构。
  • count: 0 表示初始值是 0。
  • 任何使用 counter.count 的地方,都会在它改变时自动刷新页面上对应的位置(也就是响应式的特点)。

3.4 定义消息内容 message

 
const message = ref<string>('Hello, Vue!')

  • messageref() 定义,初始值 'Hello, Vue!'
  • <string> 明确说明 message.value 会是一个字符串类型。
  • 在模板里,你可以直接用 {{ message }},Vue 会自动解包(unref) ref,无需写 message.value

3.5 定义方法 increment()

 
function increment(): void {counter.count++
}

  • 当用户点击按钮时,会执行这个函数,让 counter.count 递增 1。
  • : void 表示这是一个不返回值的函数(TypeScript 语法)。

3.6 生命周期钩子 onMounted

 
onMounted(() => {console.log(`Initial count: ${counter.count}`)counter.count++
})

  • 在组件加载(挂载)时打印当前的 count 值,然后再让它自增 1。
  • 这个回调只会在组件第一次挂载到页面时运行一次,适合做初始化逻辑、获取数据等操作。

 

4. <style scoped> 部分:样式

 
<style scoped>
/* 容器样式 */
.counter-container {text-align: center;margin-top: 50px;
}/* 消息样式 */
.message {font-size: 2em;color: #42b983;
}/* 计数显示样式 */
.count-display {font-size: 1.5em;margin: 20px 0;
}/* 按钮样式 */
.increment-button {padding: 10px 20px;font-size: 16px;cursor: pointer;border: none;background-color: #42b983;color: white;border-radius: 5px;transition: background-color 0.3s;
}.increment-button:hover {background-color: #369870;
}/* 动态标题样式 */
.dynamic-header {margin-top: 30px;font-size: 1.2em;color: #333;
}
</style>

  • scoped 表示样式只作用于当前组件,不会影响其它组件或全局页面。
  • 每个 CSS 选择器都对应我们在 <template> 中写的 class 名称,比如 .counter-container.message.count-display 等等。
  • 给按钮设置了鼠标悬停(:hover)时的背景色变换,还加了一点圆角和过渡动画,让交互更友好。


5. 代码的工作流程

  1. 组件加载
    • 当这个 CounterComponent.vue 被导入并在页面中使用时,Vue 会解析 <template><script setup><style>
  2. 初始化数据
    • counter.count = 0message = 'Hello, Vue!'
  3. onMounted
    • 组件挂载到页面后,onMounted() 回调被执行,打印出初始的 count 值,然后立即将 count 改成 1。
    • 这样你的页面在初始化时,{{ counter.count }} 可能很快就会从 0 变成 1,你在控制台也能看到 “Initial count: 0” 的日志。
  4. 用户交互
    • 当用户点击 “Increase Count” 按钮时,会调用 increment() 方法,让 counter.count++
    • Vue 自动检测到 counter.count 的变化,重新渲染页面,让 {{ counter.count }} 显示新的值。
  5. 样式呈现
    • 由于 scoped,这些 CSS 样式只对当前组件生效,不会影响全局或其他组件。

6. 总结与提示

  • 单文件组件 (SFC)<template><script setup><style> 这三部分合在一起,方便你把界面、逻辑、样式都集中在同一个文件维护,清晰易于管理。
  • 组合式 API (Composition API):通过 ref(), reactive(), onMounted() 等函数,让数据和业务逻辑更灵活地组合、拆分。学会它之后,你可以更轻松地管理复杂的应用逻辑。
  • TypeScript:在 <script setup lang="ts"> 里,TypeScript 能帮助你检查数据类型,避免一些低级错误。对于大型项目或多人协作,非常有用。如果你暂时对 TS 不熟悉,也可以先使用普通的 JavaScript(去掉 lang="ts" 和相关类型注解),等熟悉后再进阶。
  • scoped 样式:让当前组件的 CSS 不会跑去影响其它地方,减少样式冲突。对于大型项目中,样式维护也更有条理。
  • 学习路径:建议你先熟悉 Vue 的基本概念(如数据响应式、指令、插值语法),再了解 <script setup> 中的组合式 API,最后再考虑引入 TypeScript 或更多高级特性。

相关文章:

Vue笔记-001-声明式渲染

https://cn.vuejs.org/tutorial/#step-2https://cn.vuejs.org/tutorial/#step-2 Vue 单文件组件 (Single-File Component&#xff0c;缩写为 SFC) 单文件组件是一种可复用的代码组织形式&#xff0c;它将从属于同一个组件的 HTML、CSS 和 JavaScript 封装在使用 .vue 后缀的文件…...

26考研资料分享 百度网盘

26考研资料分享考研资料合集 百度网盘&#xff08;仅供参考学习&#xff09; 基础班&#xff1a; 通过网盘分享的文件&#xff1a;2026【考研英语】等3个文件 链接: https://pan.baidu.com/s/1Q6rvKop3sWiL9zBHs87kAQ?pwd5qnn 提取码: 5qnn --来自百度网盘超级会员v3的分享…...

.NET 8 + Ocelot + Consul 实现代理网关、服务发现

.NET 8 Ocelot Consul 实现代理网关、服务发现 本文环境&#xff1a;.NET 8 Ocelot 23.4.2 Consul 1.7.14.6 1 实现网关 分别创建3个WebApi工程&#xff1a;OcelotGw、TestGwAService、TestGwBService&#xff1b;在OcelotGw工程中安装Ocelot包&#xff1a;Install-Packag…...

使用 Nginx 轻松处理跨域请求(CORS)

使用 Nginx 轻松处理跨域请求&#xff08;CORS&#xff09; 在现代 Web 开发中&#xff0c;跨域资源共享&#xff08;CORS&#xff09;是一种重要的机制&#xff0c;用于解决浏览器的同源策略限制。CORS 允许服务器声明哪些来源可以访问其资源&#xff0c;从而确保安全性与可用…...

【LeetCode Hot100 二分查找】搜索插入位置、搜索二维矩阵、搜索旋转排序数组、寻找两个正序数组的中位数

二分查找 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置寻找旋转排序数组中的最小值搜索旋转排序数组寻找两个正序数组的中位数&#xff08;hard&#xff09; 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并…...

使用MediaPipe Face Mesh 面部动作检测

一、技术选型 OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 用于视频流捕捉、图像预处理和基本图像处理操作。 MediaPipe 提供高效的人脸检测与关键点提取功能&#xff08;Face Mesh&#xff09;。 Python 作为后端开发语言&#xff0c;整合上述库进行…...

【Vue】<script setup>和 <script>区别是什么?在使用时的写法区别?

<script setup> 是 Vue 3 引入的一种新的脚本语法&#xff0c;它提供了一种更简洁和声明式的方式来编写组件逻辑。它是为了解决传统 <script> 标签在 Vue 单文件组件&#xff08;SFC&#xff09;中的一些局限性而设计的。 <script setup> 与 <script>…...

微服务框架,Http异步编程中,如何保证数据的最终一致性

一、背景 在微服务框架下&#xff0c;跨服务之间的调用&#xff0c;当遇到操作耗时或者量大的情况&#xff0c;我们一般会采用异步编程实现。 本文出现的问题是&#xff1a;异步回调过来时&#xff0c;却未查询到数据库中的任务&#xff0c;导致未能正常处理回调。 下面是当…...

vue3-dom-diff算法

vue3diff算法 什么是vue3diff算法 Vue3中的diff算法是一种用于比较虚拟DOM树之间差异的算法&#xff0c;其目的是为了高效地更新真实DOM&#xff0c;减少不必要的重渲染 主要过程 整个过程主要分为以下五步 前置预处理后置预处理仅处理新增仅处理后置处理包含新增、卸载、…...

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…...

ubuntu16 重启之后lvm信息丢失故障恢复

一、背景 1、问题背景 业务有一台物理开发服务器&#xff0c;文件系统有损坏&#xff1b;由于重启时没有检查&#xff0c;导致重启卡住。后面通过断电重新启动之后&#xff0c;无法进入系统&#xff1b;进入救援模式&#xff0c;注释数据盘挂载。重启之后进入系统&#xff0c…...

【华为OD-E卷 - 热点网站统计 100分(python、java、c++、js、c)】

【华为OD-E卷 - 热点网站统计 100分&#xff08;python、java、c、js、c&#xff09;】 题目 企业路由器的统计页面&#xff0c;有一个功能需要动态统计公司访问最多的网页URL top N。请设计一个算法&#xff0c;可以高效动态统计Top N的页面 输入描述 每一行都是一个URL或…...

Ubuntu下安装Android Sdk

下载android sdk命令行工具 https://developer.android.com/studio?hlzh-cn#command-tools mkdir android-sdk cd android-sdk unzip commandlinetools-linux-11076708_latest.zip 添加环境变量到~/.bashrc export ANDROID_HOME$HOME/android-sdk export PATH$PATH:$ANDRO…...

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…...

怎样修改el-table主题样式

起因&#xff1a;el-table有主题样式&#xff0c;部分需要单独设置 环境&#xff1a;ideanodejs插件谷歌浏览器 第一步&#xff1a;找到scss文件&#xff1a; 谷歌浏览器打开表格页面&#xff0c;ctrlshifti打开开发者工具&#xff0c;点击后鼠标移动到表格单元格上单击一下…...

MySQL(二)MySQL DDL数据库定义语言

1. MySQL DDL数据库定义语言 1.1. MySQL定义语言 进入MySQL mysql -u root -p(回车后输入密码&#xff0c;即可进入mysq1)1.1.1. 数据库操作 &#xff08;1&#xff09;查看数据库 mysql>show databases;注:MySQL语句分隔符为“&#xff1b;”   mysql库很重要它里面有…...

Spring Boot 项目启动报 NoClassDefFoundError 异常的原因分析与解决方案 - jackson 版本不一致

目录 报错: 问题分析&#xff1a; 解决方案&#xff1a; 方案 1&#xff1a;对 Jackson 版本进行统一 方案 2&#xff1a;升级 Springfox 版本 方案 3&#xff1a;替换 Springfox 为 springdoc-openapi&#xff08;推荐&#xff09; 方案 4&#xff1a;排除冲突的 Jack…...

原型与原型链

什么是原型&#xff08;对象&#xff09; 在JavaScript中&#xff0c;每个对象都具有一个原型对象prototype&#xff0c;目的是&#xff1a;利用原型对象实现在同一原型链中的原型方法共享 在理解原型对象前&#xff0c;需要先了解什么是构造函数 构造函数 用来初始化对象的…...

【Linux】信号处理

一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起&#xff08;hang up&#xff09;进程2SIGINT中断进&#xff08;interrupt&#xff09;程3SIGQUIT停止&#xff08;stop&#xff09;进程9SIGKILL无条件终止&#xff08;terminate&#xff09;…...

5个不同类型的mysql数据库安装

各种社区版本下载官方地址&#xff1a;MySQL :: MySQL Community Downloads 一、在线YUM仓库&#xff08;Linux&#xff09; 选择 MySQL Yum Repository 选择对应版本下载仓库安装包&#xff08;No thanks, just start my download.&#xff09; 下载方法1&#xff1a;下载到本…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...