当前位置:首页 > VUE

实现简易vue

2026-03-07 01:54:51VUE

实现简易 Vue 的核心思路

Vue 的核心是数据响应式系统和虚拟 DOM 机制。简易实现需要关注以下几个关键部分:

数据响应式系统

通过 Object.definePropertyProxy 实现数据劫持,在数据变化时触发更新:

function defineReactive(obj, key, val) {
  const dep = new Dep()
  Object.defineProperty(obj, key, {
    get() {
      Dep.target && dep.addSub(Dep.target)
      return val
    },
    set(newVal) {
      if (newVal === val) return
      val = newVal
      dep.notify()
    }
  })
}

依赖收集与发布订阅

实现一个简单的 Dep 和 Watcher 类来处理依赖:

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

class Watcher {
  constructor(vm, key, cb) {
    this.vm = vm
    this.key = key
    this.cb = cb
    Dep.target = this
    this.vm[this.key] // 触发getter
    Dep.target = null
  }
  update() {
    this.cb.call(this.vm, this.vm[this.key])
  }
}

模板编译

实现一个简单的编译器来处理模板中的插值和指令:

class Compiler {
  constructor(el, vm) {
    this.$vm = vm
    this.$el = document.querySelector(el)
    this.compile(this.$el)
  }
  compile(node) {
    Array.from(node.childNodes).forEach(node => {
      if (node.nodeType === 1) {
        this.compileElement(node)
      } else if (this.isInterpolation(node)) {
        this.compileText(node)
      }
      if (node.childNodes.length > 0) {
        this.compile(node)
      }
    })
  }
  isInterpolation(node) {
    return node.nodeType === 3 && /\{\{(.*)\}\}/.test(node.textContent)
  }
  compileText(node) {
    const key = RegExp.$1.trim()
    node.textContent = this.$vm[key]
    new Watcher(this.$vm, key, value => {
      node.textContent = value
    })
  }
  compileElement(node) {
    Array.from(node.attributes).forEach(attr => {
      if (attr.name.startsWith('v-')) {
        const dir = attr.name.substring(2)
        this[dir] && this[dir](node, attr.value)
      }
    })
  }
}

整合实现

将这些部分组合成一个简易 Vue 类:

class Vue {
  constructor(options) {
    this.$options = options
    this.$data = options.data
    this.observe(this.$data)
    new Compiler(options.el, this)
  }
  observe(obj) {
    Object.keys(obj).forEach(key => {
      defineReactive(obj, key, obj[key])
      Object.defineProperty(this, key, {
        get() {
          return this.$data[key]
        },
        set(newVal) {
          this.$data[key] = newVal
        }
      })
    })
  }
}

使用方法

这样实现的简易 Vue 可以这样使用:

<div id="app">
  {{ message }}
</div>

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

功能扩展方向

这个简易实现可以进一步扩展:

实现简易vue

  • 添加 v-model 指令实现双向绑定
  • 实现 computed 计算属性
  • 添加 methods 方法支持
  • 实现组件系统
  • 使用虚拟 DOM 优化更新性能

以上实现展示了 Vue 最核心的响应式原理和模板编译机制,实际 Vue 的实现更加复杂和完善,但基本原理是相通的。

标签: 简易vue
分享给朋友:

相关文章

vue实现选择分类

vue实现选择分类

Vue 实现选择分类的方法 使用 v-model 绑定选择值 在 Vue 中可以通过 v-model 指令实现双向数据绑定,适用于下拉选择框(<select>)。以下是一个基本示例: &…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery 或…

vue实现pc

vue实现pc

Vue 实现 PC 端应用开发 Vue.js 是一个流行的前端框架,适用于构建 PC 端 Web 应用。以下是关键步骤和最佳实践: 项目初始化 使用 Vue CLI 或 Vite 创建项目:…

mvvm实现vue

mvvm实现vue

MVVM 模式在 Vue 中的实现 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 的设计灵感来源于此。以下是 MVVM 在 Vue 中的核心实现方式: 数据绑定(M…

vue实现幻灯

vue实现幻灯

Vue实现幻灯片的基础方法 使用Vue实现幻灯片功能可以通过多种方式完成,以下是几种常见方案: 方案一:基于Vue的过渡动画 通过Vue的<transition>或<transit…

vue实现上划

vue实现上划

Vue 实现上划功能 在Vue中实现上划功能,可以通过监听触摸事件(touchstart、touchmove、touchend)来判断用户的手势方向。以下是实现上划功能的几种方法: 监听触摸事件 通…