广告
返回顶部
首页 > 资讯 > 精选 >Vue3响应式原理实例分析
  • 555
分享到

Vue3响应式原理实例分析

2023-07-02 10:07:11 555人浏览 八月长安
摘要

本篇内容介绍了“vue3响应式原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!回顾 Vue2.x 的响应式实现原理:对象类型:通过

本篇内容介绍了“vue3响应式原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

回顾 Vue2.x 的响应式

实现原理:

  • 对象类型:通过object.defineProperty()对属性的读取、修改进行拦截(数据劫持)

  • 数组类型:通过重写更新数组的一系列方法来实现拦截(对数组的变更方法进行了包裹)

Object.defineProperty(data,'count ",{get(){},set(){}})

存在问题:

  • 新增属性、删除属性,界面不会更新

  • 直接通过下标修改数组,界面不会自动更新

但是 vue2 给了解决方法,我们看以下代码:

<template>  <div>    <h3>我是vue2写的效果</h3>    <h5 v-show="person.name">姓名:{{person.name}}</h5>    <h5>年龄:{{person.age}}</h5>    <h5 v-show="person.sex">性别:{{person.sex}}</h5>    <h5>爱好:{{person.hobby}}</h5>    <button @click="addSex">添加sex属性</button>    <button @click="deleteName">删除name属性</button>    <button @click="changeHobby">修改爱好</button>  </div></template><script>import Vue from 'vue'export default {  name: 'App',  data(){    return{      person:{        name:'张三',        age:18,        hobby:['学习','吃饭']      }    }  },  methods:{    addSex(){      //这样直接加是不行的      //this.person.sex = '男'      this.$set(this.person,"sex",'男')      //Vue.set(this.person,"sex",'男')    },    deleteName(){      //这样直接加是不行的      //delete this.person.name      //this.$delete(this.person,'name')      Vue.delete(this.person,"name")    },    changeHobby(){      //这样直接加是不行的      //this.person.hobby[0] = '逛街'      //可以这样      this.$set(this.person.hobby,0,'逛街')      //或      //this.person.hobby.splice(0,1,"逛街")    },  }}</script>

我们可以用 js 模拟 vue2 的响应式:

<script>        //源数据        let person = {            name:"张三",            age:18        }        let p = {}        //模拟vue2实现响应式        Object.defineProperty(p,"name",{        configurable:true,            get() {//有人读取name时调用                return person.name            },            set(v) {                person.name = v                console.log("有人修改了name属性,我发现了,我要去更新界面");            }        })        Object.defineProperty(p,"age",{            get() {//有人读取age时调用                return person.age            },            set(v) {                person.age = v                console.log("有人修改了age属性,我发现了,我要去更新界面");            }        })</script>

先输出 person,然后看下 p,当修改 name 或 age 时会检测到

Vue3响应式原理实例分析

它的问题是,如果增加一个 sex 属性,vue 不会检测到,虽然增加了 sex 属性,但它不像 name 和 age 有 getter 和 setter,不是响应式的

Vue3响应式原理实例分析

同样,当删除 name 属性时也监测不到

Vue3响应式原理实例分析

vue3的响应式

<template>  <h2>一个人的信息</h2>  <h4 v-show="person.name">姓名:{{ person.name }}</h4>  <h4>年龄:{{ person.age }}</h4>  <h4 v-show="person.sex">性别:{{ person.sex }}</h4>......  <button @click="changeInfo">修改人的信息</button>  <button @click="addSex">添加一个sex属性</button>  <button @click="deleteName">删除一个name属性</button></template><script>import {Reactive} from 'vue'export default {  name: 'App',  setup() {......    function changeInfo() {      ......      person.hobby[0] = '学习'    }        function addSex() {      person.sex = "男"    }    function deleteName() {      delete person.name    }    return {      ......      addSex,      deleteName    }  }}</script>

模拟 vue3 中的响应式:

    <script>        //源数据        let person = {            name:"张三",            age:18        }        const p = new Proxy(person,{            //有人读取p的某个属性时调用            get(target, p, receiver) {                console.log(`有人读取了p身上的${p}属性`);                //return target[p]                return Reflect.get(target,p)            },            //有人修改、增加p的某个属性时调用            set(target, p, value, receiver) {                console.log(`有人修改了p身上的${p},我要去更新界面了`);                //target[p] = value                Reflect.set(target,p,value)            },            //有人删除p的某个属性时调用            deleteProperty(target, p) {                console.log(`有人删除了p身上的${p},我要去更新界面了`);                //return delete target[p]                return Reflect.deleteProperty(target,p)            }        })    </script>

Vue3响应式原理实例分析

Vue3响应式原理实例分析

实现原理:

  • 通过Proxy(代理)∶拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等

  • 通过Reflect(反射):对源对象的属性进行操作

MDN文档中描述的 Proxy 与 Reflect

Reflect 是一个内置的对象,它提供拦截 javascript 操作的方法。Reflect不是一个函数对象,因此它是不可构造的。

new Proxy(data,{//拦截读取属性值get (target, prop){return Reflect.get(target,prop)},//拦截设置属性值或添加新属性set (target,prop, value) {return Reflect.set(target,prop, value)},//拦截删除属性deleteProperty (target,prop) {return Reflect.deleteProperty(target,prop)}})proxy.name = "tom"

“Vue3响应式原理实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Vue3响应式原理实例分析

本文链接: https://www.lsjlt.com/news/341111.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3响应式原理实例分析
    本篇内容介绍了“Vue3响应式原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!回顾 vue2.x 的响应式实现原理:对象类型:通过...
    99+
    2023-07-02
  • Vuejs响应式原理的示例分析
    小编给大家分享一下Vuejs响应式原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!响应式原理> vuejs中的...
    99+
    2022-10-19
  • 详解Vue3的响应式原理解析
    目录Vue2响应式原理回顾Vue3响应式原理剖析嵌套对象响应式避免重复代理总结 Vue2响应式原理回顾 // 1.对象响应化:遍历每个key,定义getter、setter //...
    99+
    2022-11-12
  • 如何解析Vue3的响应式原理
    本篇文章给大家分享的是有关如何解析Vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Vue2响应式原理回顾// 1.对象响应化:遍历每个key,定义g...
    99+
    2023-06-22
  • vue2和vue3数据响应式原理分析及如何实现
    今天就跟大家聊聊有关vue2和vue3数据响应式原理分析及如何实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据响应式视图跟数据是自动更新的,数据更新的时候视图是自动的更新的追踪...
    99+
    2023-06-22
  • Vue数据响应式原理实例代码分析
    本文小编为大家详细介绍“Vue数据响应式原理实例代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue数据响应式原理实例代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。改造数据我们先来尝试写一个函数...
    99+
    2023-07-04
  • vue-next响应式原理的示例分析
    这篇文章给大家分享的是有关vue-next响应式原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。预备知识无论是阅读这篇文章,还是阅读 vue-next 响应式模块的源...
    99+
    2022-10-19
  • Vue中响应式原理的示例分析
    这篇文章主要介绍了Vue中响应式原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Vue 嘴显著的特性之一便是响应式系统(reac...
    99+
    2022-10-19
  • Vue3响应性基础API实例分析
    这篇“Vue3响应性基础API实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue...
    99+
    2022-10-19
  • Vue3中的ref和reactive响应式原理解析
    目录1 ref2 isref判断是不是一个ref对象3 shallowref创建一个跟踪自身.value变化的 ref,但不会使其值也变成响应式的4 triggerRef5 cust...
    99+
    2022-11-13
    Vue3 ref和reactive响应式 Vue3 ref和reactive
  • 详解vue3 响应式的实现原理
    目录核心设计思想Vue.js 2.x 响应式Vue.js 3.x 响应式依赖收集:get 函数派发通知:set 函数总结源码参考核心设计思想 除了组件化,Vue.js 另一个核心设计...
    99+
    2022-11-13
  • 深入理解Vue3响应式原理
    目录响应式原理手写实现1、实现Reactive2、实现依赖的收集和触发effect影响函数收集/添加依赖触发依赖3、移除/停止依赖衍生类型1、实现readonly2、实现shallo...
    99+
    2022-12-19
    vue3响应式原理精讲 vue3 响应式 vue 响应式原理
  • Vue响应式原理Observer、Dep、Watcher的示例分析
    小编给大家分享一下Vue响应式原理Observer、Dep、Watcher的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧...
    99+
    2022-10-19
  • Vue响应式原理深入分析
    目录1.响应式数据和副作用函数2.响应式数据的基本实现3.设计一个完善的响应式系统1.响应式数据和副作用函数 (1)副作用函数 副作用函数就是会产生副作用的函数。 function ...
    99+
    2022-12-30
    Vue响应式原理 Vue响应式框架 Vue响应式数据
  • Vue3响应式机制源码分析
    本篇内容介绍了“Vue3响应式机制源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是响应式响应式一直都是 Vue 的特色功能之一;...
    99+
    2023-07-06
  • HTML5响应式banner实例分析
    本篇内容介绍了“HTML5响应式banner实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!<...
    99+
    2022-10-19
  • Vue3 Reactive响应式原理是什么
    一、怎么实现变量变化怎么实现变量变化,相关依赖的结果也跟着变化 当原本price=5变为price=20后total应该变为40,但是实际total并不会改变。 解决办法可以这样,当变量改变了,重新计算一次,那么结果就会改变为最新的结果。如...
    99+
    2023-05-21
    Vue3 reactive
  • 一文详解Vue3响应式原理
    目录回顾 vue2.x 的响应式vue3的响应式回顾 vue2.x 的响应式 实现原理: 对象类型:通过object.defineProperty()对属性的读取、修改进行拦截(数据...
    99+
    2022-11-13
  • 关于Vue3中的响应式原理
    目录一、简介二、响应核心1.核心源码2.逐步分析上述示例代码3.收集依赖和触发依赖更新三、V3.2的响应式优化四、后话一、简介 本章内容主要通过具体的简单示例来分析Vue3是如何实现...
    99+
    2022-11-13
  • Vue3的响应式原理是什么
    ProxyProxy这个核心API被Vue3的响应式原理所依赖,利用Proxy可以拦截一些对象操作。const obj = { a: 1 }; const p = new Proxy(obj, { get(target, propert...
    99+
    2023-05-24
    Vue3
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作