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:obj
      obj2,
      obj3,
      myClick, //返回myClick
      GetSelectItems,
    }
  }
}

</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.value
    const 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:obj
      obj2,
      obj3,
      obj4,
      obj5,
      obj6,
      myClick, //返回myClick
      GetSelectItems,
    }
  }
}

</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:obj
      obj2,
      mydata,
      mylist
    }
  }
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov7模型轻量化改进之MobileOne骨干替换

本文在之前文章yolov7分割训练的基础上进行改进: https://blog.csdn.net/qq_41920323/article/details/129464115?spm=1001.2014.3001.5502 具体GitHub工程下载,环境安装配置,数据准备等,请借鉴之前的文章,此处只介绍如何进行改进。 MobileOne地址:https://github.com…

通付盾Web3专题 | 智能账户:数字时代基础单元

2008年10月31日&#xff0c;中本聪&#xff08;Satoshi Nakamoto&#xff09;在P2P foundation 网站发布比特币白皮书《比特币&#xff1a;一种点对点的电子现金系统》。转眼距比特币白皮书发布已过去15年。2009年1月比特币网络正式推出&#xff0c;当时每个比特币的价格仅为0.…

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…

idea集成测试插件替代postman

idea集成测试插件替代postman 兄弟萌&#xff0c;你再测试接口是否无bug是否流畅的时候是否还在使用“postman”来回切换进行测试呢&#xff1f; 页面切换进行测试&#xff0c;有没有感觉很麻烦呢&#xff1f; 打开postman&#xff0c;输入接口地址&#xff0c;有没有感觉很麻烦…

拓扑排序专题1 拓扑排序

题目&#xff1a; 样例&#xff1a; 输入 4 5 0 1 0 2 0 3 1 2 3 2 输出 0 1 3 2 思路&#xff1a; 拓扑序列含义 一个由图中所有点构成的序列 A 满足&#xff1a;对于图中的每条边 (x,y)(x,y)&#xff0c; x 在 A 中都出现在 y 之前&#xff0c;则称 A 是该图的一个拓扑序列…

阿里云无影升级2.0 云电脑解决方案时代到来

10月31日&#xff0c;杭州云栖大会上&#xff0c;阿里云宣布无影全新升级2.0&#xff1a;从云电脑到云上解决方案&#xff0c;帮助中小企业更便捷地构建云上办公&#xff0c;并开放无影产品及解决方案能力&#xff0c;为生态合作伙伴提供企业云平台&#xff0c;帮助其打造定制化…

Python小试牛刀:GUI(图形界面)实现计算器UI界面(二)

上一篇&#xff1a;Python小试牛刀&#xff1a;GUI&#xff08;图形界面&#xff09;实现计算器UI界面&#xff08;一&#xff09;-CSDN博客 在上一篇文章中介绍了Python GUI常用的库&#xff0c;以及运用GUI标准库tkinter仅设计了计算器的UI界面。 而在本篇文章&#xff0c;…

「Java开发指南」如何用MyEclipse搭建Spring MVC应用程序?(一)

本教程将指导开发者如何生成一个可运行的Spring MVC客户应用程序&#xff0c;该应用程序实现域模型的CRUD应用程序模式。在本教程中&#xff0c;您将学习如何&#xff1a; 从数据库表的Scaffold到现有项目部署搭建的应用程序 使用Spring MVC搭建需要MyEclipse Spring或Bling授…

本章内容的重点是对各种电子式电动机保护器电路的原理分析和故障维修指导,对电子式电动机保护器以下简称为电动机保护器。

上世纪八十年代之前&#xff0c;电子技术的应用尚处于初级阶段&#xff0c;对电动机的保护任务多由热继电器承担&#xff0c;国内型号为为JR20-XX系列、JR36-XX系列等。其保护机理如下&#xff1a;热继电器由发热元件、双金属片、触点及一套传动和调整机构组成。发热元件是一段…

【Linux】第八站:gcc和g++的使用

文章目录 一、解决sudo命令的问题二、Linux编译器-gcc/g1.gcc的使用2.g的使用 三、gcc编译链接过程1.预处理2.编译&#xff08;生成汇编&#xff09;3.汇编&#xff08;生成机器可识别代码&#xff09;4.链接&#xff08;生成可执行文件或库文件&#xff09;5.一些选项的意义 四…

SQLITE3 函数接口

简述 sqlite3 接口的核心元素: 两大对象&#xff0c;八大函数&#xff1b; 其中两个对象指的是: sqlite3 数据库连接对象 数据库的连接句柄(数据库的文件描述符) 代表你打开的那个 sqlite3 的数据库文件,后序对数据库的操作都需要用到这个对象 sqlite3_stmt SQL 语句对象…

从「码农」到管理者,E人程序员的十年蜕变

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 当我们谈论程序员创业时&#xff0c;常常会首先想到一些传统观念认为的挑战&#xff1a;沟通技巧不佳、逻…

各种爱心特效代码免费分享

「链接&#xff1a;https://pan.xunlei.com/s/VNi9l3Mqp9oEflga1T6M-ZUOA1?pwdsam3# 提取码&#xff1a;sam3”复制这段内容后打开手机迅雷App&#xff0c;查看更方便」 「链接&#xff1a;https://pan.xunlei.com/s/VNi9lWqdFIwdtD5sdCDZFamoA1?pwdka8b# 提取码&#xff1a;…

集简云x slack(自建)无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

slack是一个工作效率管理平台&#xff0c;让每个人都能够使用无代码自动化和 AI 功能&#xff0c;还可以无缝连接搜索和知识共享&#xff0c;并确保团队保持联系和参与。在世界各地&#xff0c;Slack 不仅受到公司的信任&#xff0c;同时也是人们偏好使用的平台。 官网&#x…

基于SSM的理发店管理系统

基于SSM的理发店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 公告信息 管理员界面 用户界面 摘要 基于SSM&#xff08;Spring、Spring MVC、…

1. PPT高效初始化设置

1. PPT高效初始化设置 软件安装&#xff1a;Office 2019 主题和颜色 颜色可以在白天与黑夜切换&#xff0c;护眼 切换成了黑色 撤回次数 撤回次数太少&#xff0c;只有20次怎么办 自动保存 有时忘记保存就突然关闭&#xff0c;很需要一个自动保存功能 图片压缩 图…

TypeScript之装饰器

一、是什么 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c; 访问符&#xff0c;属性或参数上 是一种在不改变原类和使用继承的情况下&#xff0c;动态地扩展对象功能 同样的&#xff0c;本质也不是什么高大上的结构&#xff0c;就…

网络质量探测

目录 一.BFD监测网络状态 二. NQA检测网络状态 一.BFD监测网络状态 BFD(BidrectionaL Forwarding Detection 双向转发检测)用于快速检测系统设备之间的发送和接受两个方向的通信故障&#xff0c;并在出现故障时通知生成应用。BFD 广泛用于链路故障检测&#xff0c;并能实现与…

Python画图之皮卡丘

Python-turtle画出皮卡丘&#xff08;有趣小游戏&#xff09; 一、效果图二、Python代码 一、效果图 二、Python代码 import turtledef getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensi…

在虚拟机centos7中部署docker+jenkins最新稳定版

在虚拟机centos7中部署dockerjenkins最新稳定版 查看端口是否被占用 lsof -i:80 查看运行中容器 docker ps 查看所有容器 docker ps -a 删除容器 docker rm 镜像/容器名称 强制删除 docker rmi -f 镜像名 查看当前目录 pwd 查看当前目录下所有文件名称 ls 赋予权限 chown 777 …