广告
返回顶部
首页 > 资讯 > 精选 >vue 数据双向绑定怎么实现
  • 120
分享到

vue 数据双向绑定怎么实现

2023-06-06 18:06:09 120人浏览 独家记忆
摘要

这篇文章给大家分享的是有关Vue 数据双向绑定怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 前言实现简易版的数据双向绑定2. 代码实现2.1 目的分析本文要实现的效果如下图所示:本文用到的html和

这篇文章给大家分享的是有关Vue 数据双向绑定怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1. 前言

实现简易版的数据双向绑定

vue 数据双向绑定怎么实现

2. 代码实现

2.1 目的分析

本文要实现的效果如下图所示:

vue 数据双向绑定怎么实现

本文用到的htmljs主体代码如下:

<div id="app">  <h2 v-text="msg"></h2>  <input type="text" v-model="msg">  <div>    <h2 v-text="msg2"></h2>    <input type="text" v-model="msg2">  </div></div>
let vm = new Vue({    el: "#app",    data: {      msg: "hello world",      msg2: "hello xiaofei"    }  })

我们将按照下面三个步骤来实现:

  • 将data中的数据同步到页面上,实现 M ==> V 的初始化;

  • 当input框中输入值时,将新值同步到data中,实现 V ==> M 的绑定;

  • 当data数据发生更新的时候,触发页面发生变化,实现 M ==> V 的绑定。

2.2 实现过程

2.2.1 入口代码

首先,我们要创造一个Vue类,这个类接收一个 options 对象,同时,我们要对 options 对象中的有效信息进行保存;

然后,我们有三个主要模块:Observer、Compile、Wathcer,其中,Observer用来数据劫持的,Compile用来解析元素,Wathcer是观察者。可以写出如下代码:(Observer、Compile、Wathcer这三个概念,不用细究,后面会详解讲解)。

class Vue {    // 接收传进来的对象    constructor(options) {      // 保存有效信息      this.$el = document.querySelector(options.el);      this.$data = options.data;      // 容器: {属性1: [wathcer1, wathcer2...], 属性2: [...]},用来存放每个属性观察者      this.$watcher = {};      // 解析元素: 实现Compile      this.compile(this.$el); // 要解析元素, 就得把元素传进去      // 劫持数据: 实现 Observer      this.observe(this.$data); // 要劫持数据, 就得把数据传入    }    compile() {}    observe() {}  }
2.2.2 页面初始化

在这一步,我们要实现页面的初始化,即解析出v-text和v-model指令,并将data中的数据渲染到页面中。

这一步的关键在于实现compile方法,那么该如何解析el元素呢?思路如下:

  • 首先要获取到el下面的所有子节点,然后遍历这些子节点,如果子节点还有子节点,那我们就需要用到递归的思想;

  • 遍历子节点找到所有有指令的元素,并将对应的数据渲染到页面中。

代码如下:(主要看compile那部分)

class Vue {    // 接收传进来的对象    constructor(options) {      // 获取有用信息      this.$el = document.querySelector(options.el);      this.$data = options.data;      // 容器: {属性1: [wathcer1, wathcer2...], 属性2: [...]}      this.$watcher = {};      // 2. 解析元素: 实现Compile      this.compile(this.$el); // 要解析元素, 就得把元素传进去      // 3. 劫持数据: 实现 Observer      this.observe(this.$data); // 要劫持数据, 就得把数据传入    }    compile(el) {      // 解析元素下的每一个子节点, 所以要获取el.children      // 备注: children 返回元素集合, childnodes返回节点集合      let nodes = el.children;      // 解析每个子节点的指令      for (var i = 0, length = nodes.length; i < length; i++) {        let node = nodes[i];        // 如果当前节点还有子元素, 递归解析该节点        if(node.children){          this.compile(node);        }        // 解析带有v-text指令的元素        if (node.hasAttribute("v-text")) {          let attrVal = node.getAttribute("v-text");          node.textContent = this.$data[attrVal]; // 渲染页面        }        // 解析带有v-model指令的元素        if (node.hasAttribute("v-model")) {          let attrVal = node.getAttribute("v-model");          node.value = this.$data[attrVal];        }      }    }    observe(data) {}  }

这样,我们就实现页面的初始化了。

vue 数据双向绑定怎么实现

2.2.3 视图影响数据

因为input带有v-model指令,因此我们要实现这样一个功能:在input框中输入字符,data中绑定的数据发生相应的改变。

我们可以在input这个元素上绑定一个input事件,事件的效果就是:将data中的相应数据修改为input中的值。

这一部分的实现代码比较简单,只要看标注那个地方就明白了,代码如下:

class Vue {    constructor(options) {      this.$el = document.querySelector(options.el);      this.$data = options.data;            this.$watcher = {};        this.compile(this.$el);      this.observe(this.$data);    }    compile(el) {      let nodes = el.children;      for (var i = 0, length = nodes.length; i < length; i++) {        let node = nodes[i];        if(node.children){          this.compile(node);        }        if (node.hasAttribute("v-text")) {          let attrVal = node.getAttribute("v-text");          node.textContent = this.$data[attrVal];        }        if (node.hasAttribute("v-model")) {          let attrVal = node.getAttribute("v-model");          node.value = this.$data[attrVal];          // 看这里!!只多了三行代码!!          node.addEventListener("input", (ev)=>{            this.$data[attrVal] = ev.target.value;            // 可以试着在这里执行:console.log(this.$data),            // 就可以看到每次在输入框输入文字的时候,data中的msg值也发生了变化          })        }      }    }    observe(data) {}  }
2.2.4 数据影响视图

至此,我们已经实现了:当我们在input框中输入字符的时候,data中的数据会自动发生更新;

本小节的主要任务是:当data中的数据发生更新的时候,绑定了该数据的元素会在页面上自动更新视图。具体思路如下:

1) 我们将要实现一个 Wathcer 类,它有一个update方法,用来更新页面。观察者的代码如下:

class Watcher{    constructor(node, updatedAttr, vm, expression){      // 将传进来的值保存起来,这些数据都是渲染页面时要用到的数据      this.node = node;      this.updatedAttr = updatedAttr;      this.vm = vm;      this.expression = expression;      this.update();    }    update(){      this.node[this.updatedAttr] = this.vm.$data[this.expression];    }  }

2) 试想,我们该给哪些数据添加观察者?何时给数据添加观察者?

在解析元素的时候,当解析到v-text和v-model指令的时候,说明这个元素是需要和数据双向绑定的,因此我们在这时往容器中添加观察者。我们需用到这样一个数据结构:{属性1: [wathcer1, wathcer2...], 属性2: [...]},如果不是很清晰,可以看下图:

vue 数据双向绑定怎么实现

可以看到:vue实例中有一个$wathcer对象,$wathcer的每个属性对应每个需要绑定的数据,值是一个数组,用来存放观察了该数据的观察者。(备注:Vue源码中专门创造了Dep这么一个类,对应这里所说的数组,本文属于简易版本,就不过多介绍了)

3) 劫持数据:利用对象的访问器属性getter和setter做到当数据更新的时候,触发一个动作,这个动作的主要目的就是让所有观察了该数据的观察者执行update方法。

总结一下,在本小节我们需要做的工作:

  1. 实现一个Wathcer类;

  2. 在解析指令的时候(即在compile方法中)添加观察者;

  3. 实现数据劫持(实现observe方法)。

完整代码如下:

  class Vue {    // 接收传进来的对象    constructor(options) {      // 获取有用信息      this.$el = document.querySelector(options.el);      this.$data = options.data;      // 容器: {属性1: [wathcer1, wathcer2...], 属性2: [...]}      this.$watcher = {};      // 解析元素: 实现Compile      this.compile(this.$el); // 要解析元素, 就得把元素传进去      // 劫持数据: 实现 Observer      this.observe(this.$data); // 要劫持数据, 就得把数据传入    }    compile(el) {      // 解析元素下的每一个子节点, 所以要获取el.children      // 拓展: children 返回元素集合, childNodes返回节点集合      let nodes = el.children;      // 解析每个子节点的指令      for (var i = 0, length = nodes.length; i < length; i++) {        let node = nodes[i];        // 如果当前节点还有子元素, 递归解析该节点        if (node.children) {          this.compile(node);        }        if (node.hasAttribute("v-text")) {          let attrVal = node.getAttribute("v-text");          // node.textContent = this.$data[attrVal];           // Watcher在实例化时调用update, 替代了这行代码                    // 往容器中添加观察者: {msg1: [Watcher, Watcher...], msg2: [...]}          if (!this.$watcher[attrVal]) {            this.$watcher[attrVal] = [];          }          this.$watcher[attrVal].push(new Watcher(node, "innerHTML", this, attrVal))        }        if (node.hasAttribute("v-model")) {          let attrVal = node.getAttribute("v-model");          node.value = this.$data[attrVal];          node.addEventListener("input", (ev) => {            this.$data[attrVal] = ev.target.value;          })          if (!this.$watcher[attrVal]) {            this.$watcher[attrVal] = [];          }          // 不同于上处用的innerHTML, 这里input用的是vaule属性          this.$watcher[attrVal].push(new Watcher(node, "value", this, attrVal))        }      }    }    observe(data) {      Object.keys(data).forEach((key) => {        let val = data[key];  // 这个val将一直保存在内存中,每次访问data[key],都是在访问这个val        Object.defineProperty(data, key, {          get() {            return val;  // 这里不能直接返回data[key],不然会陷入无限死循环          },          set(newVal) {            if (val !== newVal) {              val = newVal;// 同理,这里不能直接对data[key]进行设置,会陷入死循环              this.$watcher[key].forEach((w) => {                w.update();              })            }          }        })      })    }  }  class Watcher {    constructor(node, updatedAttr, vm, expression) {      // 将传进来的值保存起来      this.node = node;      this.updatedAttr = updatedAttr;      this.vm = vm;      this.expression = expression;      this.update();    }    update() {      this.node[this.updatedAttr] = this.vm.$data[this.expression];    }  }  let vm = new Vue({    el: "#app",    data: {      msg: "hello world",      msg2: "hello xiaofei"    }  })

至此,代码就完成了。

感谢各位的阅读!关于“vue 数据双向绑定怎么实现”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: vue 数据双向绑定怎么实现

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

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

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

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

下载Word文档
猜你喜欢
  • vue双向数据绑定怎么实现
    Vue的双向数据绑定是通过v-model指令来实现的。1. v-model是Vue提供的一个指令,用于在表单元素上实现双向数据绑定。...
    99+
    2023-08-09
    vue
  • vue 数据双向绑定怎么实现
    这篇文章给大家分享的是有关vue 数据双向绑定怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 前言实现简易版的数据双向绑定2. 代码实现2.1 目的分析本文要实现的效果如下图所示:本文用到的HTML和...
    99+
    2023-06-06
  • vue实现双向数据绑定
    本文实例为大家分享了vue实现双向数据绑定的具体代码,供大家参考,具体内容如下 vue中数组与对象采用了不同的绑定方式 1.vue对象数据绑定 (1)数据侦测 在js中,我们使用Ob...
    99+
    2022-11-12
  • Vue中怎么实现数据双向绑定
    这篇文章主要介绍了Vue中怎么实现数据双向绑定的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中怎么实现数据双向绑定文章都会有所收获,下面我们一起来看看吧。在我们使用vue的时候,当数据发生了改变,界面也会...
    99+
    2023-07-04
  • Vue 中怎么实现数据双向绑定
    本篇文章给大家分享的是有关 Vue 中怎么实现数据双向绑定,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MVVM 架构的优点低耦合。视图(Vi...
    99+
    2022-10-19
  • vue中双向数据绑定怎么实现
    vue中双向数据绑定是通过数据劫持结合发布订阅模式的方式来实现的,其核心方法是Object.defineProperty()方法。实现双向数据绑定的示例:<!DOCTYPE html><html><h...
    99+
    2022-10-11
  • 怎么在vue中实现数据双向绑定
    怎么在vue中实现数据双向绑定?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。vue是什么Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的...
    99+
    2023-06-14
  • vue实现简单数据双向绑定
    本文实例为大家分享了vue实现简单数据双向绑定的具体代码,供大家参考,具体内容如下 这里是简单的实现,有助于新手理解消化,当然vue要实现双向数据代理不可缺少,期待后续在更新 vue...
    99+
    2022-11-12
  • vue如何实现数据双向绑定
    Vue.js是一个流行的前端框架,它提供了多种方式来实现数据双向绑定。数据双向绑定是Vue.js最重要的特性之一,它使得开发者能够根据数据的变化自动更新视图,同时也能根据视图的变化自动更新数据。因此,Vue.js的数据双向绑定也成为前端面试...
    99+
    2023-05-14
  • MVVMLight怎么实现双向数据绑定
    这篇文章主要介绍“MVVMLight怎么实现双向数据绑定”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MVVMLight怎么实现双向数据绑定”文章能帮助大家解决问题。第一步:先写一个Model,里面...
    99+
    2023-06-29
  • angular双向数据绑定怎么实现
    Angular双向数据绑定可以通过以下步骤来实现:1. 在HTML模板中使用双大括号({{}})将数据绑定到HTML元素上。例如:{...
    99+
    2023-09-21
    angular
  • 详解用Vue怎么实现数据的双向绑定
    在Vue.js中,双向数据绑定是一项非常强大的功能,它能够使数据和视图之间保持同步,让开发者更加方便地操作数据。在本文中,我们将介绍如何用Vue.js实现数据的双向绑定。1. 理解双向绑定首先,我们需要了解双向绑定的原理。在Vue.js中...
    99+
    2023-05-14
    Vue.js
  • vue怎么使用defineProperty实现数据的双向绑定
    这篇文章主要讲解了“vue怎么使用defineProperty实现数据的双向绑定”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么使用defineProperty实现数据的双向绑定”吧...
    99+
    2023-07-04
  • Vue数据的双向绑定如何实现
    本篇内容介绍了“Vue数据的双向绑定如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实现组件双向数据绑定我们先来看看抛弃 .sync ...
    99+
    2023-07-04
  • Vue 3.0 中怎么实现双向绑定
    本篇文章为大家展示了Vue 3.0 中怎么实现双向绑定,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。双向绑定由两个单向绑定组成:模型 &mdash;>...
    99+
    2022-10-19
  • proxy怎么实现数据的双向绑定
    本篇内容介绍了“proxy怎么实现数据的双向绑定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面随着 vue3.x 的消息越来越多,p...
    99+
    2023-06-03
  • Vue2.0中怎么实现数据的双向绑定
    这篇文章给大家介绍Vue2.0中怎么实现数据的双向绑定,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现组件双向数据绑定在上一节中最后的示例使用的是Vue 1.0版本中的 .sync ...
    99+
    2022-10-19
  • Vue如何实现双向绑定
    这篇文章主要介绍Vue如何实现双向绑定,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!原理当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍...
    99+
    2022-10-19
  • angular+bootstrap怎么实现双向数据绑定实例
    这篇文章主要介绍angular+bootstrap怎么实现双向数据绑定实例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果图:代码如下:<!doctype html...
    99+
    2022-10-19
  • 聊聊Vue中如何实现数据双向绑定
    在我们使用vue的时候,当数据发生了改变,界面也会跟着更新,但这并不是理所当然的,我们修改数据的时候vue是如何监听数据的改变以及当数据发生改变的时候vue如何让界面刷新的?当我们修改数据的时候vue是通过es5中的Object.defin...
    99+
    2022-11-24
    Vue vue.js
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作