【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>
// 视图不会发生改变!!!

在这里插入图片描述

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.mfbz.cn/a/720451.html

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

相关文章

【启明智显技术分享】工业级HMI芯片-Model系列关于SDCard / Udisk 烧录时显示进度条和数字百分比技术指导

【Model系列芯片】 是启明智显针对工业、行业以及车载产品市场推出的系列HMI芯片&#xff0c;主要应用于工业自动化、智能终端HMI、车载仪表盘、两轮车彩屏仪表、串口屏、智能中控、智能家居、充电桩显示屏、储能显示屏、工业触摸屏等领域。此系列具有高性能、低成本的特点&am…

01studio的miropython哥伦布407开发板真实管脚

抹黑的管脚都不能用&#xff01;绿色是sd卡占用&#xff0c;红色的是串口占用&#xff0c;还有其他的只能看原理图了 管脚都引出来了&#xff0c;不能用&#xff0c;引出来干嘛呢&#xff1f;纯瞎耽误功夫 谨慎使用吧。

C++ 62 之 冒泡排序

#include <iostream> // #include <string> #include <cstring>using namespace std;// 冒泡排序:函数模板 template<typename T> void mySort(T arr[], int len){ // size参数是数组的个数&#xff0c;一定是int型的for (size_t i 0; i < len -1;…

玩转编程的终极挑战,C++究竟有多难?

C是一门非常强大和灵活的编程语言&#xff0c;它可以实现面向对象、泛型、元编程等多种编程范式&#xff0c;可以开发高性能的系统软件、游戏、图形、网络等各种应用。但是&#xff0c;C也是一门非常复杂和难学的语言&#xff0c;很多初学者在学习C的过程中会遇到很多困难和挫折…

mysql下载安装教程(图文详细版)

如果一次没成功的话&#xff0c;就删掉重安&#xff08;前提是清理干净&#xff09;&#xff08;up就下了好几次&#xff0c;在错误中找到答案&#xff09; navicat(可视化工具)在其他文章里 一、mysql下载 进入官网地址https://www.mysql.com/downloads/ 然后就开始下载了&…

C++ 48 之 继承的基本语法

#include <iostream> #include <string> using namespace std;// 定义一个基类&#xff0c;把公共的部分写在这里&#xff0c;以后让别的类继承即可 class BasePage{ public:void header(){cout << "公共的头部"<< endl;}void footer(){cout…

如何恢复iPhone iCloud云盘资料删除?给出建议

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【尚庭公寓SpringBoot + Vue 项目实战】后台岗位管理(十六)

【尚庭公寓SpringBoot Vue 项目实战】后台岗位管理&#xff08;十六&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】后台岗位管理&#xff08;十六&#xff09;1、业务说明2、逻辑模型介绍3、接口开发3.1、分页查询岗位信息3.2、保存或更新岗位信息3.3、根据ID删…

Flutter 小技巧之面试题里有意思的异步问题

很久没更新小技巧系列了&#xff0c;本次简单介绍一下 Flutter 面试里我认为比较有意思的异步基础知识点。 首先我们简单看一段代码&#xff0c;如下代码所示&#xff0c;是一个循环定时器任务&#xff0c;这段代码里&#xff1a; testFunc 循环每 1 秒执行一次 asyncWorkasy…

PAT B1008. 数组元素循环右移问题

题目描述 一个数组A中存有N(N>O)个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M(M≥0)个位置,即将A中的数据由( …)变换为(……)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,则应如何设计移动的方法?输…

[vue3]掌握pinia

pinia Pinna是vue的最新状态管理工具, 用来替代vuex 官网: Pinia | The intuitive store for Vue.js 优势 更简洁的API, 去掉了mutaion与Vue3配套的组合式API风格去掉了modules, 每个store都是独立的模块更好的TS支持, 提供可靠的类型推断 安装 命令: npm i piniamain.js挂…

国内docker镜像加速

自己注册一个阿里云或者华为云的账户&#xff0c;搜索镜像 点击开通&#xff0c;再点击镜像加速器&#xff0c;可以看到自己的加速器地址&#xff0c;然后替换就可以了。再去pull即可成功&#xff0c;但是响应还是要慢一点

【多模态】39、HRVDA | 基于高分辨率输入的高效文档助手(CVPR2024)

论文&#xff1a;HRVDA: High-Resolution Visual Document Assistant 代码&#xff1a;暂无 出处&#xff1a;中国科学技术大学 | 腾讯优图 贡献点&#xff1a; 作者提出了高分辨率视觉文档助手 HRVDA&#xff0c;能直接处理高分辨率图像输入作者提出了内容过滤机制和指令过…

Altair 人工智能技术助力MABE预测消费者行为,实现设备性能优化

主要看点 行业&#xff1a; 家电行业 挑战&#xff1a; 企业面临的挑战是如何利用已收集的大量数据&#xff0c;深入了解消费者在产品使用过程中对某些保鲜程序的影响。 Altair 解决方案&#xff1a; Altair采用了Altair RapidMiner人工智能平台来解决问题&#xff0c;特别是…

C++ 60 之 虚析构和纯虚析构

#include <iostream> #include <string> #include <cstring> using namespace std;class Animal13{ public:Animal13(){cout << "Animal的默认构造函数" << endl;}virtual void speak(){cout << "动物叫" << en…

CP AUTOSAR标准之MemoryDriver(AUTOSAR_CP_SWS_MemoryDriver)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块内存驱动程序(Mem)的功能、API和配置。   内存驱动程序提供访问不同类型内存设备的基本服务,如读取、写入、擦除和空白检查。   尽管闪存仍然是最常见的非易失性存储器技术,但内存驱动程序规范考虑了所有相关的内存设备…

【价值主张画布】以产品思维,将自己打造成“爆款”

经营自己等于经营公司&#xff1a; 1.客户细分&#xff1a;我能帮助谁&#xff1f;谁是我们最重要的客户&#xff1f; 2. 客户关系&#xff1a;怎样和对方打交道&#xff1f;一次交付还是持续交付&#xff1f; 3.渠道通路&#xff1a;怎样宣传自己和服务&#xff1f; 4. 价值主…

身份证二要素API在Java、Python、PHP中的使用教程

随着信息时代的迅猛发展&#xff0c;数字化已经深刻影响了我们生活的各个方面。从社交互动到金融交易&#xff0c;人们越来越多地依赖在线平台和数字服务。然而&#xff0c;随之而来的是身份验证和数据安全方面的挑战。在这个信息泛滥的时代&#xff0c;确保每个在线身份的真实…

丹麦海外媒体报道:媒体投放发稿助力企业在海外扭转战局

大舍传媒 丹麦海外媒体报道中&#xff0c;大舍传媒作为一家专业的媒体投放公司&#xff0c;正发挥着重要作用&#xff0c;帮助企业在海外扭转战局。作为丹麦领先的媒体投放机构&#xff0c;他们为企业提供了全方位的品牌传播服务&#xff0c;帮助企业在海外市场取得成功。 大舍…

Unity制作透明材质直接方法——6.15山大软院项目实训

之前没有在unity里面接触过材质的问题&#xff0c;一般都是在maya或这是其他建模软件里面直接得到编辑好材质的模型&#xff0c;然后将他导入Unity里面&#xff0c;然后现在碰到了需要自己在Unity制作透明材质的情况&#xff0c;所以先搜索了一下有没有现成的方法&#xff0c;很…