iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue中v-model和响应式的实现原理解析
  • 620
分享到

vue中v-model和响应式的实现原理解析

2024-04-02 19:04:59 620人浏览 独家记忆
摘要

目录v-model响应式实现v-model 首先要了解v-model就是Vue帮我们封装的语法糖,真正实现靠的还是:v-bind:绑定响应式数据 触发 input 事件 并传递数据

v-model

  • 首先要了解v-model就是Vue帮我们封装的语法糖,真正实现靠的还是:
  • v-bind:绑定响应式数据 触发 input 事件 并传递数据

例如下面示例:

<template>
	// 这两种写法等价
	<input v-bind:name="name" v-on:input="name=$event.target.value"/>
	<input v-model="name"/>
</template>

1、使用v-model经典例子

  • textarea 元素
  • select 下拉框
  • input type='radio' 单选框
  • input type='checkbox' 多选框

2、使用v-model的副作用

绑定的响应式对象某个不存在的属性,那么vue会悄悄增加这个属性,并设置为响应式

// template中:
<el-input v-model="user.tel"></el-input>
// script中:
export default {
  data() {
    return {
      user: {
        name: 'xxx',
      }
    }
  }
}

3、自己开发的组件如何支持v-model

model属性的默认值为

// 默认的 model 属性
export default {
  model: {
    prop: 'value',
    event: 'input'
  },
  data() {...},
  methods: {...},
}

响应式实现

简单一句话理解就是:通过重写数据的get和set属性方法,让数据在被渲染时通过get属性方法把所有用到自己的观察者watcher放入自己的观察者列表subs中,当数据发生变化之后,通过set属性方法将该变化通知给所有的观察者watcher,达到重新渲染。

  • 使用观察者模式
  • 底层使用Object.defineProperty(),给所有的数据都添加gettersetter方法
  • 主要涉及到三个函数:
  • Dep:被观察者类,每个data都有一个Dep实例对象,用于Observer的data触发getter时执行
  • dep.depend收集依赖的watcher
  • Watcher:观察者类,依赖收集以后Watcher对象会被保存在Dep的subs中,数据变动的时候Dep会通知Watcher实例,然后由Watcher实例回调cb进行视图的更新。
  • Observer:将普通数据转化为响应式数据

实现响应式的主要流程:

1、Observer类的构造方法

  • 给当前的数据对象新建一个订阅器Dep
  • 遍历对象的 key 调用 defineReactive 方法(实际绑定getter和setter的地方。get 方法是对依赖进行收集, set 方法是当数据改变时通知 Watcher 派发更新)

2、收集依赖
视图被渲染时,触发get属性方法,调用dep的一个方法dep.depend进行依赖收集

  • Watcher类:依赖就是watcher的实例
  • Dep类:存放依赖的位置,通过Dep.subs[]进行管理依赖

举个?
当前正在渲染componentA时,组件用到了数据 data () { return { a: b + 1} },那么此时就会触发b的get属性方法,将当前的watcher添加到b的订阅者列表subs中

3、派发更新
修改data属性上的某一个值时,会它的触发set属性方法,根据自身的dep.notify(subs保存着所有的观察者,在 notify 方法中首先对 subs 这个观察者列表按照其 id 进行了排序)开始派发更新

为什么要进行排序?

  • 组件的更新由父到子;因为父组件的创建过程是先于子的,所以 watcher 的创建也是先父后子,执行顺序也应该保持先父后子。
  • 用户的自定义 watcher 要优先于渲染 watcher 执行;因为用户自定义 watcher 是在渲染 watcher 之前创建的。
  • 如果一个组件在父组件的 watcher 执行期间被销毁,那么它对应的 watcher 执行都可以被跳过,所以父组件的 watcher 应该先执行。

排序结束以后,会对这个队列进行遍历,执行watcher.run()方法实现数据更新通知

run的逻辑是:

  • 新的值与老的值不同时会触发通知;
  • 但是当值是对象或者 deep 为 true 时无论如何都会进行通知

这也就是为什么可以解释watch数据的时候可以拿到新旧两个值了
watch: { num(new, old) {...} }

自己实现一个响应式

根据以上分析,自己实现一个简易版的数据双向绑定

借鉴文章

到此这篇关于vue中v-model和响应式的实现原理的文章就介绍到这了,更多相关vue v-model响应式原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue中v-model和响应式的实现原理解析

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

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

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

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

下载Word文档
猜你喜欢
  • vue中v-model和响应式的实现原理解析
    目录v-model响应式实现v-model 首先要了解v-model就是vue帮我们封装的语法糖,真正实现靠的还是:v-bind:绑定响应式数据 触发 input 事件 并传递数据 ...
    99+
    2022-11-13
  • vue中v-model的实现原理是什么
    这篇文章主要介绍vue中v-model的实现原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!v-model的实现原理是什么?为什么要使用VueVue是一款友好的、多用途且高性...
    99+
    2022-10-19
  • VUE响应式原理的实现详解
    目录总结前言 相信vue学习者都会发现,vue使用起来上手非常方便,例如双向绑定机制,让我们实现视图、数据层的快速同步,但双向绑定机制实现的核心数据响应的原理是怎么样的呢,接下来让我...
    99+
    2022-11-13
  • Vue中响应式原理的示例分析
    这篇文章主要介绍了Vue中响应式原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Vue 嘴显著的特性之一便是响应式系统(reac...
    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
  • Vue中响应式系统实现原理图文讲解
    目录框架组件结构源码解析在哪里绑定vue实例与watcher实例vue实例中的data响应式初始化对Object的变化监测框架 每个组件实例都会对应一个watcher实例,在组件渲...
    99+
    2023-03-20
    Vue响应式系统 Vue响应式原理
  • 深入理解Vue响应式原理及其实现方式
    目录Vue的响应式Vue2的响应式原理Vue3的响应式原理深入理解响应式1.数据初始化2.对象的数据劫持Vue的响应式 用过Vue这个框架的人应该都知道,数据驱动是Vue框架的核心,...
    99+
    2023-05-19
    Vue响应式原理 Vue响应式原理实现
  • Vue 3中响应式的实现原理是什么
    本篇文章给大家分享的是有关Vue 3中响应式的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 实现响应式响应基本类型变量首先...
    99+
    2022-10-19
  • 详解vue3 响应式的实现原理
    目录核心设计思想Vue.js 2.x 响应式Vue.js 3.x 响应式依赖收集:get 函数派发通知:set 函数总结源码参考核心设计思想 除了组件化,Vue.js 另一个核心设计...
    99+
    2022-11-13
  • vue响应式原理与双向数据的深入解析
    了解object.defineProperty 实现响应式 清楚 observe/watcher/dep 具体指的是什么 了解 发布订阅模式 以及其解决的具体问题 在Javascri...
    99+
    2022-11-12
  • Vue中响应式系统实现原理是什么
    本篇内容介绍了“Vue中响应式系统实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!框架每个组件实例都会对应一个watcher实例...
    99+
    2023-07-05
  • vue数据响应式原理中数组的示例分析
    这篇文章主要介绍vue数据响应式原理中数组的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!src/core/observer/index.jssrc/core/observer/array.js arrayM...
    99+
    2023-06-29
  • vue2和vue3数据响应式原理分析及如何实现
    今天就跟大家聊聊有关vue2和vue3数据响应式原理分析及如何实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据响应式视图跟数据是自动更新的,数据更新的时候视图是自动的更新的追踪...
    99+
    2023-06-22
  • Vue响应式原理与虚拟DOM实现步骤详细讲解
    目录一、什么是响应式系统二、实现原理三、虚拟DOM实现四、总结一、什么是响应式系统 在Vue中,我们可以使用data属性来定义组件的数据。这些数据可以在模板中使用,并且当这些数据发生...
    99+
    2023-05-13
    Vue响应式原理 Vue虚拟DOM
  • Vue.js中实现响应式的原理是什么
    Vue.js中实现响应式的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Vue.js 响应式的使用现在有个很简单的需求,点击页面...
    99+
    2022-10-19
  • Vue模拟响应式原理底层代码实现的示例
    目录1.Vue.js功能:2.Observer.js功能(数据劫持):3.Compiler.js功能:4.Dep.js功能:5.Watcher.js功能:整体分析Vue的基本结构如下...
    99+
    2022-11-12
  • Vue中$on和$emit的实现原理分析
    目录Vue中发布订阅模式$emit和$on用法深挖首先剖析一下$on的原理实现有一点要记住先定义的先触发分析$emit先打个断点Vue中发布订阅模式 在Vue中采用了发布订阅模式,典...
    99+
    2022-11-13
  • java多线程join()方法的作用和实现原理解析(应用场景)
    1、join() 方法的作用     这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码; 2、应用场景 比如有三个人小红、小李、小王, 三...
    99+
    2022-11-12
  • 从JavaScript教程中了解重定向的原理和实现方式?
    重定向是一种常见的Web开发技术,它可以将用户重定向到另一个页面或站点。JavaScript是一种非常流行的Web编程语言,它可以用来实现重定向功能。在本篇文章中,我们将从JavaScript教程中了解重定向的原理和实现方式。 一、重定向的...
    99+
    2023-06-26
    重定向 javascript 教程
  • Vue中计算属性、监听属性、数据的响应式更新和依赖收集基本原理是什么
    这篇文章主要介绍“Vue中计算属性、监听属性、数据的响应式更新和依赖收集基本原理是什么”,在日常操作中,相信很多人在Vue中计算属性、监听属性、数据的响应式更新和依赖收集基本原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作