当前位置:首页 > JavaScript

js实现mvvm

2026-02-02 11:49:32JavaScript

实现 MVVM 模式的 JavaScript 核心方法

数据绑定实现

通过 Object.definePropertyProxy 实现数据劫持

js实现mvvm

// 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 模板

js实现mvvm

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、指令系统、生命周期等。

标签: jsmvvm
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js如何实现继承

js如何实现继承

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

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…