JavaScript实现一个简单的双向绑定

一、基本实现
<body>
    <input type="text" id='input'>
    <span id="show"></span>
</body>
<script>
    var obj = {} 

    Object.defineProperty(obj, 'txt', {
        get: function(){
            return obj
        },
        set: function(newValue){           
            document.getElementById('input').value = newValue
            document.getElementById('show').innerHTML = newValue
        }
    })
    
    document.getElementById('input').addEventListener('keyup', function(e){
       obj.txt = e.target.value
    })
</script>

解析其原理:
在这里插入图片描述

当通过input进行输入时,span的文本值会相应更新;当通过控制台改变obj.txt的值时,input输入框内的值也会相应改变,从而实现了view=>model,model=>view的双向绑定。

不过这种简单绑定不会真正执行obj.txt = e.target.value,因为在setter内部没有保存新值,获取obj.txt时,getter始终返回{}

如果在setter中赋值obj.txt = e.target.value,则会造成无限循环(在setter内部给obj.txt赋值,一修改值又进入setter,又给obj.txt赋值,又进入setter。。。最终栈溢出)。

为了解决这个问题,将Object.defineProperty()封装为一个函数,即可在其中保存状态obj.txt,修改如下:

<body>
    <input type="text" id='input'>
    <span id="show"></span>
</body>
<script>   
    function defineProperty(obj, attr){
        var val;
        Object.defineProperty(obj, attr, {
          get: function(){
              return val
          },
          set: function(newValue){
              if(newValue === val) return;
              val = newValue           
              document.getElementById('input').value = newValue
              document.getElementById('show').innerHTML = newValue
          }
      })
    }

    var obj = {} 
    defineProperty(obj, 'txt')

    document.getElementById('input').addEventListener('keyup', function(e){
       obj.txt = e.target.value
    })
</script>

这就基本实现了一个最简单的双向绑定。

参考:
【JavaScript学习笔记】自己实现双向绑定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值