Vue3-ref函数、reactive函数的响应式

news/2024/7/10 2:28:13 标签: javascript, 前端, 前端框架, vue

Vue3-ref函数、reactive函数的响应式

在这之前,先讲Vue2的响应式处理

  • Vue2原本使用的是Object.defineProperty的响应式处理方式
    • methods方法中的this.name指的是vm.name
    • return的name属性在通过this.name的间接调用时,通过了Object.defineProperty响应式处理
javascript">// App.vue
<template>
    <h2>姓名:{{name}}</h2>
    <button @click="modifyName">修改姓名</button>
</template>

<script>
    export default {
        name : 'App',
        data(){
            return {
                name : '张三'
            }
        },
        // 在methods的this.name 调用到 data的name的过程中,使用了Object.defineProperty
        // 从而将 张三 改成 李四
        methods:{
            modifyName(){
                this.name = '李四'
            }
        }
    }
</script>

ref函数的响应式(适用于基本数据类型)

  • 原理:
    • ref函数通过对数据进行一个包装,然后返回一个全新的对象,叫做引用对象RefImpl
    • 在这个RefImpl对象中有一个value属性,而value属性底层调用了Object.defineProperty响应式
    • 而value属性有set和get:
      • 读取RefImpl对象的value属性时:get
      • 修改RefImpl对象的value属性时:set
  • 使用前导入:import {ref} from 'vue'

基本数据类型的响应式处理 ref(基本数据类型)

在这里插入图片描述

javascript">// App.vue
<template>
    <h2>姓名:{{nameRefImpl}}</h2>
    <button @click="modifyInfo">修改用户的信息</button>
</template>

<script>
    // 要先导入
    import {ref} from 'vue'
    export default {
        name : 'App',
        setup(){
            // 这里是Object.defineProperty响应式处理
            let nameRefImpl = ref('张三')
            // 这里调用的是value属性的get方法
            console.log(nameRefImpl.value);
            
            function modifyInfo(){
                // 这里调用的是value属性的set方法
                nameRefImpl.value = '李四'
            }
            
            return{nameRefImpl, modifyInfo}
        }
    }
</script>

对象形式的响应式处理 ref({})(不用)

  • 用ref函数包装对象形式,底层也就是reactive函数的调用

在这里插入图片描述

javascript">// App.vue
<template>
    <h2>姓名:{{nameRefImpl.name}}</h2>
    <button @click="modifyInfo">修改用户的信息</button>
</template>

<script>
    import {ref} from 'vue'
    export default {
        name : 'App',
        setup(){
            let nameRefImpl = ref({
                name : 'zhangsan'
            })
            
            function modifyInfo(){
                nameRefImpl.value.name = 'lisi'
            }
            
            return{nameRefImpl, modifyInfo}
        }
    }
</script>

reactive函数的响应式(适用于对象形式)

  • 原理:将一个对象直接包裹,实现响应式,底层生成一个Proxy对象
  • 使用前导入:import { reactive } from 'vue'

在这里插入图片描述

javascript"><template>
    <h2>选课列表</h2>
    <ul>
        <li v-for="(course, index) in courseProxy.courses" :key="index">
            {{index}}, {{course}}
        </li>
    </ul>
    <button @click="modifyCourse">修改课程信息</button>
</template>

<script>
    // 导入
    import { reactive } from 'vue'
    export default {
        name : 'App',
        setup() {
            // data
            let courseProxy = reactive({
                courses : ['语文', '数学', '英语', '科学']
            })

            // methods
            function modifyCourse(){
                userProxy.courses[2] = '地理'
            }
            // 返回对象
            return{courseProxy, modifyCourse}
        }
    }
</script>

http://www.niftyadmin.cn/n/5172752.html

相关文章

Qt——连接mysql增删查改(仓库管理极简版)

目录 UI布局设计 .pro文件 mainwindow.h main.cpp UI布局设计 .pro文件 QT core gui QT core gui sql QT sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any …

mysql从A库复制表到B库的时候报:MySQL ERROR:1153

今天操作数据表从A库迁移到B库的时候报了这个问题: MySQL ERROR&#xff1a;1153&#xff1b;因为表比较大&#xff0c;我导出SQL文件查看大概有1.8G&#xff0c;里面存放的都是图片信息。我其中尝试了多种方法&#xff0c;使用navicat 工具中的数据 同步&#xff0c;还有表复制…

Ubuntu 下监控并自动重启网卡

很多时候网站服务器挂掉也可能是因为网卡挂掉了&#xff0c;如果你网站不能访问时 SSH 也无效了一般都是这个问题。这时可以通过一个定时脚本监控网络并进行自动重启。 1 创建脚本 auto_restart_network.sh 4 5 6 7 8 9 #!/bin/bash ping www.baidu.com -c 1 >/dev/null i…

图论12-无向带权图及实现

文章目录 带权图1.1带权图的实现1.2 完整代码 带权图 1.1带权图的实现 在无向无权图的基础上&#xff0c;增加边的权。 使用TreeMap存储边的权重。 遍历输入文件&#xff0c;创建TreeMap adj存储每个节点。每个输入的adj节点链接新的TreeMap&#xff0c;存储相邻的边和权重 …

计算机网络的发展及应用

计算机网络是计算机技术和通信技术高度发展并相互结合的产物。一方面&#xff0c;通信系统为计算机之间的数据传送提供最重要的支持&#xff1b;另一方面&#xff0c;由于计算机技术渗透到了通信领域&#xff0c;极大地提高了通信网络的性能。计算机网络的诞生和发展&#xff0…

C_5练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 下列叙述中错误的是()。 A.计算机不能直接执行用C语言编写的源程序 B.C程序经C编译程序编译后,生成扩展名为obj的文件是一个…

Unity Mirror学习(三)ClientRpc特性使用

ClientRpc特性 1&#xff0c;从服务端任意一网络对象发送到客户端 2&#xff0c;修饰方法的&#xff0c;在服务器上调用此方法&#xff0c;它将在所有客户端执行&#xff08;我的理解:服务端广播消息&#xff0c;消息方法&#xff09; 3&#xff0c;此方法不会在本地执行 它和…

VueRequest——管理请求状态库

文章目录 前言一、为什么选择 VueRequest&#xff1f;二、使用步骤1.安装2.用例 前言 VueRequest——开发文档 VueReques——GitHub地址 在以往的业务项目中&#xff0c;我们经常会被 loading 状态的管理、请求的节流防抖、接口数据的缓存、分页等重复的功能实现所困扰。每次开…