Vue3.0 reactive与ref :VCA模式

news2024/11/26 7:41:17

简介

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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch学习第五篇:NN与CNN代码实例

这篇文章详细介绍了全链接神经网络实现方法,以及卷积的实现方法。最后我们发现,卷积的实现方法与全链接大同小异,因为 torch 为我们做了很多工作,我们来看看这两个有什么区别。 我们使用 torch 框架来实现两种神经网络,来对图形进行分类。 NN 首先我们引入依赖包 impor…

归并排序深度剖析

目录 一、什么是归并排序&#xff1f; 二、归并排序的实现 三、归并排序非递归 一、什么是归并排序&#xff1f; 归并排序是建立在归并操作上的一种有效&#xff0c;稳定 的排序算法&#xff0c;该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型…

stm32 模拟spi

目录 简介 spi物理层 连接方式 框图 协议层&#xff1a; 数据处理 传输模式 模式0 起始和停止信号 发送和接收数据 模式1 模式2 模式3 总结 简介 spi物理层 SPI&#xff08; Serial Peripheral Interface&#xff0c; 串行外设接口&#xff09;是一种全双工同步…

Vlice DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

【51单片机】LED与独立按键(学习笔记)

一、点亮一个LED 1、LED介绍 LED&#xff1a;发光二极管 补&#xff1a;电阻读数 102 > 10 00 1k 473 > 47 000 2、Keil的使用 1、新建工程&#xff1a;Project > New Project Ctrl Shift N &#xff1a;新建文件夹 2、选型号&#xff1a;Atmel-AT89C52 3、xxx…

【Linux】Linux网络总结图详解

网络是进行分层管理的应用层HTTPHTPPS 传输层&#xff08;UDP、TCP&#xff09;UDPTCPTCP和UDP对比 网络层IP 数据链路层&#xff08;MAC&#xff09;/物理层&#xff08;以太网&#xff09;以太网通信&#xff08;负责网卡之间&#xff09; 网络是进行分层管理的 应用层 HTTP…

幂等性设计,及案例分析

一、redis锁处理幂等性失效 上面代码中&#xff0c;锁起不了作用&#xff1b; ——count方法&#xff0c;和insert方法在同一事务中&#xff0c;事务中包含锁&#xff0c;锁没有作用&#xff0c;锁的范围内&#xff0c;事务没提交&#xff0c;但释放锁后&#xff0c;事务提交前…

云安全与容器安全: 探讨在云环境和容器化应用中如何保护数据和工作负载的安全。

在当今数字化时代&#xff0c;云计算和容器化应用已经成为了企业业务的主要组成部分。这两项技术的普及&#xff0c;极大地提高了开发和部署的效率&#xff0c;但也带来了新的安全挑战。在本文中&#xff0c;我们将探讨云安全和容器安全的重要性&#xff0c;以及如何有效地保护…

WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…

Spring MVC (Next-1)

1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的&#xff0c;可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种&#xff0c;包括get,post,put,delete.分别对应获取…

低代码可视化逻辑编排工具:JNPF

目录 Intro 一、是什么&#xff1f; 提供自动化的解决方案 二、为什么受欢迎&#xff1f; JNPF自身特点——安全、方便、高效、低耗 对于企业&#xff0c;更“安全” 成本“最低”&#xff0c;效率“最高” 三、JNPF开发平台功能展示 技术介绍 参考地址 近几年&#xff0c;随着…

Tomcat下载地址(详细)

Apache Tomcat - Apache Tomcat 8 Software Downloadshttps://tomcat.apache.org/download-80.cgi2.找到Archives 3.选择下载的把版本 4.选择具体下载那个版本 5. 6.一般选择tar.gz结尾的压缩包

飞桨国际化应用案例:挪威广告企业Adevinta应用PaddleOCR提质增效

Adevinta&#xff0c;位于挪威奥斯陆的跨国在线分类广告公司&#xff0c;以其全球市场的图像处理API为特色。Adevinta的主要使命是构建全球买家和卖家之间的桥梁&#xff0c;其在线市场运营覆盖11个国家&#xff0c;拥有众多备受信任的品牌&#xff0c;如荷兰的marktplaats、德…

Stream 流对象的创建与各方法

Stream 流对象的创建与各方法 目录 1.0 Stream 流的说明 2.0 Stream 流对象的创建 2.1 对于 Collection 系列集合创建 Stream 流对象的方式 2.2 对于 Map 系列集合创建 Stream 流对象的方式 2.3 对于数组创建 Stream 流对象的方式 3.0 Stream 流的中间方法 3.1 Stream 流的 …

Jupyter notebook如何加载torch环境

默认你已经安装了anaconda 和 pytorch 环境。 1&#xff0c;必须要以管理员身份打开 Anaconda prompt终端&#xff0c; 2&#xff0c;进入pytorch环境中&#xff1a; conda activate pytorch_393&#xff0c;安装必要插件&#xff1a; &#xff08;1&#xff09;conda inst…

【力扣】2003. 每棵子树内缺失的最小基因值

【力扣】2003. 每棵子树内缺失的最小基因值 文章目录 【力扣】2003. 每棵子树内缺失的最小基因值1. 题目介绍2. 思路3. 解题代码4. Danger参考 1. 题目介绍 有一棵根节点为 0 的 家族树 &#xff0c;总共包含 n 个节点&#xff0c;节点编号为 0 到 n - 1 。 给你一个下标从 0…

国密SM算法及实现加密和解密

一 引入pom <dependency><groupId>com.antherd</groupId><artifactId>sm-crypto</artifactId><version>0.3.2</version></dependency> 二 代码实现 package com.example.ytyproject.component;import com.antherd.smcrypto.…

[架构之路-250/创业之路-81]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业内的数据与数据库

目录 一、数据概述 1.1 数据 1.2 企业信息系统的数据 1.3 大数据 1.4 数据与程序的分离思想 1.5 数据与程序的分离做法 1.6 数据库的基本概念 1.7 企业数据来源 1.8 企业数据架构 二、常见的数据库类型 2.1 数据库分类 2.1 数据库类型 2.2 常见的数据库类型、应用…

在前端实现小铃铛上展示消息

点击铃铛显示如下消息框&#xff1a; 如果点击消息&#xff0c;可以实现消息从列表中移除,并从铃铛总数上进行扣减对应的已读消息数。 关于以上功能的实现方式&#xff1a; <!-- 铃铛位置 --><i class"el-icon-bell" click"showPopover true"&…

torch_geometric,scatter,sparse, cluster的安装失败

首先&#xff0c;对于自己的电脑环境是 已将安装3.9版本的python&#xff0c;成功安装11.6版本的cuda和1.31.1版本的torch。 现在想要安装torch_geometric&#xff0c; -需要先安装scatter&#xff0c;sparse&#xff0c; cluster。 直接安装失败&#xff0c;报错如下&…