当前位置:首页 > VUE

vue2简易实现

2026-02-22 12:38:23VUE

vue2 简易实现方法

Vue2 的简易实现可以通过手动构建核心功能来完成。以下是关键步骤:

数据响应式

使用 Object.defineProperty 实现数据劫持:

vue2简易实现

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val
    },
    set(newVal) {
      if (newVal === val) return
      val = newVal
      // 触发更新
    }
  })
}

依赖收集

创建 Dep 类管理依赖:

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

观察者模式

实现 Watcher 类:

vue2简易实现

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])
  }
}

模板编译

简单模板解析示例:

function compile(el, vm) {
  vm.$el = document.querySelector(el)
  const fragment = document.createDocumentFragment()
  let child
  while (child = vm.$el.firstChild) {
    fragment.appendChild(child)
  }
  function replace(frag) {
    Array.from(frag.childNodes).forEach(node => {
      const txt = node.textContent
      const reg = /\{\{(.*?)\}\}/g
      if (node.nodeType === 3 && reg.test(txt)) {
        const key = RegExp.$1.trim()
        new Watcher(vm, key, function(val) {
          node.textContent = txt.replace(reg, val)
        })
        node.textContent = txt.replace(reg, vm[key])
      }
    })
  }
  replace(fragment)
  vm.$el.appendChild(fragment)
}

完整示例

组合以上功能:

class Vue {
  constructor(options) {
    this.$options = options
    this.$data = options.data
    this.observe(this.$data)
    compile(options.el, this)
  }
  observe(data) {
    Object.keys(data).forEach(key => {
      defineReactive(this, key, data[key])
    })
  }
}

注意事项

  • 此实现省略了数组处理、虚拟DOM等复杂功能
  • 实际项目中应使用官方Vue2库
  • 仅用于理解Vue2核心原理

以上代码展示了Vue2最基础的响应式原理实现,包含数据劫持、依赖收集和模板编译等核心功能。

标签: 简易
分享给朋友:

相关文章

vue实现简易时钟

vue实现简易时钟

实现简易时钟的步骤 在Vue中实现简易时钟可以通过动态更新当前时间来实现。以下是具体实现方法: 创建Vue组件 新建一个Vue组件文件Clock.vue,包含模板、脚本和样式部分。 <tem…

uniapp 简易框架

uniapp 简易框架

uniapp 简易框架搭建方法 环境准备 安装 HBuilderX 作为开发工具,确保已配置 Node.js 环境。通过 HBuilderX 创建 uni-app 项目时选择默认模板或自定义模板。…

vue实现简易时钟

vue实现简易时钟

使用 Vue 实现简易时钟 以下是基于 Vue 3 实现简易时钟的两种方法: 方法一:使用 Composition API <template> <div class="clo…

vue实现简易todolist

vue实现简易todolist

实现简易TodoList的步骤 创建Vue项目 使用Vue CLI创建一个新项目,运行以下命令: vue create todo-list cd todo-list npm run serve 组件…

实现简易vue响应式

实现简易vue响应式

实现简易 Vue 响应式 要实现一个简易的 Vue 响应式系统,核心是利用 JavaScript 的 Object.defineProperty 或 ES6 的 Proxy 来劫持数据的变化,并在数据…