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

Vue3.0 reactive与ref :VCA模式

简介

Vue3 最大的一个变动应该就是推出了 CompositionAPI,可以说它受ReactHook 启发而来;它我们编写逻辑更灵活,便于提取公共逻辑,代码的复用率得到了提高,也不用再使用 mixin 担心命名冲突的问题。

ref 与 reactive 是 Vue3 新推出的主要 API 之一,它们主要用于响应式数据的创建。

reactive 能做的,ref 都能胜任,并且 ref 底层还是使用 reactive 来做的!!!

ref 函数可以接收原始数据类型引用数据类型

reactive 函数只能接收引用数据类型

当你明确知道需要包裹的是一个对象,那么推荐使用 reactive,其他情况使用 ref 即可

reactive包装函数

<template><div><!-- 案列1 --><button @click="myClick">点我</button><div>{{ obj.name }}--{{ obj.age }}</div><div>{{ obj2.email }}</div><!-- <div>{{ obj3 }}</div> --><hr><!-- 列表案列 --><ul><li v-for="item in obj.datalist" :key="item">{{ item }}</li></ul><!-- 模糊查询案列 --><input type="text" v-model="obj.mytitle"><ul><li v-for="item in GetSelectItems()" :key="item">{{ item }}</li></ul></div>
</template>
<script>
import { reactive } from 'vue';
export default {setup() {//用reactive是一个包装函数,包装后就得到了一个响应式对象obj (setup中可以存在多个reactive,只是正常情况下一个就够用了,比如下面的obj 和obj2)//注意const是申明常量的,常量不是不可变的吗?为什么还可以通过obj.name = "李四"来改变它呢? //其实obj只是reactive({name: "张三",age: 29})这个对象的一个引用(指针),obj不能再进行修改,只是说obj不能再指向其他的对象了,例如:obj="aaa"就会报错,因为obj所指向对象的引用已经变化了。//但是obj指向的这个对象它本身的属性是可以修改的,所以 obj.name = "李四"不会报错const obj = reactive({name: "张三",age: 29,datalist: ["aaa", "bbb", "ccc"],mytitle: ""})const obj2 = reactive({ email: "abc@qq.com" })//const obj3=reactive("张三"); //reactive不支持这种简单类型的包装,它只支持复杂类型的包装,如对象,数组等。//const obj3=reactive("");     //reactive不支持这种简单类型的包装//const obj3=reactive(1);      //reactive不支持这种简单类型的包装const myClick = () => {obj.name = "李四"}const GetSelectItems = () => {//includes() 方法用于判断字符串是否包含指定的子字符串//filter方法是过滤方法, item表示当前遍历datalist数组的项,如果当前项包含了input中输入的值,则找出来,然后统一返回一个数组var selectIitemArr = obj.datalist.filter(item => item.includes(obj.mytitle))return selectIitemArr;}//所有的函数与对象都需要在return中进行返回//obj,myClick是定义在setup中的,它只能在setup中使用,为了在setup外面使用(例如DOM中)我们就必须要把他们暴露出去,就需要放到return中进行返回return {obj, //等同于obj:objobj2,obj3,myClick, //返回myClickGetSelectItems,}}
}</script>

ref包装函数

<template><div><!-- 案列1 --><button @click="myClick">点我</button><div>{{ obj.name }}--{{ obj.age }}</div><div>{{ obj2.email }}</div><div>{{ obj3 }}</div><div>{{ obj4 }}</div><div>{{ obj5 }}</div><div>{{ obj6?"中国":"美国" }}</div><hr><!-- 列表案列 --><ul><li v-for="item in obj.datalist" :key="item">{{ item }}</li></ul><!-- 模糊查询案列 --><input type="text" v-model="obj.mytitle"><ul><li v-for="item in GetSelectItems()" :key="item">{{ item }}</li></ul></div>
</template>
<script>
import { reactive, ref } from 'vue';
export default {setup() {//用reactive是一个包装函数,包装后就得到了一个响应式对象obj (setup中可以存在多个reactive,只是正常情况下一个就够用了,比如下面的obj 和obj2)//注意const是申明常量的,常量不是不可变的吗?为什么还可以通过obj.name = "李四"来改变它呢? //其实obj只是ref({name: "张三",age: 29})这个对象的一个引用(指针),obj不能再进行修改,只是说obj不能再指向其他的对象了,例如:obj="aaa"就会报错,因为obj所指向对象的引用已经变化了。//但是obj指向的这个对象它本身的属性是可以修改的,所以 obj.value.name = "李四"不会报错const obj = ref({name: "张三",age: 29,datalist: ["aaa", "bbb", "ccc"],mytitle: ""})const obj2 = ref({ email: "abc@qq.com" })const obj3=ref("王五"); //ref支持这种简单类型的包装  原理就是new Proxy({value:"王五"}) 注意:在DOM模板中使用{{obj3}}  在<script>中使用需要在后面加.value 如:obj3.valueconst obj4=ref("");     //ref支持这种简单类型的包装  原理就是new Proxy({value:""})const obj5=ref(1);      //ref支持这种简单类型的包装  原理就是new Proxy({value:1})const obj6=ref(true);const myClick = () => {obj.value.name = "李四"}const GetSelectItems = () => {//特别注意:经过ref包装函数包装的对象,在<script>中必须要在对象名称后面.value ,在DOM模板中则不需要.value// 比如:// obj.value.name; 获取obj对象中的name值// obj.value.age;  获取obj对象中的age值// obj.value.datalist; 获取obj对象中的datalist值// obj.value.mytitle;  获取obj对象中的mytitle值//includes() 方法用于判断字符串是否包含指定的子字符串//filter方法是过滤方法, item表示当前遍历datalist数组的项,如果当前项包含了input中输入的值,则找出来,然后统一返回一个数组var selectIitemArr = obj.value.datalist.filter(item => item.includes(obj.value.mytitle))return selectIitemArr;}//所有的函数与对象都需要在return中进行返回//obj,myClick是定义在setup中的,它只能在setup中使用,为了在setup外面使用(例如DOM中)我们就必须要把他们暴露出去,就需要放到return中进行返回return {obj, //等同于obj:objobj2,obj3,obj4,obj5,obj6,myClick, //返回myClickGetSelectItems,}}
}</script>

reactive与ref共存

<template><div><!-- 案列1 --><button @click="myClick">点我</button><div>{{ obj.name }}--{{ obj.age }}</div><div>{{ obj2.email }}</div><hr><!-- 可以直接用mydata --><ul><li v-for="item in mydata" :key="item">{{ item }}</li></ul><!-- 也可以将mydata放到reactive包装函数中然后通过obj对象来用 --><ul><li v-for="item in obj.mydata" :key="item">{{ item }}</li></ul><ul><li v-for="item in mylist.mydata" :key="item">{{ item }}</li></ul><div>{{mylist.obj.name}}</div></div>
</template>
<script>
import { reactive, ref } from 'vue';
export default {setup() {//有一种情况就是通过import导入的组件(JS)中存在用ref包装的,而我们当前组件组件用的是reactive包装的,为了保持风格统一(当然不统一也行)我们也可以将ref中的包装对象直接放到reactive包装函数中://举列:const mydata = ref([1, 2, 3]);//我们可以直接用mydata,也可以将mydata放到reactive包装函数中const obj = reactive({name: "张三",age: 29,datalist: ["aaa", "bbb", "ccc"],mytitle: "",mydata //也可以将ref包装函数包装的对象mydata放到reactive包装函数中})const mylist=ref({mydata, obj //也可以将reactive包装函数包装的对象obj放到ref包装函数中})const obj2 = reactive({ email: "abc@qq.com" })return {obj, //等同于obj:objobj2,mydata,mylist}}
}
</script>

相关文章:

Vue3.0 reactive与ref :VCA模式

简介 Vue3 最大的一个变动应该就是推出了 CompositionAPI&#xff0c;可以说它受ReactHook 启发而来&#xff1b;它我们编写逻辑更灵活&#xff0c;便于提取公共逻辑&#xff0c;代码的复用率得到了提高&#xff0c;也不用再使用 mixin 担心命名冲突的问题。 ref 与 reactive…...

项目实战 | 使用Linux宝塔面板搭建商城公众号小程序基础框架

项目实战 | 使用Linux宝塔面板搭建商城公众号&小程序基础框架 1. 小程序/公众号运行的必备条件2. 准备阿里云ECS主机3. 宝塔面板基本配置4. 通过宝塔面板安装相关服务5. 新建站点并进行初始配置6. 服务配置6.1. PHP配置6.2. 数据库配置6.3. Redis配置6.4. 消息队列Supervis…...

IDEA远程调试代码

IDEA->RUN->Edit Configurations 端口随便选一个&#xff0c;选择调试模块&#xff0c;然后用IDEA生成的命令调试 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:8081 -jar backend-1.18.11.jar &...

目标检测 图像处理 计算机视觉 工业视觉

目标检测 图像处理 计算机视觉 工业视觉 工业表盘自动识别&#xff08;指针型和数值型&#xff09;智能水尺识别电梯中电动车识别&#xff0c;人数统计缺陷检测&#xff08;半导体&#xff0c;电子元器件等&#xff09;没带头盔检测基于dlib的人脸识别抽烟检测和睡岗检测/驾驶疲…...

【1day】宏景OA get_org_tree.jsp接口SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录...

设计模式-迭代子模式

迭代子模式是一种行为设计模式&#xff0c;它提供了一种访问和遍历聚合对象中各个元素的方法&#xff0c;而不需要暴露聚合对象的内部表示。迭代子模式将遍历聚合对象的责任交给了迭代子对象&#xff0c;从而实现了聚合对象和迭代子对象的解耦。 在Java中&#xff0c;迭…...

绿色通道 快速理赔,渤海财险用实干书写服务品牌

7月底&#xff0c;受台风“杜苏芮”影响&#xff0c;北京市连续强降雨&#xff0c;西部、西南部、南部遭遇特大暴雨&#xff0c;房山、门头沟、丰台等地陆续出现山洪暴发现象。      灾害无情人有情&#xff0c;为更好地保障人民群众生命财产安全&#xff0c;渤海财险北京分…...

微信小程序怎么制作?【小程序开发平台教学】

随着移动互联网的快速发展&#xff0c;微信小程序已经成为了人们日常生活中不可或缺的一部分。从购物、支付、出行到社交、娱乐、教育&#xff0c;小程序几乎涵盖了我们生活的方方面面。那么&#xff0c;对于有营销需求的企业商家来说&#xff0c;如何制作一个自己的微信小程序…...

HTML、CSS和JavaScript,实现换肤效果的原理

这篇涉及到HTML DOM的节点类型、节点层级关系、DOM对象的继承关系、操作DOM节点和HTML元素 还用到HTML5的本地存储技术。 换肤效果的原理&#xff1a;是在选择某种皮肤样式之后&#xff0c;通过JavaScript脚本来加载选中的样式&#xff0c;再通过localStorage存储。 先来回忆…...

2103. 环和杆

2103. 环和杆 难度: 简单 来源: 每日一题 2023.11.02 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在杆上的分布。rings 中每两个字符形成一个…...

YOLOv5:修改backbone为SPPCSPC

YOLOv5&#xff1a;修改backbone为SPPCSPC 前言前提条件相关介绍SPPCSPCYOLOv5修改backbone为SPPCSPC修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬…...

css中flexbox和grid的区别

css中flexbox和grid的区别 我们是不是被那些不会按预期排列的元素所影响&#xff1f;这篇文章我们将深入探讨css中flexbox和grid的布局。通过了解他们的主要差异&#xff0c;我们会发现这些布局是如何改变我们网站的风格。 理解CSS布局 css布局是网页设计的一个重要方面&…...

uniapp循环对象列表---点击列表切换选中不同状态

目录 源码图片最后 源码 <template><view><ul><li v-for"(item, index) in list" click"toggleSelection(index)" :class"{selected: selectedIndex index}">{{ item }}<view :class"{selected: selectedInde…...

【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

前言 这里是【使用Python编写游戏辅助工具】的第二篇&#xff1a;键盘监听的应用。本文主要介绍使用Python实现事件监听功能。 键盘监听是指通过编程的方式监控用户在键盘上的按键操作。 在这里键盘监听的主要用途是&#xff1a; 监听我们按下的按键&#xff0c;如果按下了指…...

Shiny Server和ShinyProxy是什么,有什么区别?

调研以及参与过多个生物公司的生信工具研发&#xff0c;不管是ShinyServer还是ShinyProxy都有一定研究&#xff0c;尤其是ShinyServer。如果仅是本地化测试想快速的搭建Shiny应用&#xff0c;我推荐用Shiny Server&#xff0c;如果多并发用户且更好的线上管理Shiny应用&#xf…...

Java 客户端、服务端NIO大文件传输

一、需求 公司电脑不让使用U盘&#xff0c;又不想通过公司聊天软件传输&#xff0c;怕被监控。但是通过QQ、微信传输文件对文件大小又有限制。基于种种原因&#xff0c;自己简单写了个服务端、客户端进行文件传输&#xff0c;大文件最好在局域网内进行数据传输。 二、pom依赖…...

Unity3D与iOS的交互 简单版开箱即用

本文适合的情况如下&#xff1a; Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…...

限制LitstBox控件显示指定行数的最新数据(3/3)

实例需求&#xff1a;由于数据行数累加增加&#xff0c;控件加载的数据越来越多&#xff0c;每次用户都需要使用右侧滚动条拖动才能查看最新数据。 因此希望ListBox只加载最后10行数据&#xff08;不含标题行&#xff09;&#xff0c;这样用户可以非常方便地选择数据&#xff…...

Maven进阶系列-仓库和镜像

Maven进阶系列-仓库和镜像 文章目录 Maven进阶系列-仓库和镜像1. 仓库1.1 仓库类型1.2 寻找jar的基本优先级顺序&#xff1a;1.3 仓库优先次序验证示例 2. settings.xml文件2.1 mirrors2.1.1 没有配置mirror2.1.2 配置了mirror2.1.3 <mirrorOf> 2.2 servers2.3 profiles …...

mac下载安装jenkins

下载 https://get.jenkins.io/war/ 启动 使用命令行启动 java -jar jenkins.war 浏览器访问 IP:8080 或 localhost:8080 &#xff0c;对jenkins进行配置&#xff0c;刚开始需要输入密码 终端会展示密码和密码存放位置 jenkins插件下载地址&#xff0c; 下载后自行上传。 I…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...