首页 > 其他分享 >牛客JS题(三十八)双向绑定

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

时间:2024-08-12 17:25:59浏览次数:6  
标签:三十八 weight person inp value JS 牛客 render ul

注释很详细,直接上代码

涉及知识点:

  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仓库

标签:三十八,weight,person,inp,value,JS,牛客,render,ul
From: https://blog.csdn.net/m0_73756108/article/details/141125251

相关文章

  • JSP广州中小学学校信息管理系统_j3o8r(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,区域分类,招生信息,机构活动,成绩排名,获奖排名,社团排名,特色排名开题报告内容一、项目背景与意义随着教育信息化步伐的加快,广州作为教育强市,对......
  • node.js 学习
    今天为大家推荐一款VSCode的插件FittenCode,FittenCode是由非十大模型驱动的AI编程助手,它可以自动生成代码,提升开发效率,帮您调试Bug,节省您的时间,另外还可以对话聊天,解决您编程碰到的问题。https://www.runoob.com/nodejs/fitten-code-nodejs.html#post-25998-10更改node......
  • CommonJS、AMD、CMD、UMD、ES6
    一、commonJs1、CommonJS的发扬光大和nodejs相关,CommonJS用同步的方式加载模块。在服务器端,读取快。限于网络原因,不适合在浏览器端使用;2、输出module.exports,加载require;//model1.jsvarage=11functionsay(){console.log(age);}module.exports={say}/......
  • 基于SpringBoot+MySQL+SSM+Vue.js的物业管理系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的物业管理系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+Sprin......
  • 基于SpringBoot+MySQL+SSM+Vue.js的大学生兼职系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的大学生兼职系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+Spr......
  • 基于SpringBoot+MySQL+SSM+Vue.js的线上教育培训办公系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的线上教育培训办公系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybat......
  • JSP关于浙江传统文化和名胜古迹的宣传网址be1a6
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统功能:用户,传统文化,文化类型,景点分类,名胜古迹,特色美食开题报告内容一、项目背景浙江,作为中国历史悠久、文化底蕴深厚的省份,拥有众多传统文化和名胜古迹......
  • Vue.js 项目中集成高德地图 API
    要在Vue.js项目中集成高德地图API,你可以按照以下步骤操作:###第一步:引入高德地图API首先,你需要在你的Vue项目中引入高德地图的JSAPI。可以通过在HTML文件中直接引入CDN链接或者使用npm安装的方式。####通过CDN引入:在`public/index.html`文件中的`<head......
  • 使用nvm管理多个版本的nodejs
    背景:项目依赖某个版本的nodejs,而我本地需要用最新版,那么就存在多个版本nodejs要使用了,如何方便的进行管理呢?使用nvm!下载地址:https://github.com/coreybutler/nvm-windows/releases 选择适合自己的安装程序即可,我用的Windows64位电脑,所以下载的nvm-setup.exe......
  • node.js 使用joi来验证数据模型
    node.js使用joi来验证数据模型     joi是nodej的一个工具模块,主要用于JavaScript对象的校验。它是一种简单易用的javacript对象约束描述语言,可以轻松解决nodejs开发中的各种参数的校验。 直接上代码//导入joi模块constjoi=require('joi')//定义......