牛客JS题(三十八)双向绑定

注释很详细,直接上代码

涉及知识点:

  1. 浅度监听
  2. 作用域链
  3. Object.defineProperty

题干:
在这里插入图片描述

我的答案

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
  </head>
  <body>
    <style>
      ul {
        list-style: none;
      }
    </style>
    <input type="text" />
    <ul></ul>

    <script>
      /**
       * 我们在JS33做过一个难度更高的深度监听对象,这里就写个简单的浅监听吧
       * 关于监听原理与注意事项,可以参考JS33
       * 抛开原理不谈,咱来说说怎么实现的双向绑定
       * 修改input的值,调用方法修改person.weight的值,
       * 属性值发生变化在set中调用_render函数,在该函数将内容渲染上去
       *
       * 如果是直接改变了属性值,触发set调用_render函数,不仅更新了页面文字的值还更新了输入框的值
       */
      var ul = document.querySelector("ul");
      var person = {
        sex: "男",
        age: "25",
        name: "王大锤",
        height: 28,
        weight: 32,
      };
      var inp = document.querySelector("input");
      inp.value = person.weight;
      const _render = () => {
        var str = `<li>姓名:<span>${person.name}</span></li>
                           <li>性别:<span>${person.sex}</span></li>
                           <li>年龄:<span>${person.age}</span></li>
                           <li>身高:<span>${person.height}</span></li>
                           <li>体重:<span>${person.weight}</span></li>`;
        ul.innerHTML = str;
        inp.value = person.weight;
      };
      _render(ul);
      // 补全代码
      inp.oninput = () => {
        person.weight = inp.value;
      };

      const updateview = (obj) => {
        Object.keys(obj).forEach((item) => {
          let value = obj[item];
          Object.defineProperty(obj, item, {
            get: () => value,
            set: (newValue) => {
              value = newValue;
              _render();
            },
          });
        });
      };
      updateview(person);
      person.weight = 999;
    </script>
  </body>
</html>

博客更新不是很及时,需要看后面内容的可以看看我的gitee仓库

牛客JS题Gitee仓库

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码对我眨眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值