创建响应式数据

news/2024/12/24 9:39:58/文章来源:https://www.cnblogs.com/fragmentary/p/18626647

创建响应式数据

Vue2中

​ 在vue2中数据写在对应的data中就是响应式的。

Vue3

ref :可以定义基本类型的响应式数据

先要导入对应的ref,然后才能使用

import {ref} from 'vue'

作用:定义响应式变量。

语法:let xxx = ref(初始值)

返回值:一个RefImpl的实例对象,简称ref对象refref对象的value属性是响应式的

注意点:

JS中操作数据需要:xxx.value,但模板中不需要.value,直接使用即可。

​ 对于let name = ref('张三')来说,name不是响应式的,name.value是响应式的。

<template><div class="person"><h2>姓名: {{ name }}</h2><h2>年龄: {{ age }}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="showTel">查看联系方式</button></div>
</template><script setup lang="ts" name="Person234">import {ref} from 'vue'//######  数据(原本写在data中)  ######let name = ref('张三');let age = ref(18);let tel = "18888888888";//######  方法(原本写在methods中) ######function changeName() {name.value = "李四";console.log(name.value);}function changeAge() {age.value += 1;console.log(age.value);}function showTel() {alert(tel);}
</script><style>
.person {background-color: skyblue;box-shadow: 0 0 10px; /* 盒子阴影 */border-radius: 10px;padding: 20px;
}button {margin: 0 5px;
}
</style>
reactive:只能定义对象类型的响应式数据

作用:定义一个响应式对象(基本类型不要用它,要用ref,否则报错)

语法:let 响应式对象= reactive(源对象)

返回值:一个Proxy的实例对象,简称:响应式对象。

注意点:reactive定义的响应式数据是“深层次”的。

<template><div class="person"><h2>一辆{{car.brand}}, 价值{{car.price}}</h2><button @click="changePrice">修改汽车的价格</button><ul><li v-for="g in games" v-bind:key="g.id">{{g.name}}</li></ul><button @click="changeFirstGame">修改第一个游戏的名字</button></div>
</template><script setup lang="ts" name="Person234">import {reactive} from 'vue'//###### 数据 ######let car = reactive({brand: '小米S7', price: 30});let games = reactive([  //数组也是属于对象范畴的{id: 1, name:'原神'},{id: 2, name:'CF'},{id: 3, name:'王者荣耀'}])//###### 方法 ######function changePrice() {car.price += 10;console.log(car);}function changeFirstGame() {console.log(games);games[0].name = '三国志';}
</script><style>
.person {background-color: skyblue;box-shadow: 0 0 10px; /* 盒子阴影 */border-radius: 10px;padding: 20px;
}button {margin: 0 5px;
}
</style>
ref:可以定义对应类型的响应式数据

​ 其实ref接收的数据可以是:基本类型对象类型

​ 若ref接收的是对象类型,内部其实也是调用了reactive函数。

<template><div class="person"><h2>一辆{{car.brand}}, 价值{{car.price}}</h2><button @click="changePrice">修改汽车的价格</button><ul><li v-for="g in games" v-bind:key="g.id">{{g.name}}</li></ul><button @click="changeFirstGame">修改第一个游戏的名字</button></div>
</template><script setup lang="ts" name="Person">import {ref} from 'vue'//###### 数据 ######let car = ref({brand: '小米S7', price: 30});let games = ref([  //数组也是属于对象范畴的{id: 1, name:'原神'},{id: 2, name:'CF'},{id: 3, name:'王者荣耀'}])//###### 方法 ######function changePrice() {car.value.price += 10;console.log(car);}function changeFirstGame() {console.log(games);games.value[0].name = '三国志';}
</script><style>
.person {background-color: skyblue;box-shadow: 0 0 10px; /* 盒子阴影 */border-radius: 10px;padding: 20px;
}button {margin: 0 5px;
}
</style>
ref 对比 reactive

宏观角度看:

  1. ref用来定义:基本类型数据对象类型数据

  2. reactive用来定义:对象类型数据

  • 区别:
  1. ref创建的变量必须使用.value(可以使用volar插件自动添加.value)。

  2. reactive重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。(具体参考vue文档reactive的局限性)

  • 使用原则:
  1. 若需要一个基本类型的响应式数据,必须使用ref
  2. 若需要一个响应式对象,层级不深,refreactive都可以。
  3. 若需要一个响应式对象,且层级较深,推荐使用reactive

参考代码:

<template><div class="person"><h2>一辆{{car.brand}}, 价值{{car.price}}</h2><button @click="changePrice">修改汽车的价格</button><button @click="changeCar">修改汽车</button><hr><h2>当前求和位: {{sum}}</h2><button @click="changeSum">点我sum+1</button></div>
</template><script setup lang="ts" name="Person">import {reactive, ref} from 'vue'//###### 数据 ######let car = reactive({brand: '小米S7', price: 30});let sum = ref(0)//###### 方法 ######function changePrice() {car.price += 10;console.log(car);}function changeSum() {sum.value += 1;console.log(sum.value);}function changeCar() {// car = {brand: '马自达', price: 20};            //无效,修改了原本的整个对象// car = reactive({brand: '马自达', price: 20});  //无效,如果重新reactive 其实已经断开了最开始的设置Object.assign(car, {brand: '马自达', price: 20}); //有效}
</script><style>
.person {background-color: skyblue;box-shadow: 0 0 10px; /* 盒子阴影 */border-radius: 10px;padding: 20px;
}button {margin: 0 5px;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度剖析】自主可控的全国产方案,基于龙芯LS2K1000LA-i!

龙芯LS2K1000LA-i产品简介 LS2K1000LA-i是龙芯双核LoongArch LA264自主架构处理器。创龙科技基于LS2K1000LA-i设计的工业核心板(SOM-TL2K1000)板载的CPU、ROM、RAM、电源、晶振、连接器等所有元器件均采用国产工业级方案,国产化率100%。 此外,创龙科技基于LS2K1000LA-i设计的…

协作文档让销售工作事半功倍的秘密

在现代医疗销售行业中,高效协同是成功的关键。无论是销售方案的制定,客户拜访记录的共享,还是跨部门的合作,在线协作文档正在成为推动团队效率和精准度的核心工具。特别是在医疗销售这种信息密集型领域,在线协作文档不仅改变了团队的沟通方式,更重塑了销售流程,助力企业…

这款跨网文件安全交换系统 凭什么受到各行业的欢迎?

跨隔离网的文件传输交换,这是各个行业都会面临的场景,能解决传输问题的工具也不少,可为什么说有一款跨网文件安全交换系统,在各行业中应用都很广泛,受到各行业的欢迎呢?首先我们来看看跨网文件传输有哪些需求。一、跨网文件传输的普遍需求 跨网文件传输的普遍需求与挑战可…

模型上下文协议MCP

MCP(Model Context Protocol) Anthropic推出的一种开放协议,旨在统一LLM应用于外部数据源之间的通讯协议使之无缝集成,MCP提供了标准化协议使得LLM与所需要的上下文无缝衔接。使用MCP可以插件式为LLM的集成各种外部数据源。MCP概念上图为MCP官方所描述的MCP架构图,MCP Hosts…

TB级大文件如何安全又轻松地发送?FMail文件邮能实现

许多行业的企业存在着发送GB级、TB级大文件的业务场景,如半导体企业、汽车制造企业、跨境电商、地图测绘、生物科研等,都涉及大量大文件的内部及内外部流转需求。 在进行大文件传输时,企业常用的方式主要包括传统邮件、移动U盘拷贝、FTP传输,以及硬盘刻录通过车辆物理运输等…

客户不回消息?试试这些超实用沟通技巧

在销售与客户沟通过程中,我们时常会面临客户未回复消息的情境,这时应该如何妥善处理呢?以下提供了一些实用的沟通话术,旨在帮助你在各种情境下都能更有效地与客户取得联系。 初次接触后客户未回应 客户或许对初次接收的信息不感兴趣,又或是信息众多而被忽略。 推荐话术:“…

Spring事务管理深度解析-从实践到原理

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种。 编程式事务 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: try {//TODO somethingtransactionManager.commit(status); } c…

创建用于预测序列的人工智能模型,设计模型架构。

上一篇:《创建用于预测序列的人工智能模型,设计数据集》 序言:在前一篇中,我们创建了用于训练人工智能模型的数据集。接下来,就要设计模型的架构了。其实,人工智能模型的开发关键并不在于代码量,而在于其中的数学原理和数据集(即人类经验)的深度与质量。 创建模型的架…

原来Flutter背后的布局原理是这样的

文章首发博客网站,由于格式解析问题,你可以前往阅读原文如果你是一名web开发者应该对于元素的布局不陌生,直接给目标元素定义尺寸就可以了,如css的width/height 、android的layout_width等等,但在flutter中同样的尺寸定义可能并不会呈现出自己想要的效果 扫码关注公众号,…

UML之包与包图

了解UML的人都知道UML中也有包的概念,包在UML中作用与面向对象编程语言中类似,它是管理对象的工具,也是解决对象同名冲突的手段。 在UML中,包的表示图形是一个左上角带标签的矩形,而包名可以标注于矩形中央(如下图所示,包名Package1位于矩形中央)或者左上角的标签之内。…

读数据保护:工作负载的可恢复性15公有云

公有云1. 云不是万能的 1.1. 其实根本就没有所谓的云,它只不过是别人的计算机而已 1.2. 云、SaaS以及Kubernetes,都没有改变数据保护与数据所有权的基本原则 1.3. 数据是你自己的,你必须负责给它们做备份1.3.1. 除非有人明确保证替你做备份,否则你还是必须自己做1.3.2. 就算…