第三章 ref与reactive

news2024/11/17 16:27:11

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>

在这里插入图片描述

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

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

相关文章

Java并发编程第3讲——线程安全

目录 1 线程安全 1.1 谈谈你对线程安全的理解 1.2 Java中操作共享数据分类 1.2.1 不可变&#xff08;Immutable&#xff09; 1.2.2 绝对线程安全&#xff08;Thread-safe&#xff09; 1.2.3 相对线程安全&#xff08;Thread-compatible&#xff09; 1.2.4 线程兼容&…

外观模式——提供统一入口

1、简介 1.1、概述 在软件开发中&#xff0c;有时候为了完成一项较为复杂的功能&#xff0c;一个类需要和多个其他业务类交互&#xff0c;而这些需要交互的业务类经常会作为一个完整的整体出现&#xff0c;由于涉及的类比较多&#xff0c;导致使用时代码较为复杂。此时&#…

leetcode剑指offer75题

1 替换空格 var replaceSpace function(s) {const str s.split( );return str.join(%20) };2 左旋转字符串 var reverseLeftWords function(s, n) {const s1 s.slice(n)const s2 s.slice(0,n)return s1s2 };3 表示数值的字符串 //\d 匹配整数 1次或多次 //(\.\d*)? 满足小…

【腾讯云 Cloud studio 实战训练营】真正做到让你的开发成本只在编码

文章目录 写在前面CODINGCloud studio工具在线编码运行项目代码上传Cloud Studio 开发贪吃蛇写在最后 写在前面 期待已久的体验活动终于来了&#xff0c;Clound Studio用了才知道有多爽&#xff0c;Cloud Studio 是基于浏览器的集成式开发环境 (IDE)&#xff0c;为开发者提供了…

第二课:数据类型与变量

一. 数据类型 整型 byte short int long 小数 float double 字符 char 布尔 boolean 1.不论在16位&#xff0c;32位还是64位系统&#xff0c;int都占用4个字节&#xff0c;long都占用8个字节 &#x1f446;可移植性&#xff0c;可以跨平台运行&#xf…

【黑马头条之redis实现延迟任务】

本笔记内容为黑马头条项目的延迟任务精准发布文章部分 目录 一、实现思路 二、延迟任务服务实现 1、搭建heima-leadnews-schedule模块 2、数据库准备 3、安装redis 4、项目集成redis 5、添加任务 6、取消任务 7、消费任务 8、未来数据定时刷新 1.reids key值匹配 …

“智能算式批改系统”开发与部署优化

“智能算式批改系统”开发与部署优化 摘要 本次大作业搭建并实现了“智能算式批改系统”的开发与部署优化。“智能算式批改系统”是一款集yolo目标检测、paddleocr识别和四则运算判别算法的智能批改系统。该系统能够对上传包含四则运算题的页面进行批改&#xff0c;包括识别出…

【Docker】Docker安装Kibana服务

文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套&#xff08;质量有保证&#xff0c;内容详情&#xff09; 1. 什么是Kibana Kibana 是一款适用于Elasticsearch的数据可视化和管…

PyTorch深度学习实战(7)——批大小对神经网络训练的影响

PyTorch深度学习实战&#xff08;7&#xff09;——批大小对神经网络性能的影响 0. 前言1. 批处理概念2. 批处理的优势3. 批大小对神经网络性能的影响3.1 批大小为 323.2 批大小为 30,000 小结系列链接 0. 前言 在神经网络中&#xff0c;批( batch )是指一次输入网络进行训练或…

微服务体系<2> ribbon

1. 什么是负载均衡 比如说像这样 一个请求打在了nginx上 基于nginx进行负载分流 这就是负载均衡但是负载均衡分 服务端负载均衡和客户端负载均衡 客户端负载均衡 我user 从注册中心拉取服务 拉取order列表&#xff0c;然后发起getOne()调用 这就是客户端负载均衡 特点就是我…

【echarts】用js与echarts数据图表化,折线图、折线图堆叠、柱状图、折柱混合、环形图

echarts 是一个基于 JavaScript 的开源可视化库&#xff0c;用于构建交互式和自定义的图表&#xff0c;使数据更加直观和易于理解&#xff0c;由百度开发并于2018年捐赠给 Apache 软件基金会&#xff0c;后来改名为Apache ECharts 类似的还有Chart.js Chart.js地址&#xff1…

从此告别涂硅脂 利民推出新款CPU固态导热硅脂片:一片26.9元

利民(Thermalright)近日推出了新款Heilos CPU固态导热硅脂片&#xff0c;其中Intel版为26.9元&#xff0c;AMD版售价29.9元。 以往向CPU上涂硅脂&#xff0c;需要先挤一粒绿豆大小的硅脂&#xff0c;然后用塑料片涂匀&#xff0c;操作和清理对新手都极不友好。 该固态导热硅脂片…

string【2】模拟实现string类

string模拟实现 引言&#xff08;实现概述&#xff09;string类方法实现默认成员函数构造函数拷贝构造赋值运算符重载析构函数 迭代器beginend 容量size、capacity、emptyreserveresize 访问元素operator[] 修改insert插入字符插入字符串 appendpush_backoperatoreraseclearswa…

Python web实战 | 使用 Flask 实现 Web Socket 聊天室

概要 今天我们学习如何使用 Python 实现 Web Socket&#xff0c;并实现一个实时聊天室的功能。本文的技术栈包括 Python、Flask、Socket.IO 和 HTML/CSS/JavaScript。 什么是 Web Socket&#xff1f; Web Socket 是一种在单个 TCP 连接上进行全双工通信的协议。它是 HTML5 中的…

SAMBA 文件分享相关 笔记

目标说明 在Linux 安装Samba&#xff0c;然后在Windows端映射为网络硬盘 流程 Linux 端命令 apt install samba -y 默认情况下软件会询问是否迁移系统网络设置以搭建协议&#xff0c;选择迁移即可修改配置文件 vim /etc/samba/smb.conf Samba 的配置文件中会带一个名为 prin…

【Mybatis】Mybatis架构简介

文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块 3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件 4. 接口层 1.整体架构图 MyBatis…

第5集丨webpack 江湖 —— 项目发布 和 source map

目录 一、webpack项目发布1.1 新增发布(build)命令1.2 优化js和图片文件的存放路径1.3 执行1.4 效果 二、clean-webpack-plugin插件2.1 安装2.2 配置2.3 执行 三、source map3.1 配置3.2 生成的source map文件 四、定义符4.1 配置4.2 使用 五、工程附件汇总5.1 webpack.config.…

大麦订单一键生成 仿大麦订单生成

后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库config/Conn 不会可以看源码里有教程 下载程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

强化学习(EfficientZero)(应用于图像和声音)

目录 摘要 1.背景介绍 2.MCTS&#xff08;蒙特卡洛树搜索&#xff09;&#xff08;推理类模型&#xff0c;棋类效果应用好&#xff0c;控制好像也不错&#xff09; 3.MUZERO 4.EfficientZero&#xff08;基于MUZERO&#xff09; 展望 参考文献 摘要 在文中&#xff0c;基于…

【雕爷学编程】MicroPython动手做(20)——掌控板之三轴加速度5

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…