当前位置:首页 > 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>

关键点总结:

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

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

js实现mvvm

标签: jsmvvm
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式…