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

news2024/11/19 14:43:11

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

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

  • Vue2原本使用的是Object.defineProperty的响应式处理方式
    • methods方法中的this.name指的是vm.name
    • return的name属性在通过this.name的间接调用时,通过了Object.defineProperty响应式处理
// 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(基本数据类型)

在这里插入图片描述

// 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函数的调用

在这里插入图片描述

// 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'

在这里插入图片描述

<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.coloradmin.cn/o/1196154.html

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

相关文章

体力属性在重生奇迹MU中的演变史

我相信&#xff0c;在任何一个网络游戏中都有体力这种属性&#xff0c;它本身就是血量的另一种表达&#xff0c;先天体力有优势的职业&#xff0c;往往就是后期成长较高&#xff0c;这已经是网游中一种常态&#xff0c;因为高血在PK中占据优势&#xff01;重生奇迹MU同样如此&a…

Windows下Python及Anaconda的安装与设置之保姆指南

学习Python编程需要安装基本的开发环境。 &#xff08;1&#xff09;python ——编译器&#xff1b;这个是任何语言都需要的&#xff1b;必需&#xff01; &#xff08;2&#xff09;Anaconda ——主要的辅助工具&#xff0c;号称是 Python‘OS&#xff1b;必需&#xff01; …

网络安全基础之php开发文件下载的实现

前言 php是网络安全学习里必不可少的一环&#xff0c;简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中&#xff0c;文件下载的功能是必不可少&#xff0c;比如我们在论坛看到好看图片好听的歌时&#xff0c;将其下载下来时就…

【Python小练手】使用PySimpleGUI和Pygame创作一个MP3播放器(附完整代码)

文章目录 前言一、来说说思路&#xff08;文心一言提供&#xff09;二、完整代码&#xff08;参考文心&#xff0c;自行修改&#xff09;总结附录 前言 闲来无事&#xff0c;做了MP3播放器练练手&#xff0c;主要是研究下PySimpleGUI的界面窗口设计。先上图&#xff0c;一睹为…

C字符函数及字符串函数

但行前路&#xff0c;莫问归期 要注意的是&#xff0c;要使用下边所讲的函数要包含头文件<string.h> strlen 求字符串的长度 函数参数&#xff1a;字符串指针 函数功能&#xff1a;传入字符串指针&#xff0c;字符串是以\0为结束标志&#xff0c;返回的类型size_t其实…

Linux操作系统使用及C高级编程-D2软件包管理

有两种类型的软件包&#xff1a;二进制软件包(deb)和源码包(deb-src) 二进制软件包(Binary Packages)&#xff1a;包含可执行文件、库文件、配置文件、main/info页面、版权声明和其他文档 源码包(Source Packages)&#xff1a;包含软件源代码、版本修改说明、构建指令及编译工…

企业如何解决被“薅羊毛”

随着互联网的普及和电子商务的兴起&#xff0c;越来越多的消费者选择在线购物。然而&#xff0c;一些消费者可能会利用企业的促销活动或优惠券来获取额外优惠&#xff0c;甚至恶意攻击企业的营销资金。这种行为被形象地称为“薅羊毛”。 对于企业而言&#xff0c;如何解决被“薅…

AI系统ChatGPT源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

作用域插槽slot-scope

一般用于组件封装&#xff0c;将使用props传入组件的数据再次调出来或者单纯调用组件中的数据。也可用于为组件某个部分自定义样式以及为某次使用组件自定义样式。 直接拿elementui的el-table举例&#xff1a; <template><el-table v-loading"loading&q…

PDF Expert for mac(专业pdf编辑器)苹果电脑

PDF Expert for Mac 是一款功能强大、界面简洁的PDF阅读、编辑和转换工具&#xff0c;为Mac用户提供了全面而便捷的PDF处理体验。无论是日常工作中的文档阅读、标注&#xff0c;还是专业需求下的编辑、转换&#xff0c;PDF Expert 都能满足您的各种需求。 首先&#xff0c;PDF…

Leetcode-94 二叉树的中序遍历

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

RustRover里使用AI通义灵码来写代码

AI通义灵码我选择RustRover里的 plugin进行下载使用 然后我们就提问好了&#xff1a;让他用c语言写一个冒泡排序程序 #include <stdio.h>void bubble_sort(int arr[], int size) {int i, j, temp;for (i 0; i < size - 1; i) {for (j 0; j < size - i - 1; j) {i…

RabbitMQ 之 Work Queues 工作队列

目录 一、轮训分发消息 1、抽取工具类 2、启动两个工作线程 3、生产者代码 4、结果展示 二、消息应答 1、概念 2、自动应答 3、消息应答的方法 4、Multiple 的解释 5、消息自动重新入队 6、消息手动应答代码 &#xff08;1&#xff09;生产者 &#xff08;2&#…

【CodeTop】TOP 100 刷题 1-10

文章目录 1. 无重复字符的最长子串题目描述代码与思路 2. 反转链表题目描述代码与解题思路 3. LRU 缓存题目描述代码与解题思路 4. 数组中的第K个最大元素题目描述代码与解题思路 5. K 个一组翻转链表题目描述代码与解题思路 6. 三数之和题目描述代码与解题思路 7. 最大子数组和…

Edge浏览器新建标签页如何更改为指定网址

Edge浏览器新建标签页如何更改为指定网址&#xff1f; 启动时新建标签页 不是说启动时&#xff0c;而是加号新建标签页时候 启动时 新建标签页 New Tab Changer 可以了 如果没有需要应用商店下载 参考文章

Qframework 中超级方便的kitres

using QFramework; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestResKit : MonoBehaviour {ResLoader mResLoader ResLoader.Allocate();private void Awake(){}/// <summary>/// 每一个需要加载资源的单元(脚本,界…

FiRa标准——MAC实现(二)

在IEEE 802.15.4z标准中&#xff0c;最关键的就是引入了STS&#xff08;加扰时间戳序列&#xff09;&#xff0c;实现了安全测距&#xff0c;大大提高了测距应用的安全性能。在FiRa的实现中&#xff0c;其密钥派生功能是非常重要的一个部分&#xff0c;本文首先对FiRa MAC中加密…

element-plus 循环生成的多个input输入框如何校验

我们知道正常写出来的input输入框如何校验&#xff0c;那循环出来的输入框应该怎么校验咧&#xff0c;这里就教大家如何的去校验通过循环出来的输入框。 首先先看单个的input如何做校验 <template><div><el-form ref"ruleFormRef" :model"ruleF…

面试题:说一下公司常用MySQL分库分表方案

文章目录 一、数据库瓶颈1、IO瓶颈2、CPU瓶颈 二、分库分表1、水平分库2、水平分表3、垂直分库4、垂直分表 三、分库分表工具四、分库分表步骤五、分库分表问题1、非partition key的查询问题2、非partition key跨库跨表分页查询问题3、扩容问题 六、分库分表总结 一、数据库瓶颈…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…