手写实现一个简单的MVVM框架


本文介绍了MVVM框架及其原理,并给出了一个简单的实现示例。通过数据绑定实现了视图更新,达到了模型与视图的分离。

什么是MVVM?

MVVM是一种流行的软件架构模式,适用于各种类型的应用程序,包括前端应用程序。它主要由三部分组成:Model(数据)、View(视图)和ViewModel(视图模型)。在前端框架中,如Angular、Vue和React中,使用的是虚拟DOM操作,而不是直接操作DOM。ViewModel可以监听模型的变化,同时也可以监听视图上输入框变化,但使用的并不一定是事件监听器。

MVVM模式的目的是将数据、界面和交互行为分隔开来,从而产生高可维护性和可扩展性的应用程序代码。通过使用MVVM,我们可以更好地组织代码,并将它们分离到单独的责任区域中。

自己实现MVVM

<!-- 视图层 V,用 h1 和 span 显示数据,input 用于设置数据 -->
<h1>显示数据:<span>****</span></h1>
<input type="text" id="username">

<script>
    // 模型层 M,定义数据
    let obj = { name: '六思逸' }

    // 定义数据渲染方法,DOM操作将模型的数据渲染到视图
    function render() {
        document.querySelector('span').textContent = obj.name; // 将obj的数据显示在span中
        document.querySelector('#username').value = obj.name; // 将obj的数据显示在input中
    }
    render(); // 页面载入时要先渲染一次

    console.dir(document.querySelector('span')) // 打印出span的DOM对象方便调试

    // 模型层 M,挟持数据实现数据绑定
    let name = obj.name; // 把obj的name属性值保存在一个变量里
    Object.defineProperty(obj, 'name', { // 为obj的name属性定义一个数据访问器
        get() { // 监听obj的name属性的get方法
            return name; // 取值时直接返回name
        },
        set(v) { // 监听obj的name属性的set方法
            name = v; // 将v的值存到变量中
            render(); // 数据发生变化时重新渲染视图
        },
    });

    // 控制器层 C,视图层 V 到模型层 M,监听 input 的输入事件,自动把输入框的值赋给数据模型
    document.querySelector('#username').oninput = function () {
        obj.name = this.value; // 输入框的值赋给obj的name属性,触发数据绑定
    }
</script>


扫描二维码,在手机上阅读

深入浅出:虚拟DOM在前端开发中的应用

Vue动态组件的使用方法

评 论