飞道的博客

用JS简单实现Vue的双向绑定

398人阅读  评论(0)

Vue实现数据双向绑定原理:

采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty() 将它们转为 getter/setter

这里来简单模拟一下双向绑定。

特点

1.比如input被监视,当输入发送改变时,会将数据推送到模型中。

2.当模型中的数据发生改变时,会映射到视图上。

思路

1.用defineProperty 劫持对象,添加好getter/setter方法,对劫持对象进行赋值时会执行setter,取值时执行getter。

2.页面监视很容易想到事件监听,输入框用addEventListener 添加 input事件,输入发生改变时,触发事件回调,将值赋值给劫持的对象,触发劫持对象的setter,在setter中把新数据写到模型中、同时更新到页面上

代码:


  
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document </title>
  7. </head>
  8. <body>
  9. 输入: <input type='text' id='inputText'/> <br>
  10. 动态值: <span id="show"> </span>
  11. </body>
  12. <script>
  13. var inputText = document.getElementById( "inputText");
  14. var show = document.getElementById( "show");
  15. //输入框添加 input事件
  16. inputText.addEventListener( "input", function(e){
  17. //给劫持对象设置为输入后的值
  18. defineObj.value = e.target.value;
  19. })
  20. //劫持对象
  21. var defineObj = {};
  22. //defineProperty进行劫持
  23. Object.defineProperty(defineObj, 'value', {
  24. configurable: true,
  25. enumerable: true,
  26. get: function() {
  27. return val;
  28. },
  29. set: function(newVal){
  30. val = newVal;
  31. //设置输入值跟随变化
  32. inputText.value = val;
  33. //设置显示值跟随变化
  34. show.innerHTML = val;
  35. }
  36. })
  37. </script>
  38. </html>

最终效果

在文本输入框输入值,会同步展示出来,内存中也同样发生了改变;

改变内存中的数据值,直接映射到页面上。

关注下方公众号,有更多资料、实例代码、面试技巧奉上!


转载:https://blog.csdn.net/dkm123456/article/details/115531729
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场