vue3官网文档学习、复习笔记(快速上手)
目录
2.Attribute 绑定(v-bind)
3.事件监听(v-on)
4.表单绑定(v-model)
5.条件渲染(v-if)
6.列表渲染(v-for)
all.value = all.value.filter((t) => t !== all)
7.计算属性(computed())
8.生命周期和模板引用(onMounted、ref=)
9.侦听器(watch())
10.组件(ChildComp)
11.Props(使用父组件动态数据defineProps())
12.Emits(子组件向父组件触发事件)
13.插槽(slots)
能在改变时触发更新的状态被称作是响应式的。我们可以使用 Vue 的
reactive()
API 来声明响应式状态。由reactive()
创建的对象都是 JavaScript Proxy,其行为与普通对象一样:
reactive()
只适用于对象 (包括数组和内置类型,如Map
和Set
)。而另一个 APIref()
则可以接受任何值类型。ref
会返回一个包裹对象,并在.value
属性下暴露内部值。
reactive()
和ref()
的细节:响应式基础 | Vue.js (vuejs.org)例:
<script setup> import { reactive, ref } from 'vue'const counter = reactive({ count: 0 }) const message = ref('Hello World!') </script><template><h1>{{ message }}</h1><p>Count is: {{ counter.count }}</p> </template>
注意我们在模板中访问的
message
ref 时不需要使用.value
:它会被自动解包,让使用更简单。
2.Attribute 绑定(v-bind)
mustache 语法 (即双大括号) 只能用于文本插值。为了给 attribute 绑定一个动态值,需要使用
v-bind
指令例:
把一个动态的
class
绑定添加到这个<h1>
上,并使用titleClass
的 ref 作为它的值。如果绑定正确,文字将会变为红色。<script setup> import { ref } from 'vue'const titleClass = ref('title') </script><template><h1 :class="titleClass">Make me red</h1> </template><style> .title {color: red; } </style>
3.事件监听(v-on)
例:
尝试自行实现
increment
函数并通过使用v-on
将其绑定到按钮上<script setup> import { ref } from 'vue'const count = ref(0)function increment() {count.value++ } </script><template><button @click="increment">count is: {{ count }}</button> </template>
4.表单绑定(v-model)
我们可以同时使用
v-bind
和v-on
来在表单的输入元素上创建双向绑定为了简化双向绑定,Vue 提供了一个
v-model
指令,它实际上是上述操作的语法糖例:
试着在文本框里输入——你会看到
<p>
里的文本也随着你的输入更新了<script setup> import { ref } from 'vue'const text = ref('') </script><template><input v-model="text" placeholder="Type here"><p>{{ text }}</p> </template>
5.条件渲染(v-if)
例:
同时展示了两个
<h1>
标签,并且按钮不执行任何操作。尝试给它们添加v-if
和v-else
指令,并实现toggle()
方法,让我们可以使用按钮在它们之间切换。<script setup> import { ref } from 'vue'const awesome = ref(true)function toggle() {awesome.value = !awesome.value } </script><template><button @click="toggle">toggle</button><h1 v-if="awesome">Vue is awesome!</h1><h1 v-else>Oh no 😢</h1> </template>
6.列表渲染(v-for)
例:
这里有一个简单的 todo 列表——试着实现一下
addTodo()
和removeTodo()
这两个方法的逻辑,使列表能够正常工作!<script setup> import { ref } from 'vue'// 给每个 todo 对象一个唯一的 id let id = 0const newTodo = ref('') const todos = ref([{ id: id++, text: 'Learn HTML' },{ id: id++, text: 'Learn JavaScript' },{ id: id++, text: 'Learn Vue' } ])function addTodo() {todos.value.push({ id: id++, text: newTodo.value })newTodo.value = '' }function removeTodo(todo) {todos.value = todos.value.filter((t) => t !== todo) } </script><template><form @submit.prevent="addTodo"><input v-model="newTodo"><button>Add Todo</button> </form><ul><li v-for="todo in todos" :key="todo.id">{{ todo.text }}<button @click="removeTodo(todo)">X</button></li></ul> </template>
all.value = all.value.filter((t) => t !== all)
该代码通过删除任何等于 的元素来筛选数组中的元素。然后将过滤后的结果分配回 。
todos.value.filter((t) => t !== todo)
当您要从数组中删除特定元素时,可以使用此代码。它遍历数组中的每个元素 () 并检查它是否不等于 。如果条件为 true,则该元素将保留在筛选结果中,否则将删除该元素。
过滤后,生成的数组被赋回变量,有效地使用修改后的数组对其进行更新
<form @submit.prevent=“addTodo”>
该代码为元素上的事件设置事件处理程序。提交表单时,它会调用 Vue.js 实例中指定的方法或函数。
<form @submit.prevent="addTodo">
该指令阻止默认表单提交行为,这通常涉及刷新页面或导航到新 URL。相反,它允许您定义自定义逻辑以使用该方法处理表单提交
7.计算属性(computed())
计算属性会自动跟踪其计算中所使用的到的其他响应式状态,并将它们收集为自己的依赖。计算结果会被缓存,并只有在其依赖发生改变时才会被自动更新。
例:
试着添加
filteredTodos
计算属性并实现计算逻辑!如果实现正确,在隐藏已完成项目的状态下勾选一个 todo,它也应当被立即隐藏。<script setup> import { ref, computed } from 'vue'let id = 0const newTodo = ref('') const hideCompleted = ref(false) const todos = ref([{ id: id++, text: 'Learn HTML', done: true },{ id: id++, text: 'Learn JavaScript', done: true },{ id: id++, text: 'Learn Vue', done: false } ])const filteredTodos = computed(() => {return hideCompleted.value? todos.value.filter((t) => !t.done): todos.value })function addTodo() {todos.value.push({ id: id++, text: newTodo.value, done: false })newTodo.value = '' }function removeTodo(todo) {todos.value = todos.value.filter((t) => t !== todo) } </script><template><form @submit.prevent="addTodo"><input v-model="newTodo"><button>Add Todo</button></form><ul><li v-for="todo in filteredTodos" :key="todo.id"><input type="checkbox" v-model="todo.done"><span :class="{ done: todo.done }">{{ todo.text }}</span><button @click="removeTodo(todo)">X</button></li></ul><button @click="hideCompleted = !hideCompleted">{{ hideCompleted ? 'Show all' : 'Hide completed' }}</button> </template><style> .done {text-decoration: line-through; } </style>
8.生命周期和模板引用(onMounted、ref=)
要在挂载之后执行代码,我们可以使用
onMounted()
函数例:
尝试添加一个
onMounted
钩子,然后通过pElementRef.value
访问<p>
,并直接对其执行一些 DOM 操作。(例如修改它的textContent
)。<script setup> import { ref, onMounted } from 'vue'const pElementRef = ref(null)onMounted(() => {pElementRef.value.textContent = 'mounted!' }) </script><template><p ref="pElementRef">hello</p> </template>
结果解释:
给定的代码是使用该语法的 Vue 3 单文件组件 (SFC)。以下是它的功能的细分:
<script setup>
该语句从 'vue' 包导入必要的函数。这些函数用于创建反应式引用和处理组件生命周期事件。
常量是使用该函数创建的。它将引用初始化为 。
调用该函数,该函数设置在 DOM 中挂载组件时要执行的回调。在这种情况下,回调函数将 的文本内容设置为“mounted!
该部分包含组件的 HTML 模板。在模板内部,有一个带有属性的元素。此属性将引用绑定到元素,允许操作其属性。
挂载组件时,会触发回调,并将 引用的元素的文本内容设置为“mounted!因此,渲染的输出将显示“mounted!”而不是“hello”。
9.侦听器(watch())
有时我们需要响应性地执行一些“副作用”——例如,当一个数字改变时将其输出到控制台。我们可以通过侦听器来实现它:
watch()
可以直接侦听一个 ref,并且只要count
的值改变就会触发回调例:
<script setup> import { ref, watch } from 'vue'const todoId = ref(1) const todoData = ref(null)async function fetchData() {todoData.value = nullconst res = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)todoData.value = await res.json() }fetchData()watch(todoId, fetchData) </script><template><p>Todo id: {{ todoId }}</p><button @click="todoId++">Fetch next todo</button><p v-if="!todoData">Loading...</p><pre v-else>{{ todoData }}</pre> </template>
代码解释:
- 该语句从 'vue' 包导入必要的函数 、 和。 用于创建反应式引用,用于监视反应式引用中的更改,并且是用于发出 HTTP 请求的浏览器 API。
- 使用函数创建两个反应式引用:和。 初始值为 1,最初设置为 null。
- 定义了一个异步函数,该函数使用当前值从指定的 URL 获取待办事项数据。最初,它设置为 null,提取数据,并使用提取的 JSON 响应进行更新。
- 该函数在定义后立即调用,获取初始待办事项数据。
- 该函数用于监视反应式引用的变化。每当更改时,都会再次调用该函数以根据更新的值获取新的待办事项数据。
- 在该部分中,有一个段落 () 元素显示 的当前值
- 存在一个带有事件侦听器的按钮,该按钮在单击时递增值,触发函数并使用更新的
- 下一个元素使用该指令有条件地呈现“正在加载...”何时是伪造的(最初或在数据获取过程中)
- 在最后一个元素中,该指令用于在元素内呈现,一旦它变得真实,将获取的待办事项数据显示为格式化的JSON对象
10.组件(ChildComp)
真正的 Vue 应用往往是由嵌套组件创建的。
父组件可以在模板中渲染另一个组件作为子组件。要使用子组件,我们需要先导入它:
import ChildComp from './ChildComp.vue'
然后我们就可以在模板中使用组件,就像这样:
<ChildComp />
例:
现在尝试一下导入子组件并在模板中渲染它
<script setup> import ChildComp from './ChildComp.vue' </script><template><ChildComp /> </template>
ChildComp.vue
<template><h2>A Child Component!</h2> </template>
11.Props(使用父组件动态数据defineProps())
子组件可以通过 props 从父组件接受动态数据。首先,需要声明它所接受的 props:
<!-- ChildComp.vue --> <script setup> const props = defineProps({msg: String }) </script>
注意
defineProps()
是一个编译时宏,并不需要导入。一旦声明,msg
prop 就可以在子组件的模板中使用。它也可以通过defineProps()
所返回的对象在 JavaScript 中访问。父组件可以像声明 HTML attributes 一样传递 props。若要传递动态值,也可以使用
v-bind
语法:<ChildComp :msg="greeting" />
例:
ChildComp.vue
<script setup> const props = defineProps({msg: String }) </script><template><h2>{{ msg || 'No props passed yet' }}</h2> </template>
父组件:
<script setup> import { ref } from 'vue' import ChildComp from './ChildComp.vue'const greeting = ref('Hello from parent') </script><template><ChildComp :msg="greeting" /> </template>
12.Emits(子组件向父组件触发事件)
除了接收 props,子组件还可以向父组件触发事件:
<script setup> // 声明触发的事件 const emit = defineEmits(['response'])// 带参数触发 emit('response', 'hello from child') </script>
emit()
的第一个参数是事件的名称。其他所有参数都将传递给事件监听器。父组件可以使用
v-on
监听子组件触发的事件——这里的处理函数接收了子组件触发事件时的额外参数并将它赋值给了本地状态:<ChildComp @response="(msg) => childMsg = msg" />
例:父组件:
<script setup> import { ref } from 'vue' import ChildComp from './ChildComp.vue'const childMsg = ref('No child msg yet') </script><template><ChildComp @response="(msg) => childMsg = msg" /><p>{{ childMsg }}</p> </template>
ChildComp.vue
<script setup> const emit = defineEmits(['response'])emit('response', 'hello from child') </script><template><h2>Child component</h2> </template>
13.插槽(slots)
<slot>
插口中的内容将被当作“默认”内容:它会在父组件没有传递任何插槽内容时显示例:
没有给
<ChildComp>
传递任何插槽内容,所以你将看到默认内容。让我们利用父组件的msg
状态为子组件提供一些插槽内容ChildComp.vue
<template><slot>Fallback content</slot> </template>
父组件:
<script setup> import { ref } from 'vue' import ChildComp from './ChildComp.vue'const msg = ref('from parent') </script><template><ChildComp>Message: {{ msg }}</ChildComp> </template>
相关文章:

vue3官网文档学习、复习笔记(快速上手)
目录 2.Attribute 绑定(v-bind) 3.事件监听(v-on) 4.表单绑定(v-model) 5.条件渲染(v-if) 6.列表渲染(v-for) all.value all.value.filter(…...

0基础学习VR全景平台篇 第81篇:全景相机-临云镜如何直播推流
临云镜全景相机是阿里巴巴定制全景设备,实现空间三维信息的快速采集,与阿里云三维空间重建平台搭配,帮助品牌商与平台以较低的成本完成空间的快速采集,并支持对室内/室外空间的三维全景展示及空间漫游,同时支持VR浏览、…...
分数线划定
题目描述 查看题目信息 世博会志愿者的选拔工作正在A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。 面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿…...
考研C语言进阶题库——更新26-30题
目录 26.一个正整数,如果等于组成它的各个数字的阶数之和,该整数称为阶乘合数,例如1451阶加四阶加五阶,则145是一个三位阶乘合数,输入一个数,问共有多少个阶乘合数?(十万之内) 27.与2相关的数…...

用C语言实现定积分计算(包括无穷积分/可自定义精度)
关于严谨性的声明: 在用C语言进行定积分的计算之前,我需要声明以下几点: 一、我们所进行定积分计算的函数都是应当是黎曼可积的,这保证了我们即使均匀地分割区间也保证了积分的收敛性。 二、我们同时还应该认识到,鉴…...

使用Presto、Trino数据库时提示“The datetime zone id ‘GMT+08:00‘ is not recognised”
出现这个问题的原因是:Presto、Trino的驱动使用了joda这个库来处理时区的问题。但这个库的编写人似乎对java zone的格式没有太多经验。先看一下出错的代码: com.facebook.presto.jdbc.internal.joda.time.DateTimeZone#forID 根据String类型的zoneId转成…...
C# BeginInvoke 加 EndInvoke实现异步操作
1、定义一个委托 delegate long MyDel(int first, int second); 2、 需异步操作的函数 static int sum(int x,int y) {Console.WriteLine("InSide Sum1");Thread.Sleep(1000);Console.WriteLine("InSide Sum2");return x y;} 3、回调方法…...
“华为杯”研究生数学建模竞赛2015年-【华为杯】B题:数据的多流形结构分析(续)
目录 4.2.2 算法复杂度分析 4.2.3 参数影响 4.2.4 问题 3(a)求解 4.3 问题 3(b) 4.3.1 加权稀疏子空间聚类</...

R语言APSIM模型高级应用及批量模拟
随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…...

【硬件设计】模拟电子基础三--集成运算放大电路
模拟电子基础三--集成运算放大电路 一、集成运算放大器1.1 定义、组成与性能1.2 电流源电路1.3 差动放大电路1.4 理想运算放大器 二、集成运算放大器的应用2.1 反向比例运算电路2.2 同向比例运算电路2.3 反向加法运算电路2.4 反向减法运算电路2.5 积分运算电路2.6 微分运算电路…...

JavaWeb(11)——前端综合案例5(小黑记事本)
一、实例需求 ⌛ 功能需求: ① 列表渲染 ② 删除功能 ③ 添加功能 ④ 底部统计 和 清空任务 二、代码实现 ☕ <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <meta http-equiv"X-UA-Compa…...
在使用TensorFlow的时候内部报错:内部某个方法或属性不存在
看到TensorFlow内部封装的方法报错的时候,我的第一反应是版本不匹配,立马去搜了对应版本,按照网上给的TensorFlow 2.2.0keras 2.3.1 python 3.7,反反复复安装、卸载、升级、降低版本了很多回还是八行,就在心态快要爆爆…...

dubbo之高可用
负载均衡 概述 负载均衡是指在集群中,将多个数据请求分散到不同的单元上执行,主要是为了提高系统的容错能力和对数据的处理能力。 Dubbo 负载均衡机制是决定一次服务调用使用哪个提供者的服务。 策略 在Dubbo中提供了7中负载均衡策略,默…...
gitee代码扫描js代码,降低复杂度,减少if-else判断的处理方法
把if-else换成如下形式 页面上的代码 <el-button id"btnSave" type"primary" :loading"loadingEdit" click"saveEdit(put,baseSet)"> {{ $t("formLabel.save") }} </el-button> methods代码: // 编…...

MySQL及SQL语句(3)
MySQL及SQL语句(3) 文章目录 MySQL及SQL语句(3)一、多表查询1.1 准备sql1.2 笛卡尔积1.3 多表查询的分类:内连接查询外连接查询子查询多表查询练习 二、事务2.1 事务的基本介绍概念操作实例事务提交的两种方式 2.2 事务的四大特征原子性持久性隔离性一致性 2.3 事务…...

MySQL 查询语句大全
目录 基础查询 直接查询 AS起别名 去重(复)查询 条件查询 算术运算符查询 逻辑运算符查询 正则表达式查询⭐ 模糊查询 范围查询 是否非空判断查询 排序查询 限制查询(分页查询) 随机查询 分组查询 HAVING 高级查询…...
【Axure高保真原型】账单列表和详情
今天和大家分享账单列表和详情的原型模板,点击月份可以展开或收起对应的菜单列表,该模板是用中继器制作的,在中继器里填写数据后,自动计算出支出和收入总和,点击订单,可以查看该订单的详情。 【原型效果】…...
嵌入式面试题1
1 读程序段,回答问题 int main(int argc, char *argv[]) { int c 9, d 0; c c % 5; d c; printf("d%d\n",d);return 0;} a) 写出程序输出 b) 在一个可移植的系统中这种表达式是否存在风险?why? 答: 1.程序输出为:…...
base64转二进制流,file文件
base64转二进制流 img标签src属性,可以直接使用base64字符串,base64需要先解码,然后再转为流 /*** Base64字符串转二进制流* param {String} dataurl Base64字符串(字符串包含Data URI scheme,例如:data:image/png;b…...

各种查找算法的效率分析
各种查找算法的效率 顺序查找 一般顺序表(没有顺序,随机排列) 成功时平均查找长度: 1 . . . n n n 1 2 \frac{1...n}{n}\frac{n1}{2} n1...n2n1失败时平均查找长度: n n n 有序顺序表(按照递增或递…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...