第三章 ref与reactive

ref

  1. ref 变为响应式数据
  2. shallowRef 浅层响应式数据(响应式到 .value为止)
  3. isRef 判断是否为ref响应式数据
  4. triggerRef 强制触发依赖更新
  5. customRef 自定义ref函数
<template>
  <div class="App">
    {{ stu }}
    <button @click="changeRefStu">ref测试</button>

    {{ stu2 }}
    <button @click="changeShallowRef">shallowRef测试</button>
    <button @click="changeShallowRef2">triggerRef测试</button>

    {{ stu3 }}
    <button @click="changeCustomRef">customRef测试</button>
  </div>
</template>

<script setup lang="ts">
import { ref, isRef, shallowRef, triggerRef, customRef } from "vue";

// 1.ref 改变数据,自动触发依赖更新
const stu = ref({ name: "cjc" });

function changeRefStu() {
  stu.value.name = "CCC";
  console.log("stu", stu.value);
  // isRef
  console.log("isRef(stu)", isRef(stu));
}

// 2. shallowRef 浅层响应式
const stu2 = shallowRef({ name: "cjc" });
function changeShallowRef() {
  // 修改不成功,浅层shallowRef的响应式到 .value为止
  // 故 stu2.value.name = "stu2"; 无法更新视图
  stu2.value = { name: "CCC" };
  console.log("stu2", stu2.value);
  // isRef
  console.log("isRef(stu2)", isRef(stu2));
}

function changeShallowRef2() {
  stu2.value.name = "stu2";
  // 强制触发依赖更新
  triggerRef(stu2);
  console.log("stu2", stu2.value);
}

// 3. customRef 自定义响应式数据
function MyRef<T>(value: T) {
  return customRef((track, trigger) => {
    return {
      get() {
        // track收集依赖
        track();
        return value;
      },
      set(newVal: T) {
        value = newVal;
        // 强制触发依赖更新
        trigger();
      },
    };
  });
}
const stu3 = MyRef({ name: "cjc" });
function changeCustomRef() {
  // stu3.value.name = "CCC";
  stu3.value = { name: "CCC" };
  console.log("stu3", stu3.value);
}
</script>

<style scoped></style>

reactive

  1. reactive 变为响应式数据(只能将引用类型转换为响应式:对象、数组、set、map)
  2. shallowReactive 浅层响应式数据(响应式到第一层属性为止)

ref与reactive区别:
reactive 取值、改值 不用.value解包

1.对象

<template>
  <div class="App">
    <form>
      <div>
        姓名:<input type="text" v-model="formData.name" name="" id="" />
        <p>{{ formData.name }}</p>
      </div>
      <div>
        年龄:<input type="text" v-model="formData.age" name="" id="" />
        <p>{{ formData.age }}</p>
      </div>
      <button @click.prevent="commit">提交</button>
    </form>
  </div>
</template>

<script setup lang="ts">
import { reactive } from "vue";

// reactive 将引用类型转换为响应式
// 对象、数组、set、map
const formData = reactive({
  name: "ccc",
  age: "999",
});
function commit() {
  console.log("formData", formData);
}
</script>

<style scoped></style>

2.数组
给reactive包裹的响应式数组直接赋值为普通数组,会失去响应式

<template>
  <div class="App">
    {{ arr }}
    <button @click="addItem">arr.push()</button>
  </div>
</template>

<script setup lang="ts">
import { reactive } from "vue";

let arr = reactive([1, 2]);
console.log("arr", arr);

// arr直接赋值为数组,失去响应式
// arr = [1, 2, 3];
// console.log("arr", arr);

// 保持响应式方法1 push
function addItem() {
  arr.push(3);
  console.log("arr", arr);
}
</script>

<style scoped></style>

3.shallowReactive

<template>
  <div class="App">
    {{ obj }}
    <button @click="changeObj1">修改obj.a.b.c</button>
    <button @click="changeObj2">修改obj.a</button>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive, shallowReactive } from "vue";
const obj = shallowReactive({
  a: {
    b: {
      c: "cjc",
    },
  },
});

console.log("obj修改前", obj);

function changeObj1() {
  obj.a.b.c = "CCC";
  console.log("changeObj1修改后", obj);
}

function changeObj2() {
  obj.a = {
    b: {
      c: "CCC666",
    },
  };
  console.log("changeObj2修改后", obj);
}
</script>

<style scoped></style>

在这里插入图片描述
在这里插入图片描述

toRef、toRefs、toRaw

  1. toRef 将响应式对象的指定属性变为响应式(对非响应式对象没用)
  2. toRefs 将响应式对象的所有属性变为响应式
  3. toRaw 返回由 reactive()、readonly()、shallowReactive() 或者 shallowReadonly() 创建的代理对应的原始对象
<template>
  <div class="APP">{{ obj.name }}-{{ obj.age }}</div>
</template>

<script setup lang="ts">
import { ref, reactive, toRef, toRefs } from "vue";
const obj = reactive({
  name: "cjc",
  age: 100,
  hobbies: [1, 2, 3],
});

// 0.打印reactive响应式数据的属性
console.log("name", obj.name);
console.log("age", obj.age);
console.log("hobbies", obj.hobbies);

// 1.将响应式对象obj的指定属性name变为ref响应式
const name = toRef(obj, "name");
console.log("name", name);

// 2.将响应式对象obj的所有属性变为ref响应式
const { age, hobbies } = toRefs(obj);
console.log("age", age);
console.log("hobbies", hobbies);
</script>

<style scoped></style>

在这里插入图片描述

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

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

相关文章

国际化警告Fall back to translate ‘creator‘ key with ‘zn‘ locale.

发现是自己粗心写错了一个单词 这个需要改成zh messages里面也是zh:zh

忘记安卓图案/密码锁如何解锁?

如何解锁Android手机图案锁&#xff1f;如何删除忘记的密码&#xff1f;Android 手机锁定后如何重置&#xff1f;这是许多智能手机用户在网上提出的几个问题。为了回答这些问题&#xff0c;我们想出了一些简单有效的方法来解锁任何设备而不丢失数据。 忘记手机密码可能会令人恐…

大数据技术之ClickHouse---入门篇---介绍

星光下的赶路人star的个人主页 一棵树长到它想长到的高度之后&#xff0c;它才知道怎样的空气适合它 文章目录 1、Clickhouse入门1.1 什么是Clickhouse1.1.1 Clickhouse的特点1.1.1.1 列示储存1.1.1.2 DBMS的功能1.1.1.3 多样化引擎1.1.1.4 高吞吐写入能力1.1.1.5 数据分区与线…

机器学习:自动编码器Auto-encoder

Self-supervised Learning Framework 不用标注数据就能学习的任务&#xff0c;比如Bert之类的。但最早的方法是Auto-encoder。 Outline Auto-encoder encoder输出的向量&#xff0c;被decoder还原的图片&#xff0c;让输出的图片与输入的图片越接近越好。 将原始的高维向量变…

ChatGPT+MidJourney 3分钟生成你的动画故事

chatgpt是真的火了&#xff0c;chatgpt产生了一个划时代的意义——自chatgpt起&#xff0c;AI是真的要落地了。 chatgpt能做的事情太多了&#xff0c;多到最初开发模型的程序员自己&#xff0c;也没法说得清楚chatgpt都能做啥&#xff0c;似乎只要你能想得到&#xff0c;它都有…

自动callback

using UnityEngine;public class AsyncCallbackScript : MonoBehaviour {public delegate void fun(string msg);void Start(){fun test AAA;//test.BeginInvoke("天王盖地虎", asyncCallback > BBB(), null);test.BeginInvoke("天王盖地虎 宝塔镇河妖"…

测试用例实战

测试用例实战 三角形判断 三角形测试用例设计 测试用例编写 先做正向数据&#xff0c;再做反向数据。 只要有一条边长为0&#xff0c;那就是不符合要求&#xff0c;不需要再进行判断&#xff0c;重复。 四边形 四边形测试用例

Linux6.2 ansible 自动化运维工具(机器管理工具)

文章目录 计算机系统5G云计算第一章 LINUX ansible 自动化运维工具&#xff08;机器管理工具&#xff09;一、概述二、ansible 环境安装部署三、ansible 命令行模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9.ping …

day49-Todo List(待办事项列表)

50 天学习 50 个项目 - HTMLCSS and JavaScript day49-Todo List&#xff08;待办事项列表&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" co…

word xls有用小技巧

不少office、代码编辑等软件&#xff0c;很简单高效小技巧。Word xlsx 某一行或列不动&#xff1a; 视图》冻结窗格》冻结首行 eclispe 全局搜索 CtrlH 制定变量、名称搜索 鼠标左键点中CtrlAltG

el-table 表格头部合并

<el-table v-loading"listLoading" :key"tableKey" :data"list" stripe border fit highlight-current-rowstyle"width: 100%;" size"mini"><el-table-column label"第一行" align"center">…

使用DataX实现mysql与hive数据互相导入导出

一、概论 1.1 什么是DataX DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 1.2 DataX 的设计 为了解决异构数据源同步问题&#xf…

HTML5前端开发工程师的岗位职责说明(合集)

HTML5前端开发工程师的岗位职责说明1 职责 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5相关技术开发移动平台的web前端页面; 2、基于HTML5.0标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、持续的优化前端体验和页面响应速度&#xff0c;并保证兼容性和…

C# NDArray System.IO.FileLoadException报错原因分析

C# NDArray System.IO.FileLoadException 报错原因分析&#xff1a; 1.NuGet程序包版本有冲突 2.统一项目版本 1.打开解决方案NuGet程序包设置 2.查看是否有版本冲突 3.统一版本冲突

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

【UE5】快速认识入门

目录 &#x1f31f;1. 快速安装&#x1f31f;2. 简单快捷键操作&#x1f31f;3. 切换默认的打开场景&#x1f31f;4. 虚幻引擎术语 &#x1f31f;1. 快速安装 进入Unreal Engine 5官网进行下载即可&#xff1a;UE5 &#x1f4dd;官方帮助文档 打开后在启动器里创建5.2.1引擎…

Java并发系列之一:JVM线程模型

什么是线程模型&#xff1a; Java字节码运行在JVM中&#xff0c;JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时&#xff0c;势必需要调用操作系统的相关接口。也就是说&#xff0c;JVM线程与操作系统线程之间存在着某种映射关系&#xff0c;这两种不同维…

Qt信号与槽机制的本质

引入 对象与对象之间的通信有多个方式&#xff0c;如果我们要提供一种对象之间的通信机制。这种机制&#xff0c;要能够给两个不同对象中的函数建立映射关系&#xff0c;前者被调用时后者也能被自动调用。 再深入一些&#xff0c;两个对象如果都互相不知道对方的存在&#xff…

搭建网站 --- 快速WordPress个人博客并内网穿透发布到互联网

文章目录 快速WordPress个人博客并内网穿透发布到互联网 快速WordPress个人博客并内网穿透发布到互联网 我们能够通过cpolar完整的搭建起一个属于自己的网站&#xff0c;并且通过cpolar建立的数据隧道&#xff0c;从而让我们存放在本地电脑上的网站&#xff0c;能够为公众互联…

【phaser微信抖音小游戏开发002】hello world!

执行效果&#xff1a; 将以下代码文本内容&#xff0c;放入到game.js中即可。目录结构如下图 import ./js/libs/weapp-adapter import ./js/libs/symbolGameGlobal.window.scrollTo () > { };//防止真机出错 import Phaser from ./js/phaser//引入Phaservar {windowWidth, …