广告
返回顶部
首页 > 资讯 > 精选 >vue2.0双向数据绑定的方法是什么
  • 325
分享到

vue2.0双向数据绑定的方法是什么

2023-06-27 10:06:13 325人浏览 安东尼
摘要

这篇文章主要介绍“Vue2.0双向数据绑定的方法是什么”,在日常操作中,相信很多人在vue2.0双向数据绑定的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2.0双向数据绑定的方法是什么”的疑

这篇文章主要介绍“Vue2.0双向数据绑定的方法是什么”,在日常操作中,相信很多人在vue2.0双向数据绑定的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2.0双向数据绑定的方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一.首先了解什么是发布订阅模式

直接上代码:一个简单的发布订阅模式,帮助大家更好的理解双向数据绑定原理

//发布订阅模式function Dep() {    this.subs = []//收集依赖(也就是手机watcher实例),}Dep.prototype.addSub = function (sub) { //添加订阅者    this.subs.push(sub); //实际上添加的是watcher这个实例}Dep.prototype.notify = function (sub) { //发布,这个方法的作用是遍历数组,让每个订阅者的update方法去执行    this.subs.forEach((sub) => sub.update())}function Watcher(fn) {    this.fn = fn;}Watcher.prototype.update = function () { //添加一个update属性让每一个实例都可以继承这个方法    this.fn();}let watcher = new Watcher(function () {    alert(1)});//订阅let dep = new Dep();dep.addSub(watcher);//添加依赖,添加订阅者dep.notify();//发布,让每个订阅者的update方法执行

二.new Vue()的时候做了什么?

只是针对双向数据绑定做说明

<template>      <div id="app">        <div>obj.text的值:{{obj.text}}</div>        <p>Word的值:{{word}}</p>        <input type="text" v-model="word">    </div></template><script>   new Vue({        el: "#app",        data: {            obj: {                text: "向上",            },            word: "学习"        },        methods:{        //  ...        }    })</script>

Vue 构造函数都干什么了?

function Vue(options = {}) {    this.$options = options;//接收参数    var data = this._data = this.$options.data;    observer(data);//对data中的数据进型循环递归绑定    for (let key in data) {       let val = data[key];       observer(val);       Object.defineProperty(this, key, {           enumerable: true,           get() {               return this._data[key];           },           set(newVal) {               this._data[key] = newVal;           }        })    }    new Compile(options.el, this)};

在 new Vue({…})构造函数时,首先获取参数 options ,然后把参数中的 data 数据赋值给当前实例的 _data 属性上(this._data = this.$options.data),重点来了,那下面的遍历是为什么呢?首先我们在操作数据的时候是 this.word 获取,而不是 this._data.word,所以是做了一个映射,在获取数据的时候 this.word,其实是获取的 this._data.word 的值,大家可以在自己项目中输出this查看一下

vue2.0双向数据绑定的方法是什么

接下来看看 observer 方法干了什么

function observer(data) {    if (typeof data !== "object") return;    return new Observer(data);//返回一个实例}function Observer(data) {    let dep = new Dep();//创建一个dep实例    for (let key in data) {//对数据进行循环递归绑定        let val = data[key];        observer(val);        Object.defineProperty(data, key, {            enumerable: true,            get() {               Dep.target && dep.depend(Dep.target);//Dep.target就是Watcher的一个实例                return val;            },            set(newVal) {                if (newVal === val) {                    return;                }                val = newVal;                observer(newVal);                dep.notify() //让所有方法执行            }        })    }}

Observer 构造函数,首先 let dep=new Dep(),作为之后的触发数据劫持的 get 方法和 set 方法时,去收集依赖和发布时调用,主要的操作就是通过 Object.defineProperty 对 data 数据进行循环递归绑定,使用 getter/setter 修改其默认读写,用于收集依赖和发布更新。

再来看看 Compile 具体干了那些事情

function Compile(el, vm) {    vm.$el = document.querySelector(el);    let fragment = document.createDocumentFragment(); //创建文档碎片,是object类型    while (child = vm.$el.firstChild) {        fragment.appendChild(child);    };//用while循环把所有节点都添加到文档碎片中,之后都是对文档碎片的操作,最后再把文档碎片添加到页面中,这里有一个很重要的特性是,如果使用appendChid方法将原dom树中的节点添加到fragment中时,会删除原来的节点。    replace(fragment);    function replace(fragment) {        Array.from(fragment.childnodes).forEach((node) => {//循环所有的节点            let text = node.textContent;            let reg = /\{\{(.*)\}\}/;            if (node.nodeType === 3 && reg.test(text)) {//判断当前节点是不是文本节点且符不符合{{obj.text}}的输出方式,如果满足条件说明它是双向的数据绑定,要添加订阅者(watcher)                console.log(RegExp.$1); //obj.text                let arr = RegExp.$1.split("."); //转换成数组的方式[obj,text],方便取值                let val = vm;                arr.forEach((key) => { //实现取值this.obj.text                    val = val[key];                });                new Watcher(vm, RegExp.$1, function (newVal) {                    node.textContent = text.replace(/\{\{(.*)\}\}/, newVal)                });                node.textContent = text.replace(/\{\{(.*)\}\}/, val); //对节点内容进行初始化的赋值            }            if (node.nodeType === 1) { //说明是元素节点                let nodeAttrs = node.attributes;                Array.from(nodeAttrs).forEach((item) => {                    if (item.name.indexOf("v-") >= 0) {//判断是不是v-model这种指令                        node.value = vm[item.value]//对节点赋值操作                    }                    //添加订阅者                    new Watcher(vm, item.value, function (newVal) {                        node.value = vm[item.value]                    });                    node.addEventListener("input", function (e) {                        let newVal = e.target.value;                        vm[item.value] = newVal;                    })                })            }            if (node.childNodes) { //这个节点里还有子元素,再递归                replace(node);            }        })    }    //这是页面中的文档已经没有了,所以还要把文档碎片放到页面中    vm.$el.appendChild(fragment);}

Compile(编译方法)首先解释一下 DocuemntFragment(文档碎片)它是一个 dom 节点收容器,当你创造了多个节点,当每个节点都插入到文档当中都会引发一次回流,也就是说浏览器要回流多次,十分耗性能,而使用文档碎片就是把多个节点都先放入到一个容器中,最后再把整个容器直接插入就可以了,浏览器只回流了1次。
Compile 方法首先遍历文档碎片的所有节点,
1.判断是否是文本节点且符不符合{{obj.text}}的双大括号的输出方式,如果满足条件说明它是双向的数据绑定,要添加订阅者(watcher),new Watcher(vm,动态绑定的变量,回调函数fn)
2.判断是否是元素节点且属性中是否含有 v-model 这种指令,如果满足条件说明它是双向的数据绑定,要添加订阅者(watcher),new Watcher(vm,动态绑定的变量,回调函数fn) ,直至遍历完成。最后别忘了把文档碎片放到页面中

Dep构造函数(怎么收集依赖的)

var uid=0;//发布订阅function Dep() {    this.id=uid++;    this.subs = [];}Dep.prototype.addSub = function (sub) { //订阅    this.subs.push(sub); //实际上添加的是watcher这个实例}Dep.prototype.depend = function () { // 订阅管理器    if(Dep.target){//只有Dep.target存在时采取添加        Dep.target.aDDDep(this);    }}Dep.prototype.notify = function (sub) { //发布,遍历数组让每个订阅者的update方法去执行    this.subs.forEach((sub) => sub.update())}

Dep 构造函数内部有一个 id 和一个 subs,id=uid++ ,id用于作为 dep 对象的唯一标识,subs 就是保存 watcher 的数组。depend 方法就是一个订阅的管理器,会调用当前 watcher 的 addDep 方法添加订阅者,当触发数据劫持(Object.defineProperty)的 get 方法时会调用 Dep.target && dep.depend(Dep.target)添加订阅者,当数据改变时触发数据劫持(Object.defineProperty)的 set 方法时会调用 dep.notify 方法更新操作。

Watcher构造函数干了什么

function Watcher(vm, exp, fn) {   this.fn = fn;   this.vm = vm;   this.exp = exp //   this.newDeps = [];   this.depIds = new Set();   this.newDepIds = new Set();   Dep.target = this; //this是指向当前(Watcher)的一个实例   let val = vm;   let arr = exp.split(".");   arr.forEach((k) => { //取值this.obj.text       val = val[k] //取值this.obj.text,就会触发数据劫持的get方法,把当前的订阅者(watcher实例)添加到依赖中   });   Dep.target = null;}Watcher.prototype.addDep = function (dep) {   var id=dep.id;   if(!this.newDepIds.has(id)){       this.newDepIds.add(id);       this.newDeps.push(dep);       if(!this.depIds.has(id)){           dep.addSub(this);       }   }  }Watcher.prototype.update = function () { //这就是每个绑定的方法都添加一个update属性   let val = this.vm;   let arr = this.exp.split(".");   arr.forEach((k) => {        val = val[k] //取值this.obj.text,传给fn更新操作   });   this.fn(val); //传一个新值}

Watcher 构造函数干了什么
1.接收参数,定义了几个私有属性( this.newDep ,this.depIds,this.newDepIds)
2. Dep.target = this,通过参数进行 data 取值操作,这就会触发 Object.defineProperty 的 get 方法,它会通过订阅者管理器(dep.depend())添加订阅者,添加完之后再将 Dep.target=null 置为空;
3.原型上的 addDep 是通过id这个唯一标识,和几个私有属性的判断防止订阅者被多次重复添加
4.update 方法就是当数据更新时,dep.notify()执行,触发订阅者的 update 这个方法, 执行发布更新操作。

到此,关于“vue2.0双向数据绑定的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: vue2.0双向数据绑定的方法是什么

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

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

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

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

下载Word文档
猜你喜欢
  • vue2.0双向数据绑定的方法是什么
    这篇文章主要介绍“vue2.0双向数据绑定的方法是什么”,在日常操作中,相信很多人在vue2.0双向数据绑定的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2.0双向数据绑定的方法是什么”的疑...
    99+
    2023-06-27
  • Vue2.0/3.0双向数据绑定的实现原理是什么
    这篇文章给大家分享的是有关Vue2.0/3.0双向数据绑定的实现原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框...
    99+
    2023-06-14
  • Vue2.0中怎么实现数据的双向绑定
    这篇文章给大家介绍Vue2.0中怎么实现数据的双向绑定,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现组件双向数据绑定在上一节中最后的示例使用的是Vue 1.0版本中的 .sync ...
    99+
    2022-10-19
  • wpf双向绑定的方法是什么
    WPF(Windows Presentation Foundation)中的双向绑定是一种机制,可以在界面控件和数据对象之间实现双向...
    99+
    2023-08-08
    wpf
  • Vue2.0/3.0双向数据绑定的实现原理详解
    Vue2.0/3.0 双向数据绑定的实现原理 双向数据绑定简意 即数据的改变能让页面重新渲染 Vue2.0 ES5的原理: Object.defineProperty 对数据进行拦...
    99+
    2022-11-12
  • 利用js实现Vue2.0中数据的双向绑定功能
    Object.defineProperty了解 语法: Object.defineProperty(obj, prop, descriptor) obj  ...
    99+
    2022-11-12
  • angular双向数据绑定的原理是什么
    Angular的双向数据绑定是通过使用脏检查(Dirty Checking)机制实现的。其原理如下: Angular会为每个绑定的...
    99+
    2023-10-24
    angular
  • 如何用js实现Vue2.0中数据的双向绑定功能
    这篇文章主要介绍了如何用js实现Vue2.0中数据的双向绑定功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用js实现Vue2.0中数据的双向绑定功能文章都会有所收获,下...
    99+
    2022-10-19
  • vue2.x双向数据绑定原理是什么
    这篇文章主要介绍了vue2.x双向数据绑定原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue2.x双向数据绑定原理是什么文章都会有所收获,下面我们一起来看看吧。前言双向数据绑定原理主要运用了发布订阅...
    99+
    2023-07-05
  • vue中双向数据绑定的原理是什么
    本篇文章为大家展示了vue中双向数据绑定的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。双向绑定的思想双向数据绑定的思想就是数据层与UI层的同步,数据再两...
    99+
    2022-10-19
  • vue中数据双向绑定的原理是什么
    vue中数据双向绑定的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前端的数据双向绑定指的是view(视图)和model(数据)...
    99+
    2022-10-19
  • 如何利用js实现Vue2.0中数据的双向绑定功能
    本篇内容主要讲解“如何利用js实现Vue2.0中数据的双向绑定功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用js实现Vue2.0中数据的双向绑定功能”吧!Object.defineP...
    99+
    2023-06-20
  • vue双向绑定的概念是什么
    本文小编为大家详细介绍“vue双向绑定的概念是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue双向绑定的概念是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue双向绑定的含义是:当数据发生变化时,...
    99+
    2023-06-29
  • linux双网卡绑定的方法是什么
    在Linux中,绑定双网卡可以使用以下方法: 使用网络连接绑定(Network Bonding): 安装 ifenslave ...
    99+
    2023-10-23
    linux
  • proxy怎么实现数据的双向绑定
    本篇内容介绍了“proxy怎么实现数据的双向绑定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面随着 vue3.x 的消息越来越多,p...
    99+
    2023-06-03
  • MVVMLight怎么实现双向数据绑定
    这篇文章主要介绍“MVVMLight怎么实现双向数据绑定”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MVVMLight怎么实现双向数据绑定”文章能帮助大家解决问题。第一步:先写一个Model,里面...
    99+
    2023-06-29
  • vue双向数据绑定怎么实现
    Vue的双向数据绑定是通过v-model指令来实现的。1. v-model是Vue提供的一个指令,用于在表单元素上实现双向数据绑定。...
    99+
    2023-08-09
    vue
  • 怎么理解JavaScript数据双向绑定
    本篇内容介绍了“怎么理解JavaScript数据双向绑定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!模板...
    99+
    2022-10-19
  • angular双向数据绑定怎么实现
    Angular双向数据绑定可以通过以下步骤来实现:1. 在HTML模板中使用双大括号({{}})将数据绑定到HTML元素上。例如:{...
    99+
    2023-09-21
    angular
  • vue 数据双向绑定怎么实现
    这篇文章给大家分享的是有关vue 数据双向绑定怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 前言实现简易版的数据双向绑定2. 代码实现2.1 目的分析本文要实现的效果如下图所示:本文用到的HTML和...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作