尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

v-model的简单实现

v-model的简单实现
📅 发布时间:2026/6/18 20:37:58
<!DOCTYPE html>
<html>
<head><title>Mini Vue</title>
</head>
<body><div id="app"><input v-model="message" /><p>{{ message }}</p></div><script>// 1. 响应式系统(上面的代码)function reactive(target) {return new Proxy(target, {get(obj, key) {track(obj, key)return obj[key]},set(obj, key, value) {obj[key] = valuetrigger(obj, key)return true}})}let activeEffect = nullconst targetMap = new WeakMap()function watchEffect(effect) {activeEffect = effecteffect()activeEffect = null}function track(obj, key) {if (!activeEffect) returnlet depsMap = targetMap.get(obj)if (!depsMap) targetMap.set(obj, (depsMap = new Map()))let dep = depsMap.get(key)if (!dep) depsMap.set(key, (dep = new Set()))dep.add(activeEffect)}function trigger(obj, key) {const depsMap = targetMap.get(obj)if (!depsMap) returnconst dep = depsMap.get(key)if (dep) dep.forEach(effect => effect())}// 2. 极简编译:查找 v-model 和 {{ }}function compile(el, data) {// 查找所有子元素const nodes = el.querySelectorAll('*')// 处理 v-modelel.querySelectorAll('[v-model]').forEach(input => {const key = input.getAttribute('v-model')// 初始化 valueinput.value = data[key]// 双向绑定input.addEventListener('input', (e) => {data[key] = e.target.value})// 数据变化时更新 inputwatchEffect(() => {input.value = data[key]})})// 处理 {{ message }}Array.from(el.childNodes).forEach(node => {if (node.nodeType === 3) { // 文本节点const text = node.textContentconst match = text.match(/\{\{(.*)\}\}/)if (match) {const key = match[1].trim()// 初次渲染node.textContent = node.textContent.replace(match[0], data[key])// 响应式更新watchEffect(() => {node.textContent = node.textContent.replace(data[key], data[key])})}}})// 处理子元素中的 {{ }}nodes.forEach(node => {Array.from(node.childNodes).forEach(child => {if (child.nodeType === 3) {const text = child.textContentconst match = text.match(/\{\{(.*)\}\}/)if (match) {const key = match[1].trim()const getValue = () => data[key]watchEffect(() => {child.textContent = text.replace(/\{\{.*\}\}/, getValue())})}}})})}// 3. 启动const obj = { message: 'Hello, Mini Vue!' }const data = reactive(obj)const app = document.getElementById('app')compile(app, data)</script>
</body>
</html>

相关新闻

  • 虚拟列表
  • 条码控件Aspose.BarCode教程:使用 C# 构建 Code11 条形码生成器
  • 物理焦距、像素焦距、像元与相机内参(fx, fy)的意义与作用

最新新闻

  • 便携式Kali与AI自动化渗透测试:构建智能安全测试平台
  • M2.7自我深度迭代:大模型在线认知闭环技术解析
  • Agent之Skill:SkillSpector的简介、安装和使用方法、案例应用之详细攻略
  • TC1027四路比较器在嵌入式低功耗系统中的电源监控实战
  • Qwen3.6-Plus:真实世界智能体的结构化升级
  • JMeter压力测试全链路实战:从环境搭建到瓶颈定位

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号