数据双向绑定模拟

---搬运于视频学习demo---

创建js模拟文件 euv.js

/**
 * 观察某个对象的所有属性
 * @param {object} obj
 */
function observe(obj){
  Object.keys(obj).forEach(item => {
    let value = obj[item]
    const funs = []
    Object.defineProperty( obj, item , {
      get: function() {
        // 收集依赖 记录绑定的函数
        if(window.__fun && !funs[window.__fun]){
          funs.push(window.__fun)
        }
        
        return value
      },
      set: function(val){
        value = val
        // 派发更新 运行依赖函数
        funs.forEach(item => {
          item()
        })
      }
    })
  })
}
/**
 * @param {将相关的依赖进行函数注册} fun 
 */
function autoRun(fun){
  window.__fun = fun
  fun()
  window.__fun = null
}

将js文件引入到html 进行使用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数据双向绑定模拟</title>
</head>
<body>
  <div class="name"></div>
  <div class="age"></div>
  <div class="height"></div>

  <!-- 通过input 输入值 修改 data数据,数据同步更新到界面 -->
  <input type="text" onchange="data.name = this.value" >  
  <script src="./euv.js"></script>
</body>
<script>
  const data = {
    name: '张三',
    age: 18,
    height: 180
  }

  // 将数据放入观察
  observe(data)

  // 使用数据
  function showName(){
    const name = document.getElementsByClassName('name')[0]
    name.innerText = data.name
  }
  function showAge(){
    const age = document.getElementsByClassName('age')[0]
    age.innerText = data.age
  }
  function showHeight(){
    const height = document.getElementsByClassName('height')[0]
    height.innerText = data.height
  }

  // 注册依赖函数,后续数据更新将会触发依赖,同步更新
  autoRun(showName)
  autoRun(showAge)
  autoRun(showHeight)


</script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值