前端面试题41(在JavaScript中,如何实现MVVM的数据绑定?)

news2024/9/25 1:25:13

在这里插入图片描述
在JavaScript中实现MVVM(Model-View-ViewModel)架构下的数据绑定,主要通过观察者模式、发布/订阅模式和数据劫持等技术来完成。下面我将概述几种常见的实现方式,以及如何在不使用框架的情况下手动实现数据绑定。

使用框架实现数据绑定

大多数现代前端框架如Vue.js、Angular和React都内置了数据绑定功能,其中Vue.js和Angular提供了双向数据绑定,而React则偏向于单向数据流。

Vue.js

Vue.js使用了基于Object.defineProperty()的数据劫持技术来实现响应式数据绑定。当数据发生变化时,视图会自动更新。

Angular

Angular使用区变检测机制(Change Detection)来实现数据绑定,它会在每次事件触发或异步任务完成时检查模型的变化并更新视图。

React

React虽然不提供内置的双向数据绑定,但通过状态管理和props传递可以实现单向数据流,使用useStateuseEffect等Hooks可以实现局部的响应式更新。

手动实现数据绑定

如果想要手动实现MVVM的数据绑定,可以参考Vue.js的实现原理,使用数据劫持和发布订阅模式。

数据劫持

数据劫持是通过重写Object.defineProperty()来实现的。当访问或修改数据时,可以触发特定的函数,从而实现对数据变化的监听。

function defineReactive(obj, key, val) {
    observe(val); // 如果val是对象,递归observe
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: function reactiveGetter() {
            return val;
        },
        set: function reactiveSetter(newVal) {
            if (newVal !== val) {
                observe(newVal); // 同样观察新值
                val = newVal;
            }
        }
    });
}

function observe(value) {
    if (!value || typeof value !== 'object') {
        return;
    }
    if (Array.isArray(value)) {
        value.__proto__ = observerArray;
    } else {
        new Observer(value);
    }
}

var observerArray = Object.create(Array.prototype, {
    push: { value: function push(...args) {
        var inserted = [];
        for (let i = 0; i < args.length; i++) {
            inserted.push(observe(args[i]));
        }
        Array.prototype.push.apply(this, inserted);
    }},
    // ...其他数组方法类似处理
});

class Observer {
    constructor(value) {
        this.walk(value);
    }
    walk(obj) {
        Object.keys(obj).forEach(key => {
            defineReactive(obj, key, obj[key]);
        });
    }
}
发布订阅模式

数据变化时,发布者(通常是数据模型)通知观察者(通常是视图)。这通常通过事件机制实现。

class Dep {
    constructor() {
        this.subs = [];
    }
    addSub(sub) {
        this.subs.push(sub);
    }
    notify() {
        this.subs.forEach(sub => sub.update());
    }
}

class Watcher {
    constructor(expr, cb) {
        this.expr = expr;
        this.cb = cb;
        this.value = this.get();
    }
    get() {
        Dep.target = this;
        let val = eval(this.expr);
        Dep.target = null;
        return val;
    }
    update() {
        let oldValue = this.value;
        this.value = eval(this.expr);
        if (this.value !== oldValue) {
            this.cb.call(this, this.value);
        }
    }
}

在实际应用中,上述代码需要结合HTML模板解析和编译,以及DOM操作,才能完整实现数据绑定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1915028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防御笔记第四天(持续更新)

1.状态检测技术 检测数据包是否符合协议的逻辑顺序&#xff1b;检查是否是逻辑上的首包&#xff0c;只有首包才会创建会话表。 状态检测机制可以选择关闭或则开启 [USG6000V1]firewall session link-state tcp ? check Indicate link state check [USG6000V1]firewall ses…

MySQL--C_C++语言连接访问

Connector/C的使用 首先需要在mysql官网下载C接口库 解压指令 tar -zxvf 压缩包名 下载并解压好后 但是还有比这更优的做法。 这样子手动安装不仅麻烦&#xff0c;还可能存在兼容性的问题。 其实在我们使用yum安装mysql时&#xff0c;大概率会自动帮我们把其他的环境都安装…

【大模型LLM面试合集】大语言模型基础_NLP面试题

NLP面试题 1.BERT 1.1 基础知识 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是谷歌提出&#xff0c;作为一个Word2Vec的替代者&#xff0c;其在NLP领域的11个方向大幅刷新了精度&#xff0c;可以说是近年来自残差网络最优突破性的…

分享一个项目模板electron+vue+ts+vite

分享一个项目模板electronvuetsvite GitHub - xiugou798/electron-vue-ts-vite-template: electron-vue-ts-vite-templateelectron-vue-ts-vite-template. Contribute to xiugou798/electron-vue-ts-vite-template development by creating an account on GitHub.https://gith…

C++的异常处理机制

C的异常处理机制 (1)Why&#xff08;异常处理机制的作用&#xff09;(2)How&#xff08;异常机制如何工作&#xff09;A.抛出异常B.捕获异常C.处理异常D.传递异常 (3)抛出异常A.栈展开B.析构函数和异常C.异常对象 (4)捕获异常(4)处理异常A.构造函数的异常处理B.不抛出异常noexc…

【SWMM】模型概述及软件安装

SWMM模型概述及软件安装 SWMM 模型 &#xff08;Storm Water Management Model&#xff09;概述应用 软件安装及下载参考 暴雨管理模型 &#xff08;Storm Water Management Model&#xff0c;SWMM 模型&#xff09;是美国环保局为解决日益严重的城市排水问题而推出的暴雨径流管…

凌风云 - 十大网盘资源搜索 Ver 6.0 版正式上线

《凌风云》作为网盘资源专业搜索领域的佼佼者&#xff0c;汇聚了国内十大网盘的丰富资源&#xff0c;凌风云搜索弥补其他搜索引擎可能无法搜索到相关资源的缺陷&#xff0c;作为专业的搜索引擎服务网络平台&#xff0c;您只需输入关键词&#xff0c;通过智能算法精准匹配&#…

C++的介绍与认识

目录 前言 1.什么是C 2.C的发展历史 3.C参考文档 4.C重要性 4.1C特点 4.2编程语言排行榜 4.3 C的应用领域 5.C学习指南 1. 基础知识 2. 面向对象编程&#xff08;OOP&#xff09; 3. 泛型编程 4. 标准库&#xff08;STL&#xff09; 结束语 前言 学习了C语言的知识…

使用mid360进行fast_lio建图、octomap生成栅格地图

前面我已经实现了fast_lio建图并使用octomap转为三维栅格地图&#xff0c;今天来填上次留的坑 使用Livox-Mid360激光雷达&#xff0c;复现FAST_LIO&#xff08;保姆级教程&#xff09;-CSDN博客 这是我上次写的&#xff0c;来复现上次失败的&#xff0c;这个教程&#xff1a;…

【PHP安装内置扩展】

PHP安装内置扩展 1、首先查看php源码以及查询是否有需要的扩展;本次以zlib扩展为例子 2、进入需要安装的扩展目录,执行命令 cd zlib 执行 make clean 清掉之前的安装的残留文件; 不需要的话直接略过,新安装也略过3、运行phpize,执行/usr/local/php/bin/phpize 注意这个路径一…

设计分享—国外后台界面设计赏析

国外后台界面设计将用户体验放在首位&#xff0c;通过直观易懂的布局和高效的交互设计&#xff0c;提升用户操作效率和满意度。 设计不仅追求美观大方&#xff0c;还注重功能的实用性和数据的有效展示&#xff0c;通过图表和图形化手段使数据更加直观易懂。 采用响应式布局&a…

Windows 部署ollama

一、简介 Ollama是在Github上的一个开源项目&#xff0c;其项目定位是&#xff1a;一个本地运行大模型的集成框架&#xff0c;目前主要针对主流的LLaMA架构的开源大模型设计&#xff0c;通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中&#xff0c;从而实现大模…

[GICv3] 3. 物理中断处理(Physical Interrupt Handling)

中断生命周期 ​​ 外设通过中断信号线生成中断&#xff0c;或者软件生成中断&#xff08;SGI&#xff09;。Distributor 和 ReDistributor 配合按照中断分组和中断优先级仲裁后将最高优先级的中断分发到 CPU interface。cpu interface 向中断发送到 PEPE 读取 IAR 寄存器&am…

队列+二叉树广度优先

题目出自力扣-n叉树的层序遍历 我是原始人&#xff0c;递归写出一道题就只有递归思路&#xff0c;开始的想法是写深搜函数&#xff0c;传一个随着层数递增的int参数q&#xff0c;节点空就return&#xff0c;否则遍历所有节点&#xff0c;每个子节点又以q1为层数递归&#xff…

Postman工具基本使用

一、安装及基本使用 安装及基本使用参见外网文档&#xff1a;全网最全的 postman 工具使用教程_postman使用-CSDN博客 建议版本&#xff1a;11以下&#xff0c;比如10.x.x版本。11版本以后貌似是必须登录使用 二、禁止更新 彻底禁止postman更新 - 简书 host增加&#xff1…

15.x86游戏实战-汇编指令jmp call ret

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

从零开始学习嵌入式----Linux系统中shell脚本

目录 Shell脚本入门&#xff1a;玩转功能语句和数组&#xff0c;提升你的效率&#xff01; 一、功能语句&#xff1a;让你的脚本更灵活 1. 条件语句&#xff1a;if、else、elif 2. 循环语句&#xff1a;for、while 二、数组&#xff1a;处理多项数据的好帮手 1. 声明数组…

程序员学长 | PyCaret,一个超强的 python 库

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;PyCaret&#xff0c;一个超强的 python 库 今天给大家分享一个超强的 python 库&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 简介 …

力扣 160相聚链表

注意 判断是否有交点 用while(A! B) 其中A A nullptr? headb:A->next;B同理 注意&#xff0c;while循环的退出条件是AB指针指向同一个&#xff0c;如果没有相交&#xff0c;仍然可以退出 当AB都为NULLPTR时退出

包成功安装tiny-cuda-nn,记录安装过程中的问题解决,附带pytorch3d安装【踩坑指南】

tiny-cuda-nn安装过程中的问题解决&#xff0c;附带pytorch3d安装【踩坑指南】 前言tiny-cuda-nn第一种下载方法&#xff1a;命令行安装tiny-cuda-nn第二种下载方法&#xff1a;本地编译 pytorch3d安装 前言 official repo: https://github.com/NVlabs/tiny-cuda-nn 该包可以显…