一个项目学习Vue3---响应式基础
观察下面一段代码,学习响应式基础的全部内容
<template><div><div>将下面的msg属性放到上面来:{{ msg }}</div><button @click="count++">{{ count }}</button><button @click="object.count.value++">{{ object.count.value }}</button><button @click="open">点击变猪</button><button @click="addAge">长大一岁</button><a :href="hrefValue" id="herfValue">Dom更新的时间:{{ hrefValue }}</a><button @click="changeUrl">更改上面url</button><button @click="addAgeReactive">长大一岁{{ age.count }}</button></div>
</template><script lang="ts" setup>
import { nextTick } from 'vue'
import { ref } from 'vue'
import { reactive } from 'vue'
//绑定上方的学无止境
const msg = ref('学无止境')
//绑定上方的count
const count = ref(0)
//如果这么写count是不能被解包的
const object = { count: ref(1) }
//如果标签中存在object.count++则不会被解包
//必须使用object.count.value++才能//下面代买会输出学无止境
console.log(msg.value)
//绑定上方的变猪
function open() {msg.value = '猪'
}
//绑定一个对象
const user = ref({userName: '张三',age: 10
})
//增加一岁
function addAge() {user.value.age++
}
const hrefValue = ref('www.baidu.com')
async function changeUrl() {hrefValue.value = 'www.json.cn'let element = document.getElementById('herfValue')if (element) {console.log(element.getAttribute('href'))}await nextTick//他在执行了上面的nextTick方法之后才会改变值if (element) {console.log(element.getAttribute('href'))}
}
const age = reactive({ count: 0 })
//又增加一岁
function addAgeReactive() {//reactive创建的不需要写valueage.count++
}
let raw = {}
const proxy = reactive(raw)
//true
console.log(reactive(raw) === proxy)
//false
console.log(proxy === raw)
//即便返回
const proxy2 = reactive({})
proxy2.nested = raw
//返回false
console.log(proxy2.nested === raw)
proxy2.nested = proxy
//返回true
console.log(proxy2.nested === proxy)//reactive局限性
let state = reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用将不再被追踪
// (响应性连接已丢失!) 重复赋值
state = reactive({ count2: 1 })
// 当解构时,count 已经与 state.count 断开连接
let { count2 } = state
// 不会影响原始的 state
count2++// 该函数接收到的是一个普通的数字
// 并且无法追踪 state.count 的变化
// 我们必须传入整个对象以保持响应性
//找不到count 这个属性,所以代理对象之间不能相互赋值
callSomeFunction(state.count2)function callSomeFunction(count) {//返回0console.log(count)
}//Ref自动解包
const name = ref('张三')
const bigName = reactive({ name })
//输出的实际是ref("张三")
console.log(bigName.name)
//ref("张三") = "李四"
bigName.name = '李四'
//返回李四
console.log(name.value)
//返回李四
console.log(bigName.name)//如果将一个新的 ref 赋值给一个关联了已有 ref 的属性,那么它会替换掉旧的 ref:
const otherName = ref("王五")
bigName.name = otherName
//返回王五
console.log(bigName.name)
//返回李四
console.log(name.value) //与 reactive 对象不同的是,当 ref 作为响应式数组或原生集合类型 (如 Map) 中的元素被访问时,它不会被解包:
const books = reactive([ref('Vue 3 Guide')])
// 这里需要 .value
console.log(books[0].value)const map = reactive(new Map([['count', ref(0)]]))
// 这里需要 .value
console.log(map.get('count').value)</script><style scoped>
</style>
他执行之后产生的页面是这样的
知识点1:ref()
当我们在script引入
<script lang="ts">import { ref } from 'vue'
</script>
我们就可以使用ref来代理一些变量,还记得我们在vue2中的写法吗?通过选项式API,我们在return中的变量都可以被vue双向绑定,而在vue3中我们可以使用更加便捷的方式来操作变量,
<script lang="ts">
import { ref } from 'vue'
setup(){const msg = ref('学无止境')return {msg}
}
</script>
在上面return中的内容就相当于vue2中任何return、methods等一切可以双向绑定的内容,是的,他也可以代理方法
<script lang="ts">
import { ref } from 'vue'
setup(){const msg = ref('学无止境')function open() {msg.value = '猪'}return {openmsg}
}
</script>
这样他就可以代理方法了,我们看到一个msg.value,什么意思呢?ref本质是一个对象,.value可以对对象进行解包,这样就可以获取msg的内容。当然如果你绑定到html代码里面,这个东西是会自动解包的
<div>将下面的msg属性放到上面来:{{ msg }}</div>
它也可以绑定对象等
<template><button @click="addAge">长大一岁</button>
</template>
<script lang="ts">
setup(){//绑定一个对象const user = ref({userName: '张三',age: 10})//增加一岁function addAge() {user.value.age++}return {user,addAge}
}
</script>
如果你想分别获取ref变化之前和之后的值,nextTick可以帮助到你
<template><a :href="hrefValue" id="herfValue">Dom更新的时间:{{ hrefValue }}</a><button @click="changeUrl">更改上面url</button>
</template>
<script lang="ts">
import { nextTick } from 'vue'
import { ref } from 'vue'
setup(){const hrefValue = ref('www.baidu.com')async function changeUrl() {hrefValue.value = 'www.json.cn'let element = document.getElementById('herfValue')if (element) {console.log(element.getAttribute('href'))}await nextTick//他在执行了上面的nextTick方法之后才会改变值if (element) {console.log(element.getAttribute('href'))}}return {changeUrl,hrefValue }
}
</script>
上面的代码在 await nextTick之前,他的值事还没有变化的,所以你hrefValue.value之后,是不能快速的获取到他的值的
写了这么多,我们发现每次都需要最后都要return,每次都需要写setup函数不方便,那么我们可以简化一些代码,例如上面那段代码,我们可以简化成
<template><a :href="hrefValue" id="herfValue">Dom更新的时间:{{ hrefValue }}</a><button @click="changeUrl">更改上面url</button>
</template>
<script lang="ts" setup>const hrefValue = ref('www.baidu.com')async function changeUrl() {hrefValue.value = 'www.json.cn'let element = document.getElementById('herfValue')if (element) {console.log(element.getAttribute('href'))}await nextTick//他在执行了上面的nextTick方法之后才会改变值if (element) {console.log(element.getAttribute('href'))}}}
</script>
这样就可以不写setup和return函数了,他会自己检测需要return的东西,函数或者变量都会被返回。
知识点2: reactive()
reactive的使用和ref基本类似
const age = reactive({ count: 0 })
//又增加一岁
function addAgeReactive() {//reactive创建的不需要写valueage.count++
}
如上面所示,他不需要进行写.value就可以对变量进行++操作
在比较相等性,也就是引用上,可能与我们想象的不同
let raw = {}
const proxy = reactive(raw)
//会引用同一个对象,返回true
console.log(reactive(raw) === proxy)
//封装的对象和原始对象不一样,返回false
console.log(proxy === raw)
const proxy2 = reactive({})
proxy2.nested = raw
//封装对象的属性被赋值普通对象,返回false
console.log(proxy2.nested === raw)
proxy2.nested = proxy
//封装对象的属性被赋值封装对象,返回true
console.log(proxy2.nested === proxy)
区别于vue2,return中的对象只会双向绑定,但是vue3中这么开放肯定会存在覆盖的现象
//reactive局限性
let state = reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用将不再被追踪
// (响应性连接已丢失!) 重复赋值
state = reactive({ count2: 1 })
// 当解构时,count 已经与 state.count 断开连接
let { count2 } = state
// 不会影响原始的 state
count2++// 该函数接收到的是一个普通的数字
// 并且无法追踪 state.count 的变化
// 我们必须传入整个对象以保持响应性
//找不到count 这个属性,所以代理对象之间不能相互赋值
callSomeFunction(state.count2)function callSomeFunction(count) {//返回0console.log(count)
}
如上state又被重复赋值了,那么他最后指向的是后者 当解构时,count 已经与 state.count 断开连接,即便++,也只是普通变量的++,不能改变count2的值
知识点3:ref自动解包
//Ref自动解包
const name = ref('张三')
const bigName = reactive({ name })
//输出的实际是ref("张三")
console.log(bigName.name)
//ref("张三") = "李四"
bigName.name = '李四'
//返回李四
console.log(name.value)
//返回李四
console.log(bigName.name)//如果将一个新的 ref 赋值给一个关联了已有 ref 的属性,那么它会替换掉旧的 ref:
const otherName = ref("王五")
bigName.name = otherName
//返回王五
console.log(bigName.name)
//返回李四
console.log(name.value) //与 reactive 对象不同的是,当 ref 作为响应式数组或原生集合类型 (如 Map) 中的元素被访问时,它不会被解包:
const books = reactive([ref('Vue 3 Guide')])
// 这里需要 .value
console.log(books[0].value)const map = reactive(new Map([['count', ref(0)]]))
// 这里需要 .value
console.log(map.get('count').value)
就是有时候需要写.value,有时候不需要,在ref对象被当作一个对象传入时候是自动解包的,他在其他对象里面则无法自动解包
关注公众号:资小库,问题快速答疑解惑
相关文章:

一个项目学习Vue3---响应式基础
观察下面一段代码,学习响应式基础的全部内容 <template><div><div>将下面的msg属性放到上面来:{{ msg }}</div><button click"count">{{ count }}</button><button click"object.count.value">{{ o…...
白骑士的Python教学基础篇 1.5 数据结构
系列目录 上一篇:白骑士的Python教学基础篇 1.4 函数与模块 数据结构是编程语言中用于存储和组织数据的基本构件。在Python中,常见的数据结构包括列表(List)、元组(Tuple)、字典(…...
Go 常用文件操作
查找文件/目录 os.Stat(String)组合路径 dir, _ : homedir.Dir() filename : args[0] path : filepath.Join(dir, filename)homedir.Dir()为home根目录。 filepath.Join 会自动处理分隔符,将目录和文件名组合成文件路径。 检查是否含有后缀.json strings.HasSu…...

大数据、人工智能、云计算、物联网、区块链序言【大数据导论】
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 本篇序言前 必看 【大数据导论】—大数据序言 这是…...

ComfyUI流程图、文生图、图生图步骤教学!
前言 leetcode , 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 …...
CSS基础知识学习指南
CSS基础知识学习指南 1. 介绍 CSS(层叠样式表)是用于描述HTML文档的呈现样式的语言。通过CSS,可以控制网页的布局、颜色、字体等各种样式,使得网页更加美观和用户友好。 2. CSS基础语法 CSS由选择器和声明块组成。选择器用于选…...
力扣hot100 -- 贪心算法
👂 ▶ 逍遥叹 - 胡歌&沈以城【Mashup】 (163.com) 👂 庐州月 - 许嵩 - 单曲 - 网易云音乐 2.7 小时,加上写博客,4 道题,😂 -- 希望二刷时,可以 3 小时,8 道题.... 目录 &…...
P2P文件传输协议介绍
P2P文件传输协议是一种基于对等网络(Peer-to-Peer,简称P2P)的文件共享和传输技术。以下是关于P2P文件传输协议的详细介绍: 一、定义与原理 P2P文件传输协议允许网络中的各个节点(即计算机或其他设备)之间…...
Spring Boot集成Spring Mobile快速入门Demo
1.什么是Spring Mobile? Spring Mobile是一个基于Spring Web MVC框架扩展的一个针对不同移动终端的应用开发框架。通过它我们在适配不同终端方面,就不用费劲心思了。 Spring Mobile的主要功能 自动设备检测: Spring Mobile在 server端内置了一个设备解…...

走进开源企业 | 湖南大学OpenHarmony技术实训活动在开鸿智谷顺利举办!
6月24日-6月26日,2024开放原子校源行之湖南大学信息科学与工程学院师生走进开源企业实训交流活动顺利落下帷幕。湖南大学信息科学与工程学院的师生代表团一行90人参与了湖南开鸿智谷数字产业有限公司(以下简称“开鸿智谷”)与母公司拓维信息系…...

TCP单进程循环服务器程序与单进程客户端程序
实验目的 理解并掌握以下内容: 网络进程标识(即套接字地址)在Linux中的数据结构与地址转换函数。网络字节序与主机字节序的定义、转换以及相关函数在网络编程中的应用。数据结构内存对齐的基本规则,以及基于数据结构构建PDU的基本方法。TCP单进程循环服务器与单进程客户端的…...

QT+winodow 代码适配调试总结(二)
已经好多年了, linux环境下不同版本的QT程序开发和部署,突然需要适配window环境程序调试,一堆大坑,还真是一个艰巨的任务,可是kpi下的任务计划,开始吧!! 1、首先我们自定义的动态库…...

百家讲坛 | 裴伟伟:企业中安全团队应当如何反馈漏洞
作者简介:裴伟伟,洞源实验室创始人,国家网安基地网络安全行业专家,网安加社区特聘专家,持有CISSP、PMP证书,曾在HITCON、可信云大会、开源产业大会等安全论坛发表演讲。曾任国内某安全实验室负责人、某互金…...

巧用Fiddler中的Comments提升接口测试效率
有没有同学在使用Fiddler时跟我遇到了同样的问题,就是想给某个抓包的请求进行注释!!!但是奇怪的是,根本没有Comments相关信息呀? 设置Comments 设置Comments非常容易,选中一个请求,…...

停车场车牌识别计费系统,用Python如何实现?
关注星标,每天学习Python新技能 前段时间练习过的一个小项目,今天再看看,记录一下~ 项目结构 说明: datefile文件夹:保存车辆信息表的xlsx文件 file文件夹:保存图片文件夹。ic_launcher.jpg是窗体的右上角…...

Linux内核——Linux内核体系模式(二)
1 Linux系统的中断机制 Linux内核将中断分为两类:硬件中断和软件中断(异常)。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31(0x00-0x1f)作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…...
Spring MVC的高级功能——异常处理(一)简单异常处理器
一、HandlerExceptionResolver接口 如果希望对Spring MVC中所有异常进行统一处理,可以使用Spring MVC提供的异常处理器HandlerExceptionResolver接口。Spring MVC内部提供了HandlerExceptionResolver的实现类SimpleMappingExceptionResolver。它实现了简单的异常处理…...

【面试干货】Static关键字的用法详解
【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可…...

软件工程实验
实验环境和需求 用户可以对相片进行按类别管理,用户可以设定不同的类别,然后上传照片到相应的类别中,并能进行照片的删除,注释 运行 运行并访问 localhost 8090,图片在数据库中的信息是D:/upgrade 后面的内容 se…...
对于复杂的网页布局,如多列布局和网格布局,CSS 有哪些最佳实践和技巧?
对于复杂的网页布局,如多列布局和网格布局,以下是一些CSS的最佳实践和技巧: 使用Flexbox或CSS Grid布局:Flexbox和CSS Grid是两个强大的CSS布局模型,可用于实现复杂的网页布局。Flexbox适用于单行或单列布局࿰…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...