iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue处理响应式数据的方法是什么
  • 358
分享到

vue处理响应式数据的方法是什么

2023-07-05 17:07:31 358人浏览 独家记忆
摘要

这篇“Vue处理响应式数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue处理响应式数据的方法是什么”文章吧

这篇“Vue处理响应式数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue处理响应式数据的方法是什么”文章吧。

vue处理响应式数据的方法是什么

那继续下一个问题。

vue处理响应式数据的方法是什么

这个回答感觉就比较官方了,没有回答到我想要的答案。

理由其实很简单,因为proxy方法不能代理值类型,只能代理对象。所以需要一个额外的方法,来处理值类型的数据。

当然你也可以一个ref走天下,vue源码做了兼容会自动进行转换

有了这些理解之后,我们来看今天的重头戏,自己仿照vue3源码,实现一个响应式系统。

相关代码可以点击查看,根据文章的标题选择不同的分支即可。

实现Reactive

在前文我们也介绍了,reactive其实用的是proxy代理对象。

我们可以使用proxy实现一个简单的代理函数reactive。

      function reactive(target) {        const isObject = (val) =>  val !== null && typeof val === 'object'        if (!isObject(target)) {          console.warn(`数据必须是对象: ${String(target)}`)          return target        }        const proxy = new Proxy(target, {          get: (target, key, receiver) => {            console.log('get', key)            const res = Reflect.get(target, key, receiver)            // track(target, key)            // 这句很关键,不然嵌套数据,里面的不会响应            if (isObject(res)) {              return reactive(res)            }            return res          },          set: (target, key, value, receiver) => {            console.log('set', key, value)            const result = Reflect.set(target, key, value, receiver)            // trigger(target, key, value)            return result          },          deleteProperty: () => {            const result = Reflect.deleteProperty(target, key)            return result          }        })        return proxy      }      const person = reactive({        name: '',        age: 18,        like: ['apple']      })      person.name  = 'vue test'复制代码

注意:Reflect

Reflect.get(target, key)跟直接访问target[key]是有一点差别的。

当代理对象中,有get,set等this指向的时候,可以重定向this。

举个例子:

        const person = new Proxy({            name: "vue test",            age: 18,            get info() {                return 'name is :' + this.name + ' age is:' + this.age            }        }, {            get: (target, key, receiver) => {                console.log('get', key)                // return target[key]                return Reflect.get(target, key, receiver)            }        })        console.log(person.info)复制代码

使用Reflect,我们在访问name, age的时候均可以触发。vue处理响应式数据的方法是什么

改成target之后,则只会在info触发一次。

return target[key]复制代码

vue处理响应式数据的方法是什么

实现ref

在vue3中,ref是通过get和set来实现的。

跟上面类似,也还是先声明一个函数,然后通过get,set来访问数据。

      function ref(value) {        return new RefImpl(value)      }      class RefImpl {        constructor(value) {          // 如果值是对象,则用reactive处理          this._value = isObject(value) ? reactive(value) : value          // 记录一下初始值          this._rawValue = value        }        get value() {          // trackRefValue(this)          return this._value        }        set value(newVal) {          if (!Object.is(newVal, this._rawValue)) {            // 更新原始数据            this._rawValue = newVal            // 更新 .value 的值            this._value = isObject(newVal) ? reactive(newVal) : value            // triggerRefValue(this)          }        }      }复制代码

源码也很直观的解释了,为什么ref的使用一定要用.value的方式使用,因为get/set就是通过value来设置的。

添加依赖收集与触发

数据代理我们已经完成了,但是数据更改之后,怎么通知组件实现双向绑定呢?

答案就是依赖收集与触发,也就是当触发get的时候,我把触发get的这个条件【函数】给保存起来,当触发set的时候,重新执行一下触发一下这个条件【函数】不就行了吗。

还是来看代码,我加一个track收集的方法,加一个target触发的方法。(也就是上面代码片段注释掉的两行代码)

除此之外,还需要一个effect函数来管理触发函数。

      let activeEffect = null      const targetMap = new WeakMap()      // 依赖收集/触发      function track(target, key) {        let depsMap = targetMap.get(target)        if (!depsMap) {          targetMap.set(target, (depsMap = new Map()))        }        let dep = depsMap.get(key)        if (!dep) {          dep = new Set()        }        dep.add(activeEffect)        depsMap.set(key, dep)      }      function trigger(target, key, value) {        const depsMap = targetMap.get(target)        if (!depsMap) {          return        }        const deps = depsMap.get(key)        if (!deps) {          return        }        deps.forEach(effectFn => {          if (effectFn.scheduler) {            effectFn.scheduler()          } else {            effectFn()          }        })      }      function effect(fn,options = {}) {        const effectFn = () => {          try {            activeEffect = effectFn            return fn()          } catch (error) {            activeEffect = null          }        }        if (!options.lazy) {          effectFn()        }        effectFn.scheduler = options.scheduler        return effectFn      }      const person = reactive({        name: "hello world"      })      effect(() => {        console.log('effect person', person.name)      })      setTimeout(() => {        person.name = 'setTimeout world'      }, 2000)复制代码

activeEffect用来存触发的条件函数。

targetMap用来存放依赖字典,格式如下

{    target: {        key: []    }}复制代码

输出结果为hello world,2秒之后,重新执行依赖性函数,输出setTimeout world

vue处理响应式数据的方法是什么

总结

数据的代理并不复杂,就是在proxy的基础上,加上一些边界处理。而要实现响应式则需要加上依赖收集,依赖触发的实现。

effect是一个很重要的函数,很多api是基于这个函数开发的,比如useEffect, watch。组件的更新也是基于effect函数,这个后续还会提到。

如果不太理解effect,可以梳理一下执行顺序。

  • 1.调用effect函数,并传入参数fn

  • 2.申明一个effectFn函数,并执行,将函数保存为activeEffect

  • 3.执行fn,读取person.name

  • 4.走proxy的get代理

  • 5.收集依赖,将activeEffect保存的函数存到全局map中

  • 6.此时,effect函数执行完毕,等待数据更新

  • 7.2s后,走proxy的set代理

  • 8.执行全局map中保存的函数,重新执行effect函数,再次回到步骤1

相关代码可以点击查看,选择lesson3分支即可。

文章相关代码,可在vue/examples中查看,仿vue实现版本可在packages/reactivity中查看。

以上就是关于“vue处理响应式数据的方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: vue处理响应式数据的方法是什么

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

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

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

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

下载Word文档
猜你喜欢
  • vue处理响应式数据的方法是什么
    这篇“vue处理响应式数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue处理响应式数据的方法是什么”文章吧...
    99+
    2023-07-05
  • Vue数据响应式原理是什么
    本文小编为大家详细介绍“Vue数据响应式原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue数据响应式原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。响应式是什么简而言之就是数据变页面变如何实...
    99+
    2023-06-30
  • 深入浅析vue处理响应式数据的方法
    本篇文章带大家学习vue,聊聊vue如何处理响应式数据?希望对大家有所帮助!关于vue的响应式数据,你可能有很多疑惑。比如为什么要改用proxy比如为什么有reactive和ref两个api比如vue是如何实现响应式的?其实这些在源码中,都...
    99+
    2023-05-14
    前端 Vue.js
  • Vue 中数据响应式的原理是什么
    Vue 中数据响应式的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。改造数据我们先来尝试写一个函数,用于改造对象:为什么要先写这个函...
    99+
    2022-10-19
  • Vue中数据响应式是什么
    这篇文章将为大家详细讲解有关Vue中数据响应式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. ES语法的getter和setter在开始了解 Vue 的数据响应式原理前应该先搞清楚 ES语法 中...
    99+
    2023-06-15
  • Vue3中响应式的特殊处理方法是什么
    本篇内容介绍了“Vue3中响应式的特殊处理方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!vue2 vs vue3两个响应式更新的核...
    99+
    2023-07-06
  • Vue的响应式原理是什么
    本篇内容介绍了“Vue的响应式原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Depvar Dep = ...
    99+
    2023-06-20
  • vue响应式原理是什么
    Vue 的响应式原理是通过数据劫持(Object.defineProperty)实现的,其核心思想是将数据模型和视图模型进行双向绑定...
    99+
    2023-05-13
    vue响应式原理 vue
  • Vue中响应式原理是什么
    这篇文章主要介绍“Vue中响应式原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中响应式原理是什么”文章能帮助大家解决问题。响应式在日常开发中的应用是很常见的,这里举个简单的例子:le...
    99+
    2023-07-05
  • 深入理解Vue的数据响应式
    目录1. ES语法的getter和setter2. ES语法的 defineProperty3. Vue对数据的代理和监听4. Vue的数据响应式1. ES语法的getter和set...
    99+
    2022-11-12
  • flask响应错误的处理及errorhandler的应用方式是什么
    本篇内容介绍了“flask响应错误的处理及errorhandler的应用方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!flask响...
    99+
    2023-07-04
  • Java8处理数据的函数式方式是什么
    本篇内容介绍了“Java8处理数据的函数式方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!处理数据的函数式方式Java 8 不仅仅添...
    99+
    2023-06-17
  • Vue响应式流程及原理是什么
    本文小编为大家详细介绍“Vue响应式流程及原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue响应式流程及原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、组件化流程1. 整个new Vue...
    99+
    2023-07-02
  • vue3响应式原理和api编写的方法是什么
    这篇文章主要讲解了“vue3响应式原理和api编写的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3响应式原理和api编写的方法是什么”吧!前言vue3响应式原理加api编写...
    99+
    2023-06-22
  • Vue 3中响应式的实现原理是什么
    本篇文章给大家分享的是有关Vue 3中响应式的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 实现响应式响应基本类型变量首先...
    99+
    2022-10-19
  • vue3响应式实现readonly的方法是什么
    readonly的实现it("happy path", () => { console.warn = vi.fn(); const original = { foo: 1, };...
    99+
    2023-05-21
    Vue3 readonly
  • Python推导式数据处理方式是什么
    今天小编给大家分享一下Python推导式数据处理方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言推导式是一种独特...
    99+
    2023-07-02
  • vue3.0响应式函数原理是什么
    这篇文章将为大家详细讲解有关vue3.0响应式函数原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言:Vue3重写了响应式系统,和Vue2相比底层采用Proxy对象实现,在初始化的时候不需要遍历...
    99+
    2023-06-29
  • Vue+TypeScript中处理computed的方式是什么
    今天小编给大家分享一下Vue+TypeScript中处理computed的方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-06-29
  • Vue中响应式系统实现原理是什么
    本篇内容介绍了“Vue中响应式系统实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架每个组件实例都会对应一个watcher实例...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作