首页 > 其他分享 >5.可以说出两种实现双向绑定的方案、可以手动实现

5.可以说出两种实现双向绑定的方案、可以手动实现

时间:2023-03-05 10:22:15浏览次数:37  
标签:target 实现 绑定 number value prop 双向 model data

可以说出两种实现双向绑定的方案、可以手动实现

1.手动绑定

Object.defineProperty

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>bidreactional binding</title>
</head>
<style>
    div {
        width: 40%;
        float: left;
        border: 1px dashed;
        padding: 20px;
        height: 100vh;
    }
</style>
<body>
    <div>
        <p>View:</p>
        <input id="view" />
    </div>
    <div>
        <p>Model:</p>
        <span id="model"></span>
    </div>
    <script src="./index.js"></script>
</body>
</html>
// 获取DOM节点
var view = document.getElementById('view');
var model = document.getElementById('model');
// 设置model对象
var data = {};
// 设置get函数的中转站,封装后可以去掉
let temp = 0;
//在data对象中定义number属性,并给他赋值两个访问器属性,来代理或者说劫持number的值的获取与设置
Object.defineProperty(data, "number", {
    //可枚举,这个主要是用来将Model显示在前端的,可以省去
    enumerable:true,
    // 获取值时的处理方法 就相当于代理执行获取值的操作,返回什么都又他决定,这里不能return data.number会造成无限循环的
    get: function () {
        return temp;
    },
    // data的number值发生变化时调用
    set: function (value) {
        // 改变View节点的值
        view.value = value;
        // 将值存在temp中,在get时要用到
        temp = value;
        // 这个主要是用来将Model显示在前端的,可以省去
        model.innerHTML = `"data":${JSON.stringify(data)}`;
    },
})
// 绑定事件,当view改变时将改变的值赋值给data对象中的number属性
view.addEventListener("keyup", function (event) {
    data.number = event.target.value;
})

2.Proxy双向绑定

// 这里只是为了前端展示model 可以省去
var model = document.getElementById('model');
// 所有dom的id
const domKeys =["username","password","sex"];
// 枚举信息 根据 {domkey:dom}
const domEnum = {};
// model
var data = {};
// proxy 代理整个data 
const proxy = new Proxy(data, {
    // taget 即为代理的对象 prop为属性值
    get: function (target, prop) {
        return target[prop];
    },
    // value为新值
    set: function (target, prop, value) {
        target[prop] = value;        
        domEnum[prop+'Dom'].value = target[prop];
        // 这里只是为了前端展示model 可以省去
        model.innerHTML = JSON.stringify(data);
    }
})
// 加上key事件
domKeys.forEach(item=>{
    const dom = document.getElementById(item);
    domEnum[item+'Dom'] = dom;
    dom.addEventListener("keyup", function (event) {
        proxy[item] = event.target.value;
    })
})

 

标签:target,实现,绑定,number,value,prop,双向,model,data
From: https://www.cnblogs.com/alwaysrun/p/17179949.html

相关文章

  • 魔音,mp3音乐下载器兼播放器,界面简洁,歌曲资源超多,实现听歌自由!
    前几天有小伙伴反映之前分享的音乐下载器已经不能下载音乐了,提示需要更新,今天给大家带来另一款音乐下载软件,界面简洁、功能更加稳定。一、软件简介魔音(Morin)音乐是一款界......
  • 8.实现一个sleep函数
    实现一个sleep函数①利用堵塞循环实现,因为js是单线程的,所以这个其实就是根本上的sleepfunctionsleep(delay){varstart=(newDate()).getTime();while((new......
  • 5.多种方式实现深拷贝、对比优缺点
    前情提要深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;①递归方式比较全面的深......
  • Python利用模糊哈希实现对比文件相似度详解
    导读对比两个文件相似度,python中可通过difflib.SequenceMatcher/ssdeep/python_mmdt/tlsh实现,在大量需要对比,且文件较大时,需要更高的效率,可以考虑模糊哈希,本文就来和大......
  • 4.使用reduce实现map,使用reduce实现filter
    前情提要:map函数接收一个函数作为参数,作为参数的函数接收三个参数值,分别是遍历数组的每一项元素,元素的索引和数组本身。这三个参数刚好和reduce函数接收的第一个函数参数......
  • 微信小程序结合php后台实现登录授权机制详解
    微信小程序应用的用户登录授权机制相当复杂,官方给出了下面一张流程图来解释:下面结合这张图来详细讲述下小程序的登录验证授权机制。首先,小程序应用实现登录验证的前提是......
  • SQL99语法实现多表查询
    3.SQL99语法实现多表查询3.1内连接(INNERJOIN)的实现语法SELECT字段列表FROMA表INNERJOINB表ON关联条件WHERE等其他子句;例SELECTe.employee_id,e.last......
  • Mysql 8.0 实现创建用户,指定用户只能访问指定的数据库中的表
    最近在做公司项目的过程中,出现了这样的需求。第三方系统需要将数据写到我们的业务系统中,由于目前这些数据没有实际的使用场景,在讨论下,为简单快捷,选择第二种方案,即不书写接......
  • 二叉树遍历的操作与实现
    先序遍历先序遍历(递归版)代码展示/*先序遍历(递归版)*/StatusPreOrderTraverse(BiTreeT,StatusVisit(TElemTypee)){ if(T) { Visit(T->data); PreOrderTra......
  • 一种通过nacos动态配置实现多租户的log4j2日志物理隔离的设计
    1、背景1.1、背景旧服务改造为多租户服务后,log4j日志打印在一起不能区分是哪个租户的,日志太多,太杂,不好定位排除问题,排查问题较难。1.2、前提不改动以前的日志代码(工作......