vue原理的理解,简单说一下vue原理

  vue原理的理解,简单说一下vue原理

  本文主要详细介绍了Vue的核心原理。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。

  

目录

  前言:学习目标:Object.definePropertyget,set Data Reflects查看反映到数据的变化M-VV-M优化工作:总结

  

前言:

  相信你看过很多关于Vue2的文章,我也看了很多,但是大部分都是关于如何在项目中应用,如果使用的话技术点的功能如何实现;今天边肖给大家带来的是Vue2核心原理的分析,就是介绍我们常用的Vue2的核心内容,以及我们简单的代码背后他做了什么,让大家知道为什么。

  

学习目标:

  理解Object.defineProperty的原理,理解set和get的关系,理解从数据反应到图形识别的过程,理解视图变化如何影响数据掌握MVVM。

  

Object.defineProperty

  脚本

  //1.字面量定义

  let data={

  名称:“aa”

  }

  Data.name=bb //在这种情况下,我们无法知道name属性发生了变化。

  //2.对象.定义属性

  让数据1={}

  Object.defineProperty(数据1,名称,{

  //当我们访问data1的name属性时自动调用的方法

  //而get函数的返回值就是你得到的值

  get() {

  Console.log(您访问了data1的name属性)

  返回“aa”

  },

  //设置和修改name属性时自动调用的函数

  //并且属性的最新值将作为参数传入。

  set(newValue) {

  Console.log(您修改了data1的name属性,最新值为,newValue)

  //只要修改name属性,就会执行这个位置。

  //所以如果你想在名字变的时候完成自己的某件事

  //都可以放在这里执行。

  //1.ajax()

  //2.操作dom区域

  }

  })

  //以上是js中对象定义的另一种方案,在访问和设置属性时可以自动调用相应的函数。

  //访问属性:data.name数据[name]

  //Set属性:data.name=bb data[name]=bb

  /脚本

  响应核心API

  

get、set

  脚本

  //let data={

  //名称: aa

  //}

  让数据={}

  let _name=aa

  Object.defineProperty(data, name ,{

  get() {

  Console.log(您访问了data1的name属性)

  返回名称

  },

  set(newValue) {

  Console.log(您修改了data1的name属性,最新值为,newValue)

  _name=newValue

  }

  })

  //问题原因:在get中直接返回了一个固定值,在set函数中获得了新值但什么都没做。

  //解决方法:通过声明一个中间变量,让get函数返回这个变量。

  //并在set函数中给这个中间变量设置最新值,作为set和get操作之一。

  //数据的效果

  /脚本

  

数据反应到视图

  数据的变化会引起视图的变化(通过操作dom把数据放到相应的位置。如果数据改变,用数据的最新值再放一次)

  方案一:命令式操作

  1 . document . query selector(# app)。innerText=data.name

  2.重新执行document . query selector(# app)。2.set函数中的innerText=data.name。

  方案二:声明式渲染

  虚拟文本指令的实现

  p v-text=name/p

  核心逻辑:通过‘模板编译’找到标有v-text的元素,然后通过操作domapi把相应的数据放到上面。

  div id=应用程序

  p v-text=name/p

  p/p

  /应用程序

  1.通过app根元素找到所有子节点(元素节点、文本节点……)-DOM . node children。

  2.按节点类型过滤出元素节点(p)-节点类型1元素节点3文本节点。

  3.通过v-text找到需要设置的具体节点Pv-text/P4。找到与V-text标签绑定的元素,并获取它的所有属性id Class V-text=" name "

  5.通过v-text="name "获取指令类型 v-text ,并获取要绑定数据的属性名 name。

  6.确定使用了当前的v-text指令,然后通过操作domapi将对应于name属性的值放在node.innerText=data[name]上。

  整个过程可以称为“模板编译”

  

视图的变化反映到数据

  元素v模型双向绑定

  均值方差模型

  叶酸

  

M - V

  1.通过app根元素找到所有子节点(元素节点、文本节点……)-DOM . node children。

  2.按节点类型过滤出元素节点(p)-节点类型1元素节点3文本节点。

  3.通过v-text找到需要设置的具体节点Pv-text/P4。找到与V-text标签绑定的元素,并获取它的所有属性id Class V-text=" name "

  5.通过V-model="name "获取指令类型 V-model ,获取要绑定数据的属性名 name 。

  6.确定使用的是当前的v-model指令,然后通过操作domapi把name属性对应的值放到node.value=data[name]上。

  V-model和v-text完全一致,只是指令类型和使用的dom api不同。

  

V - M

  本质:事件监控在回调函数中获取输入的最新值,然后将其赋给绑定的属性。

  node.addEventListener(input ,(e)={

  数据[名称]=电子目标值

  })

  以上总结:

  1.数据响应

  2.数据更改会影响视图

  3.视图更改会影响数据。

  4.指令是如何实现的(传统的实现逻辑)

  

优化工作:

  1.通用的数据响应式处理

  data(){

  返回{

  名称: cp ,

  年龄:28岁

  }

  }

  以现成的数据为基础,然后全部加工成有求必应。

  Object.keys(data) //由所有对象的键组成的数组

  Object.keys(数据)。forEach(key={

  //键属性名

  //数据[键]属性值

  //数据原始对象

  //将所有键转换成get和set的形式

  defineReactive(数据,键,数据[键])

  })

  函数定义有效(数据,键,值){

  Oject.defineProperty(数据、键、{

  get(){

  返回值

  },

  set(newValue){

  值=新值

  }

  })

  }

  2.发布订阅模式

  问题:

  差异

  p v-text=name/p

  p v-text=name/p

  div v-text=age/div

  /div

  改名后我需要做的是更新两个P标签。现在无论更新哪个数据,所有标签都会重新运算赋值,无法准确更新。

  解决问题的思路:

  1.数据更改后最关键的代码是什么?

  node.innerText=data[name]

  2.设计一个存储结构。

  每个响应数据可以由“一对多”关系中的多个标签绑定。

  {

  名称:[()={节点(p1)。innerText=data[name]},()={ node(p2)。innerText=data[name]}.]

  }

  通过发布(自定义事件)解决的问题是“一对多”问题。

  实现简单的发布-订阅模型:

  浏览器的事件模型

  dom.addEventLister(click ,()={})

  只要调用click事件,就会执行所有绑定的回调函数,这显然是一对多的关系。

  const Dep={

  地图:{},

  收集(事件名称,fn){

  //如果当前事件从未被收集过,首先将其初始化为一个数组

  如果(!this . map[事件名称]){

  this . map[事件名称]=[]

  }

  //如果已经初始化了,就推一推,加一个。

  this . map[事件名称]。推动(fn)

  },

  触发器(事件名称){

  this . map[事件名称]。forEach(fn=fn())

  }

  }

  使用发布-订阅模式优化现有问题

  不管前面的写法有哪些数据变化,我们都可以大致执行一下编译功能。

  以目前的方式,当编译函数第一次被执行时,然后当数据改变时,我们完成更新函数的集合。

  通过数据的key找到对应的更新函数,依次执行,达到精准更新的效果。

  

总结

  本文到此为止。希望能帮到你,也希望你能多关注我们的更多内容!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: