当前位置:首页 > VUE

100行代码实现vue

2026-02-22 23:03:08VUE

实现简易Vue框架的100行代码示例

以下是一个简化版Vue响应式系统的核心实现,包含数据响应式、模板编译和依赖收集等基本功能。

class Dep {
  constructor() {
    this.subscribers = new Set()
  }
  depend() {
    if (activeEffect) this.subscribers.add(activeEffect)
  }
  notify() {
    this.subscribers.forEach(effect => effect())
  }
}

let activeEffect = null
function watchEffect(effect) {
  activeEffect = effect
  effect()
  activeEffect = null
}

function reactive(raw) {
  Object.keys(raw).forEach(key => {
    const dep = new Dep()
    let value = raw[key]

    Object.defineProperty(raw, key, {
      get() {
        dep.depend()
        return value
      },
      set(newValue) {
        value = newValue
        dep.notify()
      }
    })
  })
  return raw
}

function compile(template, data) {
  return template.replace(/\{\{(.*?)\}\}/g, (_, key) => {
    return data[key.trim()]
  })
}

class MiniVue {
  constructor(options) {
    this.$data = reactive(options.data())
    this.$el = document.querySelector(options.el)
    this.$template = this.$el.innerHTML

    watchEffect(() => {
      const rendered = compile(this.$template, this.$data)
      this.$el.innerHTML = rendered
    })
  }
}

// 使用示例
const app = new MiniVue({
  el: '#app',
  data() {
    return {
      message: 'Hello Mini Vue!',
      count: 0
    }
  }
})

setInterval(() => {
  app.$data.count++
}, 1000)

核心功能解析

响应式系统

  • 通过reactive函数将普通对象转换为响应式对象
  • 使用Object.defineProperty实现属性拦截
  • Dep类管理依赖关系,实现观察者模式

依赖收集

100行代码实现vue

  • watchEffect函数注册副作用函数
  • 在属性访问时通过depend方法收集依赖
  • 属性变更时通过notify方法触发更新

模板编译

  • 简单实现双大括号插值语法{{}}
  • 通过正则表达式匹配模板中的动态内容
  • 将数据绑定到对应位置实现渲染

使用方法

  1. 创建HTML模板

    100行代码实现vue

    <div id="app">
    <p>{{ message }}</p>
    <p>Count: {{ count }}</p>
    </div>
  2. 初始化MiniVue实例

    const app = new MiniVue({
    el: '#app',
    data() {
     return {
       message: 'Hello World',
       count: 0
     }
    }
    })
  3. 修改数据自动更新视图

    app.$data.message = 'Updated'  // 视图自动刷新

扩展建议

  1. 添加虚拟DOM实现提高性能
  2. 支持事件绑定和指令系统
  3. 实现组件化系统
  4. 添加计算属性和侦听器功能

这个实现省略了生产环境需要的很多特性,但展示了Vue最核心的响应式原理。完整版Vue包含更多优化和功能,但这个简化版有助于理解基本原理。

标签: 代码vue
分享给朋友:

相关文章

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐藏。…

vue实现input

vue实现input

Vue 实现 Input 输入框的方法 基本双向绑定 使用 v-model 指令实现双向数据绑定,适用于大多数表单场景: <template> <input v-model="…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…

vue实现接口

vue实现接口

在 Vue 中实现接口请求 Vue 本身不直接提供 HTTP 请求功能,通常需要借助第三方库如 axios 或 fetch 来实现接口请求。以下是几种常见方法: 使用 axios 发送请求 安装 a…

vue实现dag

vue实现dag

Vue实现DAG(有向无环图) 在Vue中实现DAG(Directed Acyclic Graph,有向无环图)通常涉及数据结构的建模、可视化渲染以及交互逻辑处理。以下是关键实现步骤和示例代码: 数…

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click 绑…