美文网首页
js实现数据双向绑定

js实现数据双向绑定

作者: _BuzzLy | 来源:发表于2020-04-27 19:00 被阅读0次

接上一篇文章《js实现数据单向绑定
上篇文章中用原生js实现了数据的单向绑定。本篇文章继续介绍如何用js实现数据的双向绑定。绑定的方式模仿vue中的v-model指令。

创建标签

<div id="div1">
  <input type="text" v-model="name">
  <br> 姓名:{{name}}
</div>

创建一个输入框,使用v-model属性绑定变量name,注意这里只是模仿vue绑定的形式,代码中并没有引入任何vue依赖。完全靠原生js实现。

单向绑定

let el = document.getElementById('app');
let template = el.innerHTML;
let _data = {
  name: '_BuzzLy'
};

let data = new Proxy(_data, {
  set(obj, name, value) {
    obj[name] = value;
    render();
  }
});

render();

function render() {
  el.innerHTML = template.replace(/\{\{\w+\}\}/g, str => {
    str = str.substring(2, str.length - 2);
    return _data[str];
  });
}

到这我们又实现了一遍单向绑定,想要实现数据的双向绑定其实很简单,只需稍微修改我们的render函数。

双向绑定

function render() {
  el.innerHTML = template.replace(/\{\{\w+\}\}/g, str => {
    str = str.substring(2, str.length - 2);
    return _data[str];
  });

  // 找到所有input标签
  Array.from(el.getElementsByTagName('input'))
   // 过滤得到其中带有v-model属性的标签 
   .filter(ele => ele.getAttribute('v-model'))
   // 遍历这些input标签
   .forEach(input => {
      // 获取到v-model中绑定的key,从数据中找到key对应的value赋给input
      // 这一步就相当于数据=>视图的绑定
      let name = input.getAttribute('v-model');
      input.value = _data[name];
    
      // 为input绑定输入事件
      input.oninput = function () {
        // 当input修改时,将修改后的值赋给暴露在外的data对象
        // 这一步就实现了视图=>数据的绑定
        data[name] = this.value;
      };
  });
}

修改后的render函数通过过滤、遍历得到每一个拥有v-model属性的input标签,然后将数据绑定到视图上,并且视图修改也会触发数据的更新,这样就实现了数据的双向绑定。
看似复杂的绑定机制其实就是通过我们熟悉的js一些基础的操作来实现的。


完整代码

<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <div id="div1">
    <input type="text" v-model="name">
    <br> 姓名:{{name}}
  </div>
</body>
<script>
  let el = document.getElementById('div1');
  let template = el.innerHTML;
  let _data = {
    name: '_BuzzLy'
  };

  let data = new Proxy(_data, {
    set(obj, name, value) {
      obj[name] = value;
      render();
    }
  });

  render();

  function render() {
    el.innerHTML = template.replace(/\{\{\w+\}\}/g, str => {
      str = str.substring(2, str.length - 2);
      return _data[str];
    });

    Array.from(el.getElementsByTagName('input'))
     .filter(ele => ele.getAttribute('v-model'))
     .forEach(input => {
       let name = input.getAttribute('v-model');
       input.value = _data[name];

       input.oninput = function () {
         data[name] = this.value;
       };
    });
  }
</script>

</html>

相关文章

  • JS双向数据绑定

    双向数据绑定简述 双向数据绑定,可以将JS对象的属性绑定到DOM节点上,实现JS对象跟DOM节点的同名属性的关联,...

  • Vue框架基础

    原生js与Vue框架的区别 用原生实现双向数据绑定 用Vue实现双向数据绑定 Vue是一个javaScript框架...

  • vuejs如何实现数据双向绑定 与 Object.defineP

    vuejs如何实现数据双向绑定 实现数据绑定的做法有大致如下几种: 发布者-订阅者模式(backbone.js)脏...

  • Vue之表单双向数据绑定和组件

    三、表单双向数据绑定和组件 目录:双向数据绑定、组件 1.双向数据绑定 1)什么是双向数据绑定Vue.js是一个M...

  • Vue.js 双向数据绑定原理分析

    在使用Vue.js自定义组件时,很多时候,我们都期望数据是双向绑定的。 Vue.js实现双向数据绑定的两种方式 1...

  • Object.defineproperty实现数据和视图的联动

    实现数据和视图的联动,即实现双向绑定,听起来是不是很牛叉?并且vue.js和avalon.js 都是通过它实现双向...

  • vue 双向数据绑定

    Vue实现数据双向绑定的原理:Object.defineProperty()vue实现数据双向绑定主要是:采用数据...

  • Vue实现数据双向绑定的原理

    Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数...

  • vue 入门

    1.1 vue的引入数据的双向绑定:也就是数据的同步修改 1.1.1. vue与js的对比----js的实现 --...

  • js实现双向数据绑定

    js双向绑定几种方法的介绍 使用Object.defineProperty实现简单的js双向绑定剖析Vue原理&实...

网友评论

      本文标题:js实现数据双向绑定

      本文链接:https://www.haomeiwen.com/subject/qivuwhtx.html