当前位置:首页 > JavaScript

js实现mvvm

2026-02-02 11:49:32JavaScript

实现 MVVM 模式的 JavaScript 核心方法

数据绑定实现

通过 Object.definePropertyProxy 实现数据劫持

// Proxy 实现
const data = { text: '' }
const proxy = new Proxy(data, {
  set(target, key, value) {
    target[key] = value
    updateView(key, value)
    return true
  }
})

function updateView(key, value) {
  console.log(`更新DOM: ${key} = ${value}`)
}

模板编译

使用文档片段编译 DOM 模板

function compile(template) {
  const fragment = document.createDocumentFragment()
  let node = document.querySelector(template)
  while (node.firstChild) {
    fragment.appendChild(node.firstChild)
  }

  // 替换模板变量
  traverse(fragment)
  document.querySelector(template).appendChild(fragment)
}

function traverse(node) {
  if (node.nodeType === 3) { // 文本节点
    node.nodeValue = node.nodeValue.replace(/\{\{(.*)\}\}/, (_, key) => {
      return data[key.trim()]
    })
  }
}

观察者模式实现

建立依赖收集系统

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

class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm
    this.exp = exp
    this.cb = cb
    this.value = this.get()
  }
  get() {
    Dep.target = this
    const value = this.vm.data[this.exp]
    Dep.target = null
    return value
  }
  update() {
    this.cb(this.vm.data[this.exp])
  }
}

完整 MVVM 框架结构

class MVVM {
  constructor(options) {
    this.$el = options.el
    this.$data = options.data

    // 数据代理
    Object.keys(this.$data).forEach(key => {
      this.proxyData(key)
    })

    // 数据响应式
    observe(this.$data)

    // 模板编译
    new Compile(this.$el, this)
  }

  proxyData(key) {
    Object.defineProperty(this, key, {
      get() {
        return this.$data[key]
      },
      set(newVal) {
        this.$data[key] = newVal
      }
    })
  }
}

实际应用示例

<div id="app">
  <input v-model="message">
  <p>{{ message }}</p>
</div>

<script>
const vm = new MVVM({
  el: '#app',
  data: {
    message: 'Hello MVVM'
  }
})
</script>

关键点总结:

js实现mvvm

  • 数据劫持实现响应式
  • 模板解析建立初始绑定
  • 依赖收集系统跟踪变化
  • 批量更新优化性能

以上实现展示了 MVVM 的核心原理,实际框架(如 Vue)会包含更多优化和功能扩展,如虚拟 DOM、指令系统、生命周期等。

标签: jsmvvm
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…