【VUE3学习手札】

VUE3学习手札

vue3成长之路学习笔记


文章目录

  • VUE3学习手札
  • 前言
  • 一、markRaw
      • 1.1 代码示例
      • 1.2 应用场景
      • 1.3 拓展(toRaw)
      • 1.4 实际应用
  • 二、ref 和 reactive


前言

主要用于自己的一个备忘,对知识点的查缺补漏


一、markRaw

将一个对象标记为不可被转为代理。返回该对象本身。
从而使其不会被 reactive 包裹,也就不会成为 Vue3 中的响应式对象

1.1 代码示例

<template><div><p> 姓名: {{person.name}}</p><p> 性别: {{person.sex}}</p><p> 爱好: {{person.likes}}</p><el-button @click="change">按钮</el-button></div>
</template><script setup>
import { reactive, markRaw } from 'vue'
let person = reactive({name: '张三',sex: '男',
})
let likes = ['吃饭', '睡觉']
// 往响应式对象中新增一个likes属性,该属性是响应式
// 但是我们使用markRaw包裹后这个likes属性值是不具有响应式的
person.likes = markRaw(likes)
// 因此试图是不会更新的
let change = () => {person.likes[0] = '我要吃饭'person.likes[1] = '我要睡觉'console.log(person.likes)
}
</script>
// 视图不会发生改变!!!

在这里插入图片描述

我们通过 markRaw 方法将 state.obj 标记为非响应式对象。这样做可以避免对 obj 的修改引起意外的响应式更新。
需要注意的是,一旦一个对象被标记为“非响应式”,它就无法再被 reactive 进行包裹成为响应式对象。所以在使用 markRaw 方法时,我们需要确保这个对象在后续的代码中不需要作为响应式对象来使用或者监听其变化

1.2 应用场景

  • 有些值不应被设置成响应式时,例如复杂的第三方类库等
  • 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能
  • 在动态渲染组件的时候我们就可以使用 markRaw 包裹。

1.3 拓展(toRaw)

markRaw 是声明(标记)一个不响应式的数据,

toRaw是将一个响应式的数据转化(还原)成不响应式的数据

代码示例

<template><div><el-button @click="change">自增</el-button>数值变化:<p>{{ state.count }}</p></div>
</template><script setup>
const state = reactive({count: 0,
})// 获取原始对象
const rawState = toRaw(state)// 验证原始对象与包装后的对象是否相等
console.log(rawState === state) // false
function change() {// 改变原始对象的值rawState.count += 1// 验证包装后的对象是否也受到了改变console.log(state.count) // 1
}
</script>
// 视图不会发生改变!!!
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b2fef4e5513d4dc88c9f415d3efc49c9.png)

1.4 实际应用

代码示例:

<template><el-tabs v-model="tabName"@tab-click="tabClick"><el-tab-pane label="组件A"name="a"></el-tab-pane><el-tab-pane label="组件B"name="b"></el-tab-pane><el-tab-pane label="组件C"name="c"></el-tab-pane><el-tab-pane label="组件D"name="d"></el-tab-pane></el-tabs><component :is="currentComponent[tabName]"></component>
</template><script setup>
import ComponentA from './ComponentA'
import ComponentB from './ComponentB'
import ComponentC from './ComponentC'
import ComponentD from './ComponentD'const tabName = ref('ComponentA')
const currentComponent = {a: markRaw(ComponentA),b: markRaw(ComponentB),c: markRaw(ComponentC),d: markRaw(ComponentD),
}
/* tab切换 */
function tabClick(val) {console.log('val.paneName', val.paneName, currentComponent)
}
</script>

二、ref 和 reactive

从vue2到vue3,组合式api语法结构上,很重要一块data内的声明变量变成了,使用ref()或使用reactive()来进行包裹,以实现响应式变化,但是有时候在使用上会有一些心智负担,什么时候使用ref(),什么时候使用reactive(),官方文档的释义说明:响应式:核心

整个 data 这一部分的内容,你只需要记住下面这一点。
以前在 data 中创建的属性,现在全都用 ref() 声明。
在 template 中直接用,在 script 中记得加 .value

Vue3 里,还提供了一个叫做 reactive 的 api。
但是我的建议是,你不需要关心它。绝大多数场景下,ref 都够用了

对比
Ref

  • 基本用法:Ref用于创建一个响应式的基本数据类型,如数字、字符串等。通过ref函数创建,访问和修改数据值需要使用.value。
  • 在setup()中使用:在setup()函数中,我们可以使用ref来创建响应式数据,并在模板中使用。
  • < script setup >语法:< script setup >语法是Vue3推荐的一种写法,可以在单文件组件中更简洁地使用ref。
  • 为何使用ref:Ref适用于管理简单的基本数据类型,如数字、字符串等。

示例:

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script setup>
import { ref } from 'vue';const count = ref(0);const increment = () => {count.value++;
};
</script>

Reactive

  • 基本概念:Reactive用于创建一个响应式对象,可以包含多个属性。通过reactive函数创建,对象的任何属性变化都会被检测到。
  • 在模板中使用Reactive:在模板中可以直接使用响应式对象,对对象的属性进行访问和修改。
  • 深层响应式:Reactive会递归地将对象的所有嵌套属性都变成响应式。
  • 与ref区别:Ref适用于简单数据类型,而Reactive适用于对象,可以处理对象的多个属性。
  • 为何使用Reactive:Reactive适用于管理复杂对象,使整个对象都变成响应式。

示例:

<template><div><p>User Name: {{ user.name }}</p><p>Age: {{ user.age }}</p><p>Order ID: {{ order.orderId }}</p></div>
</template><script setup>
import { reactive } from 'vue';const user = reactive({name: 'Alice',age: 30
});const order = reactive({orderId: '123456'
});
</script>

比较和选择

性能和适用场景:Ref比Reactive轻量,适合简单数据;Reactive适合处理复杂对象。根据具体场景选择。
对象的处理:Ref处理单一数据,Reactive处理对象及其嵌套属性。
局限性和注意事项:Ref不能直接处理对象,Reactive在处理大型数据对象时可能影响性能。

总结:使用Ref处理简单数据类型,Reactive处理复杂对象

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

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

相关文章

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 02:设计并使用断言

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

6spark期末复习

1)var a:Double5;var b:Int7;那么print(a*b) 2) var a:Int5; var bif(a>6) 7 println(b) 3)var a:Int16; var b:Int13; var cif(a>b) 5 else 7; println(c) 4. object TestDemo { print("B") def main(args: Array[String]): Unit { } } 5 def mai…

JeecgFlow排他网关演示

排他网关概念理解 排他网关&#xff0c;也称为异或(XOR)网关&#xff0c;用于流程中实现分支决策建模。排他网关需要搭配条件顺序流使用。 当流程流转到排他网关时&#xff0c;所有流程顺序流都是会顺序求解&#xff0c; 其中第一条条件为true的顺序流会被选中(当有多条顺序流都…

澳汰尔(Altair)3D 打印部件设计仿真——打造高效的增材制造设计

借助 Inspire Print3D&#xff0c;可加速创新、结构高效的 3D 打印部件的创建、优化和研究&#xff0c;提供快速准确的工具集&#xff0c;可用于实现选择性激光熔融 (SLM) 部件的设计和过程仿真。 工程师可以快速了解影响可制造性的工艺或设计变更&#xff0c;然后将部件和支撑…

JWT的优势

1、无状态&#xff1a; 2、有效避免了 CSRF 攻击&#xff1a;CSRF攻击&#xff0c;采用的是cookie进行攻击的&#xff1b;也避免XSS攻击&#xff0c;XSS采用的是js脚本进行攻击。 3、适合移动端应用&#xff1a;移动端没有cookie&#xff0c;jwt 4、单点登录友好&#xff1a…

SoC设计更重要的是IP管理

对于大多数片上系统&#xff08;SoC&#xff09;设计来说&#xff0c;最关键的任务不是RTL编码&#xff0c;甚至不是创建芯片架构。今天&#xff0c;SoC的设计主要使用来自多个供应商的各种IP块。这使得管理硅IP成为SoC设计过程中的主要任务。 一般来说&#xff0c;新编写的RTL…

Swift Combine — JUST Publisher

之前文章介绍的Publisher都是可以连续发送数据的&#xff0c;Subscriber也可以一直接收数据&#xff0c;除非收到了finished或者error而结束。而JUST Publisher则不同&#xff0c;它只向每个订阅者发送一次输出&#xff0c;然后结束。 一起来看一下下面的代码。 class JustVi…

从0到1:手动测试迈向自动化——手机web应用的自动化测试工具

引言&#xff1a; 在当今移动互联网时代&#xff0c;手机web应用已经成为人们生活中不可或缺的一部分。为了保证手机web应用的质量和稳定性&#xff0c;自动化测试工具变得十分重要。本文将介绍手机web应用自动化测试工具的选择和使用&#xff0c;提供一份超详细且规范的指南&a…

GPT3.5的PPO目标函数怎么来的:From PPO to PPO-ptx

给定当前优化的大模型 π \pi π&#xff0c;以及SFT模型 π S F T \pi_{SFT} πSFT​ 原始优化目标为: max ⁡ E ( s , a ) ∼ R L [ π ( s , a ) π S F T ( s , a ) A π S F T ( s , a ) ] \max E_{(s,a)\sim RL}[\frac{\pi(s,a)}{\pi_{SFT}(s,a)}A^{\pi_{SFT}}(s,a)] m…

力扣668.乘法表中第k小的数

力扣668.乘法表中第k小的数 二分查找 是否有k个比mid小的数 class Solution {public:int findKthNumber(int m, int n, int k) {auto check [&](int mid) -> bool{int res0;int row 1,col n;while(row < m){if(row * col < mid){res col;if(res > k) re…

软件测试全面指南:提升软件质量的系统流程

一、引言 随着软件行业的飞速发展&#xff0c;确保软件质量、稳定性和用户体验已成为企业竞争的关键。本文档旨在为测试团队提供一套全面的软件测试指南&#xff0c;通过规范测试用例管理、功能测试、接口测试、性能测试及缺陷管理等流程&#xff0c;助力测试团队实现高效、系统…

重构大学数学基础_week05_雅各比矩阵与雅各比行列式

这周来讲一下雅各比矩阵和雅各比行列式。 多元函数的局部线性属性 首先我们来回顾一下向量函数&#xff0c;就是我们输入一个向量&#xff0c;输出也是一个向量&#xff0c;我们假设现在有一个向量函数 这个函数意思就是在说&#xff0c;我们在原来的平面上有一个向量(x,y),经…

美团Meitu前端一面,期望27K

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、做的主要是什么项目&#xff0c;桌面端的吗&#xff1f; 2、用的主要是什么技术栈&#xff1f;vue有了解吗&#xff1f; 3、移动端开发一般怎么…

使用Ventoy制作U盘启动安装系统

简介 Ventoy是一个制作可启动U盘的开源工具。 无需反复地格式化U盘。你只要制作一次U盘启动盘&#xff0c;后面你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的系统镜像文件直接拷贝到U盘里面就可以启动了&#xff0c;无需其他操作。可以一次性拷贝很多个不同类型的镜像文件&…

vue+element-plus完美实现跨境电商商城网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.中英文样式切换 4.金钱类型切换 5.商品详情 6.购物车 7.登录 ​编辑 8.注册 9.个人中心 三、源码实现 1.项目依赖package.json 2.项目启动 3.购物车页面 四、总结 一、项目介绍 本项目在线预览&am…

深入解析Python闭包:定义、实例与应用

深入解析Python闭包&#xff1a;定义、实例与应用 引言 在Python编程中&#xff0c;闭包&#xff08;Closure&#xff09;是一个强大而实用的概念。它允许函数记住并访问其词法作用域&#xff08;lexical scope&#xff09;&#xff0c;即使在函数执行完毕后&#xff0c;其内…

提拔你,还是干掉你,从来不是看技术

有读者问我&#xff0c;技术人员工作5~10年就逐渐拉开了差距&#xff0c;这背后的原因是什么&#xff1f;思考片刻后&#xff0c;我回答&#xff1a;是底层能力。 K哥有20年职场经验&#xff0c;从程序员到技术高管一路走来&#xff0c;我总结了技术人员最重要的一些认知和底层…

如何通过小猪APP分发轻松实现Web封装APP

你有没有想过将你的网站或者Web应用变成一个真正的APP&#xff1f;这听起来可能有点复杂&#xff0c;但其实在今天的技术环境下&#xff0c;这已经变得非常简单了。特别是有了像小猪APP分发这样的工具&#xff0c;你可以轻松地将你的Web应用封装成一个APP。 为什么要将Web应用封…

Python 学习 第二册 第15章 Python和Web

----用教授的方法学习。 目录 15.1 屏幕抓取 15.1.1 Tidy 和 XHTML 解析 15.1.2 Beautiful Soup 15.2 使用 CGI 创建动态网页 15.2.1 第一步:准备 Web 服务器 15.2.2 第二步:添加#!行 15.2.3 第三步:设置文件权限 15.2.4 简单的 CGI 脚本 15.2.5 使用 cgitb 进行调…

【大数据·hadoop】项目实践:IDEA实现WordCount词频统计项目

一、环境准备 1.1&#xff1a;在ubuntu上安装idea 我们知道&#xff0c;在hdfs分布式系统中&#xff0c;MapReduce这部分程序是需要用户自己开发&#xff0c;我们在ubuntu上安装idea也是为了开发wordcount所需的Map和Reduce程序&#xff0c;最后打包&#xff0c;上传到hdfs上…