Vue3入门到精通--reactive以及reactive相关函数

简介: Vue3入门到精通--reactive以及reactive相关函数

系列文章目录

  1. Vue3入门到精通-setup
  2. Vue3入门到精通–ref以及ref相关函数
  3. Vue3入门到精通–reactive以及reactive相关函数

创作不易 拒绝白嫖 点个赞呗

关注我,带你走进前端的世界!!!


是什么

  1. 将引用类型数据–>响应式数据 ==> 把值类型的数据包装编程响应式的引用类型的数据

object array map set weakmap weakset

  1. 函数
  2. reactive参数必须是对象(json/arr)

默认情况下修改对象, 界面不会自动更

如果想更新, 可以通过重新赋值的方式

  1. 本质: 将传入的数据包装成一个Proxy对象

用法

创建变量

案例1

import {reactive} from 'vue';
let state = reactive([1, 2, 3]);
console.log(state) // Proxy {0: 1, 1: 3, 2: 5}
注意!!!
<p>{{state}}</p>
<button @click="myFn">按钮</button>
let obj = [1, 2, 3];
let state = reactive(obj)
console.log(obj);   // (3) [1, 2, 3]
console.log(state); // Proxy {0: 1, 1: 2, 2: 3}   
// 页面显示是[1, 2, 3]
function myFn() {
    state[3] = "zs";
    console.log(obj);   //(4) [1, 2, 3, "zs"]
    console.log(state); //Proxy {0: 1, 1: 2, 2: 3, 3: "zs"}
    // 点击按钮后
    // 页面显示是[1, 2, 3, "zs"]
    // 由此-》根据下标修改数据可以触发页面的更新
    // 且 state的修改对原数据的修改有影响
}
function myFn() {
    obj[3] = "ls";
    console.log(obj);   //(4) [1, 2, 3, "ls"]
    console.log(state); //Proxy {0: 1, 1: 2, 2: 3, 3: "ls"}
    // 点击按钮后
    // 页面显示是[1, 2, 3]
    // 且 原数据的修改对state的修改有影响
    //  但是页面不会触发更新
}
function myFn() {
    state = [4,5,6];
    console.log(obj);   //(3) [1, 2, 3]
    console.log(state); //(3) [4, 5, 6]
    // 点击按钮后
    // 页面显示是[1, 2, 3]
    // 直接对state进行修改不会触发页面的更新,但是上面对下标进行修改可以触发页面更新
    //  同时这里直接进行复制,导致state不再是proxy
    // 这里你可以使用
    //  Object.assign(state,[4,5,6])
    // 这样也可以 触发页面的更新,
    // 这个方法在ajax请求之后进行赋值,很好用
}

案例2

import {reactive} from 'vue';
let state = reactive( { name: "zs", age: 19 });
// 这里不再赘述,效果和上面的Array一致

ref和reactive的区别

ref是把值类型添加一层包装,使其变成响应式的引用类型的值。

reactive 则是引用类型的值变成响应式的值。

所以两者的区别只是在于是否需要添加一层引用包装

本质上

ref(0)  --> reactive( { value:0 })

相关API

isReactive

作用

检查对象是否是 reactive创建的响应式 proxy。

其实内部是判断数据对象上是否包含__v_isRef 属性并且其值为 true

用法

let state = reactive( { name: "zs", age: 19 });
console.log(isReactive(state)) // true

readonly

作用

声明一个只读的proxy

与const的区别

const: 赋值保护, 不能给变量重新赋值

readonly: 属性保护, 不能给属性重新赋值

用法
<p>{{state.name}}</p>
<p>{{state.attr.age}}</p>
<button @click="myFn">按钮</button>
let state = readonly({name:'syl', attr:{age:18}});
function myFn() {
    state.name = 'zs';
    state.attr.age = 19;
    console.log(state); // proxy{name:'syl', attr:{age:18}}
    console.log(isReadonly(state)); // true
    // 变量无法更改
    // 点击按钮后页面没有变化
}

isReadonly

作用

检查对象是否是由readonly创建的只读代理

shallowReactive

作用

创建一个响应式代理,该代理跟踪其自身 property 的响应性,但不执行嵌套对象的深度响应式转换 (暴露原始值)。

官网例子

当从合成函数返回响应式对象时,toRefs 非常有用,这样消费组件就可以在不丢失响应性的情况下对返回的对象进行分解/扩散:

<p>{{ state.a }}</p>
<p>{{ state.attr.b }}</p>
<p>{{ state.attr.c.d }}</p>
<button @click="myFn">按钮</button>
let state = shallowReactive({
    a: "a",
    attr: {
        b: "b",
        c: {
            d: "d",
        },
    },
});
function myFn() {
    state.attr.c.d='5'
    console.log(state.attr.c.d); //5
    // 点击按钮后页面没有变化
}
function myFn() {
    state.a='5'
    console.log(state.a); //5
    // 点击按钮后页面变化
}

shallowReadonly

作用

用于创建一个只读的数据, 但是不是递归只读的

<p>{{state.name}}</p>
<p>{{state.attr.age}}</p>
<button @click="myFn">按钮</button>
let state = shallowReadonly({name:'syl', attr:{age:18}});
function myFn() {
    state.attr.age = 19;
    console.log(state.attr.age) // 19
    // 点击按钮页面没有变化
}
function myFn() {
    state.name = 'ls';
    console.log(state.name) // syl
    // 数据无法更改
    // 点击按钮页面没有变化
}

toRaw

做用

从reactive 得到原始数据

用法
let obj = {name:'syl', age:18};
/*
ref/reactive数据每次修改都会被追踪, 都会更新界面
但是当你不需要更新UI界面, 
可以通过toRaw方法拿到它的原始数据, 对原始数据进行修改
这样就不会被追踪不会更新界面,
*/
let state = reactive(obj);
let obj2 = toRaw(state);
console.log(obj === obj2); // true
function myFn() {
    obj2.name = 'zs';
    console.log(obj2); // {name: "zs", age: 18}
    console.log(state); // {name: "zs", age: 18}
}
 // 这个例子在上面出现过

相关文章
|
7月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
1030 139
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
1340 5
|
7月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
543 1
|
8月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
959 11
|
7月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
620 0
|
9月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
998 1
|
9月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
497 0
|
10月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
238 0
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
1173 17
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
2326 0