当前位置:首页 > VUE

js 实现vue模板

2026-02-09 13:16:51VUE

使用原生 JavaScript 实现 Vue 模板功能

通过原生 JavaScript 可以实现类似 Vue 的模板功能,包括数据绑定、指令处理和模板渲染。以下是具体实现方法:

js 实现vue模板

数据绑定实现

创建一个简单的数据绑定系统,使用 Object.definePropertyProxy 实现数据响应式:

js 实现vue模板

class Vue {
  constructor(options) {
    this.$options = options
    this.$data = options.data
    this.observe(this.$data)
    this.compile()
  }

  observe(data) {
    if (!data || typeof data !== 'object') return
    Object.keys(data).forEach(key => {
      let value = data[key]
      const dep = new Dep()
      Object.defineProperty(data, key, {
        get() {
          Dep.target && dep.addSub(Dep.target)
          return value
        },
        set(newVal) {
          if (newVal !== value) {
            value = newVal
            dep.notify()
          }
        }
      })
      this.observe(value)
    })
  }
}

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

模板编译

实现模板编译功能,处理插值表达式和指令:

class Vue {
  // ...其他代码

  compile() {
    const el = document.querySelector(this.$options.el)
    this.compileNode(el)
  }

  compileNode(node) {
    if (node.nodeType === 1) {
      this.compileElement(node)
    } else if (node.nodeType === 3) {
      this.compileText(node)
    }

    if (node.childNodes && node.childNodes.length) {
      Array.from(node.childNodes).forEach(childNode => {
        this.compileNode(childNode)
      })
    }
  }

  compileText(node) {
    const reg = /\{\{(.*?)\}\}/g
    const textContent = node.textContent
    if (reg.test(textContent)) {
      const key = RegExp.$1.trim()
      node.textContent = this.$data[key]
      new Watcher(this, key, value => {
        node.textContent = value
      })
    }
  }

  compileElement(node) {
    Array.from(node.attributes).forEach(attr => {
      if (attr.name.startsWith('v-')) {
        const dir = attr.name.substring(2)
        const exp = attr.value
        if (dir === 'model') {
          node.value = this.$data[exp]
          node.addEventListener('input', e => {
            this.$data[exp] = e.target.value
          })
          new Watcher(this, exp, value => {
            node.value = value
          })
        }
      }
    })
  }
}

观察者模式实现

创建 Watcher 类实现观察者模式:

class Watcher {
  constructor(vm, key, cb) {
    this.vm = vm
    this.key = key
    this.cb = cb
    Dep.target = this
    this.value = vm.$data[key]
    Dep.target = null
  }

  update() {
    this.value = this.vm.$data[this.key]
    this.cb(this.value)
  }
}

使用方法示例

<div id="app">
  <input v-model="message" />
  <p>{{ message }}</p>
</div>

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

功能扩展

  1. 计算属性:可以通过添加 computed 选项并创建对应的 getter 函数实现
  2. 方法处理:在 Vue 实例上添加 methods 选项,并在模板中绑定事件
  3. 生命周期钩子:在特定阶段触发回调函数
  4. 组件系统:通过创建子类或工厂函数实现组件功能

这种实现方式展示了 Vue 核心功能的基本原理,实际 Vue 源码更加复杂和完善,包含虚拟 DOM、diff 算法等高级特性。

标签: 模板js
分享给朋友:

相关文章

js 实现vue

js 实现vue

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

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现删除

js实现删除

使用 splice 方法删除数组元素 splice 方法可以删除数组中的元素,并返回被删除的元素。它接受两个参数:起始索引和要删除的元素数量。 const array = [1, 2, 3, 4…

js尚未实现

js尚未实现

JavaScript 尚未实现的功能 JavaScript 作为一门不断发展的语言,仍有一些功能尚未被原生支持或标准化。以下是一些常见的尚未实现的功能或特性: Promise.any() 的替代方案…