首页 > 其他分享 >前端纯原生js数据监控,更新视图

前端纯原生js数据监控,更新视图

时间:2024-04-11 18:12:30浏览次数:21  
标签:原生 视图 js let value ._ Model div model

还没完善好,先记录一部分

 

binding.js

// 定义Model类,用于存储数据和监听数据变化
function Model(value = "") {
  this._value = value; // 存储数据的值
  this._listeners = []; // 存储监听数据变化的函数
}

// 定义Model类的set方法,用于设置数据的值
Model.prototype.set = function (value) {
  this._value = value; // 设置数据的值
  // 调用所有的监听函数,通知它们数据已经改变
  this._listeners.forEach((listener) => listener.call(this, value));
};

// 定义Model类的get方法,用于获取当前的值
Model.prototype.get = function () {
  return this._value;
};

Model.prototype.xixi = function () {
  return this._value;
};

// 定义Model类的watch方法,用于添加监听函数
Model.prototype.watch = function (listener) {
  this._listeners.push(listener); // 添加监听函数到数组中
};

// 定义View类,用于处理视图的更新
function View(element, model, attribute = "value") {
  this._element = element; // 存储DOM元素
  this._model = model; // 存储数据模型
  this._attribute = attribute; // 存储需要绑定的属性名

  // 添加事件监听器,当元素的值改变时,更新数据模型的值
  this._element.addEventListener("input", (event) => {
    this._model.set(event.target[this._attribute]);
  });

  // 添加监听函数,当数据模型的值改变时,更新元素的值
  this._model.watch((newValue) => {
    console.log(newValue);
    this._element[this._attribute] = newValue;
  });
}

 

简单实现.html

<!DOCTYPE html>
<html>

<head>
  <title>Simple Data Binding</title>
  <style>
    body {
      font-family: Arial, sans-serif;
    }

    input,
    button,
    img {
      margin-top: 20px;
      font-size: 16px;
      padding: 10px;
    }

    img {
      width: 100px;
      height: 100px;
    }
  </style>
</head>

<body>
  <!-- 创建两个输入框和一个按钮 -->
  <input id="input1" type="text">
  <img id="image1" src="">
  <button id="myButton">Click me</button>
  <script src="binding.js"></script>
  <script>
    // 使用方法:
    // 创建两个数据模型和两个视图
    let model1 = new Model();
    let inputElement1 = document.querySelector('#input1');
    let view1 = new View(inputElement1, model1);

    let model2 = new Model();
    let imageElement1 = document.querySelector('#image1');
    let view2 = new View(imageElement1, model2, 'src');

    // 添加按钮点击事件,当按钮被点击时,改变图片的地址
    let buttonElement = document.querySelector('#myButton');
    buttonElement.addEventListener('click', function () {
      model2.set('https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d884628f9d384fc08c1342256a41713f~tplv-k3u1fbpfcp-jj-mark:3024:0:0:0:q75.awebp#?w=1200&h=629&s=325674&e=png&b=fefdfd');

      console.log("获取:", model2.xixi());

    });


  </script>
</body>

</html>

 

数组循环,点击某行元素触发,修改某行的值事件

<!DOCTYPE html>
<html>

<head>
  <title>Array Rendering</title>
  <style>
    body {
      font-family: Arial, sans-serif;
    }

    .item {
      margin-top: 10px;
      padding: 10px;
      border: 1px solid #ccc;
      cursor: pointer;
    }
  </style>
</head>

<body>
  <div id="container"></div>
  <script src="binding.js"></script>
  <script>
    // 定义一个1到10的数字数组
    let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    // 获取容器元素
    let container = document.querySelector('#container');

    // 遍历数组,为每个元素创建一个div,并添加到容器中
    data.forEach(function (item, index) {
      let div = document.createElement('div');
      div.textContent = item;
      div.className = 'item';
      container.appendChild(div);

      // 创建一个数据模型和一个视图
      let model = new Model(item);
      let view = new View(div, model, 'textContent');

      // 为div添加点击事件监听器
      div.addEventListener('click', function () {
        console.log('You clicked on item: ' + model.get());
        let newValue = prompt('Enter a new value for this item:');
        if (newValue !== null && newValue !== '') {
          model.set(newValue);
          console.log("新值:", model.get());
        }
      });
    });
  </script>
</body>

</html>

 

标签:原生,视图,js,let,value,._,Model,div,model
From: https://www.cnblogs.com/Hello233/p/18129796

相关文章

  • js中密码或邮箱等..加密及解密方法
    在JavaScript中,密码和邮箱信息通常需要在客户端加密后再发送到服务器,保证信息的安全性。以下是一个使用CryptoJS库进行加密和解密的例子:首先,需要引入CryptoJS库:<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>然后,可以使用......
  • JS 加减乘除 尤其是减法精度问题
    /***除法**/division:function(arg1,arg2){vart1=0,t2=0,r1,r2;try{t1=arg1.toString().split(".")[1]......
  • 在 NestJS 中使用 Nodemailer 发送电子邮件的方法
    在学习Nestjs的过程中,我希望能够使用Nodemailer发送测试邮件,但在NestJS应用程序的上下文中我遇到了困难。我在互联网上搜索了解决方案,在经过大量研究后,我找到了一个解决方法。结果证明,这真的很简单。在本文中,我将分享我的解决方案,以便您可以在您的NestJS项目中使用它。(......
  • 第四章 探究 FBV 视图
    第四章探究FBV视图​ 视图是Django的MTV的架构模式的V部分,主要负责处理用户请求和生成相应的响应内容,然后在页面或其他类型文档中显示。使用视图函数处理HTTP的请求,即在视图函数中定义函数,这种方法称为FBV。4.1设置响应方式​ 网站的运行原理是遵从HTTP协议,......
  • 基于SpringBoot+MySQL+SSM+Vue.js的餐馆订餐系统(附论文)
    演示视频基于SpringBoot+MySQL+SSM+Vue.js的餐馆订餐系统技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的餐馆订餐系统(附论文),用......
  • 第五章 探究 CBV 视图
    第五章探究CBV视图5.1数据显示视图​ 数据显示视图是将后台的数据展示在网页上,数据主要来自模型,一共定义了4个视图类,分别说明如下:RedirectView:用于实现HTTP重定向,默认情况下只定义GET请求的处理方法。TemplateView:视图类的基础视图,可将数据传递给HTML模版,默认情况......
  • js 大文件分片上传
    html需要使用服务器的方式打开,推荐使用vscodeLiveServer插件,否则无法加载本地的worker.jsaxios和spark-md5自己去npmjs.com上找index.html<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewpo......
  • nextJs中使用styled-jsx
    NextJs不支持直接在页面和组件里importCss这种引入方式(除了全局引入),但是可以使用styled-jsx的方式进行Css的样式定义,也可以实现样式加载NextJs中Css的几种使用方案: global全局引入:在main文件或者app.js/ts文件里面进行全局引入,这种只是适合全局作用的样式引入。例如:im......
  • 实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展
    自2023年华为宣布全新HarmonyOSNEXT蓄势待发,鸿蒙原生应用全面启动以来,已有金融、旅行、社交等多个领域的企业和开发者陆续宣布加入鸿蒙生态。其中,美团作为国内头部的科技零售企业,是首批加入鸿蒙生态的伙伴,其下的美团外卖App基于HarmonyOSSDK高效展开了鸿蒙原生应用的开发,仅用6周......
  • vue2和vue3的js格式
    vue2<script>//exportdefault的作用是开放里定义的数据和方法exportdefault{name:'App',//和标签中绑定数据放在data(){}里data(){return{name:'张三',age:18,tel:'13888888888'}},......