Vue笔记-001-声明式渲染
https://cn.vuejs.org/tutorial/#step-2
https://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。它被分成三个主要部分:
<template>:页面上要显示的结构(HTML)。<script setup lang="ts">:组件的逻辑和数据处理部分。这里用了 TypeScript(lang="ts")。<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'
ref、reactive和onMounted是 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!')
message用ref()定义,初始值'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. 代码的工作流程
- 组件加载
- 当这个
CounterComponent.vue被导入并在页面中使用时,Vue 会解析<template>、<script setup>和<style>。
- 当这个
- 初始化数据
counter.count = 0,message = 'Hello, Vue!'。
- onMounted
- 组件挂载到页面后,
onMounted()回调被执行,打印出初始的count值,然后立即将count改成 1。 - 这样你的页面在初始化时,
{{ counter.count }}可能很快就会从0变成1,你在控制台也能看到 “Initial count: 0” 的日志。
- 组件挂载到页面后,
- 用户交互
- 当用户点击 “Increase Count” 按钮时,会调用
increment()方法,让counter.count++。 - Vue 自动检测到
counter.count的变化,重新渲染页面,让{{ counter.count }}显示新的值。
- 当用户点击 “Increase Count” 按钮时,会调用
- 样式呈现
- 由于
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,缩写为 SFC) 单文件组件是一种可复用的代码组织形式,它将从属于同一个组件的 HTML、CSS 和 JavaScript 封装在使用 .vue 后缀的文件…...
26考研资料分享 百度网盘
26考研资料分享考研资料合集 百度网盘(仅供参考学习) 基础班: 通过网盘分享的文件:2026【考研英语】等3个文件 链接: https://pan.baidu.com/s/1Q6rvKop3sWiL9zBHs87kAQ?pwd5qnn 提取码: 5qnn --来自百度网盘超级会员v3的分享…...
.NET 8 + Ocelot + Consul 实现代理网关、服务发现
.NET 8 Ocelot Consul 实现代理网关、服务发现 本文环境:.NET 8 Ocelot 23.4.2 Consul 1.7.14.6 1 实现网关 分别创建3个WebApi工程:OcelotGw、TestGwAService、TestGwBService;在OcelotGw工程中安装Ocelot包:Install-Packag…...
使用 Nginx 轻松处理跨域请求(CORS)
使用 Nginx 轻松处理跨域请求(CORS) 在现代 Web 开发中,跨域资源共享(CORS)是一种重要的机制,用于解决浏览器的同源策略限制。CORS 允许服务器声明哪些来源可以访问其资源,从而确保安全性与可用…...
【LeetCode Hot100 二分查找】搜索插入位置、搜索二维矩阵、搜索旋转排序数组、寻找两个正序数组的中位数
二分查找 搜索插入位置搜索二维矩阵在排序数组中查找元素的第一个和最后一个位置寻找旋转排序数组中的最小值搜索旋转排序数组寻找两个正序数组的中位数(hard) 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并…...
使用MediaPipe Face Mesh 面部动作检测
一、技术选型 OpenCV(Open Source Computer Vision Library) 用于视频流捕捉、图像预处理和基本图像处理操作。 MediaPipe 提供高效的人脸检测与关键点提取功能(Face Mesh)。 Python 作为后端开发语言,整合上述库进行…...
【Vue】<script setup>和 <script>区别是什么?在使用时的写法区别?
<script setup> 是 Vue 3 引入的一种新的脚本语法,它提供了一种更简洁和声明式的方式来编写组件逻辑。它是为了解决传统 <script> 标签在 Vue 单文件组件(SFC)中的一些局限性而设计的。 <script setup> 与 <script>…...
微服务框架,Http异步编程中,如何保证数据的最终一致性
一、背景 在微服务框架下,跨服务之间的调用,当遇到操作耗时或者量大的情况,我们一般会采用异步编程实现。 本文出现的问题是:异步回调过来时,却未查询到数据库中的任务,导致未能正常处理回调。 下面是当…...
vue3-dom-diff算法
vue3diff算法 什么是vue3diff算法 Vue3中的diff算法是一种用于比较虚拟DOM树之间差异的算法,其目的是为了高效地更新真实DOM,减少不必要的重渲染 主要过程 整个过程主要分为以下五步 前置预处理后置预处理仅处理新增仅处理后置处理包含新增、卸载、…...
年会抽奖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、问题背景 业务有一台物理开发服务器,文件系统有损坏;由于重启时没有检查,导致重启卡住。后面通过断电重新启动之后,无法进入系统;进入救援模式,注释数据盘挂载。重启之后进入系统,…...
【华为OD-E卷 - 热点网站统计 100分(python、java、c++、js、c)】
【华为OD-E卷 - 热点网站统计 100分(python、java、c、js、c)】 题目 企业路由器的统计页面,有一个功能需要动态统计公司访问最多的网页URL top N。请设计一个算法,可以高效动态统计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主题样式
起因:el-table有主题样式,部分需要单独设置 环境:ideanodejs插件谷歌浏览器 第一步:找到scss文件: 谷歌浏览器打开表格页面,ctrlshifti打开开发者工具,点击后鼠标移动到表格单元格上单击一下…...
MySQL(二)MySQL DDL数据库定义语言
1. MySQL DDL数据库定义语言 1.1. MySQL定义语言 进入MySQL mysql -u root -p(回车后输入密码,即可进入mysq1)1.1.1. 数据库操作 (1)查看数据库 mysql>show databases;注:MySQL语句分隔符为“;” mysql库很重要它里面有…...
Spring Boot 项目启动报 NoClassDefFoundError 异常的原因分析与解决方案 - jackson 版本不一致
目录 报错: 问题分析: 解决方案: 方案 1:对 Jackson 版本进行统一 方案 2:升级 Springfox 版本 方案 3:替换 Springfox 为 springdoc-openapi(推荐) 方案 4:排除冲突的 Jack…...
原型与原型链
什么是原型(对象) 在JavaScript中,每个对象都具有一个原型对象prototype,目的是:利用原型对象实现在同一原型链中的原型方法共享 在理解原型对象前,需要先了解什么是构造函数 构造函数 用来初始化对象的…...
【Linux】信号处理
一、Linux系统信号 1、常见的系统信号 常见的Linux系统信号 信号值描述1SIGHUP挂起(hang up)进程2SIGINT中断进(interrupt)程3SIGQUIT停止(stop)进程9SIGKILL无条件终止(terminate)…...
5个不同类型的mysql数据库安装
各种社区版本下载官方地址:MySQL :: MySQL Community Downloads 一、在线YUM仓库(Linux) 选择 MySQL Yum Repository 选择对应版本下载仓库安装包(No thanks, just start my download.) 下载方法1:下载到本…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
