当前位置: 首页 > news >正文

v-model的简单实现

<!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>
http://www.rkmt.cn/news/1478.html

相关文章:

  • 虚拟列表
  • 条码控件Aspose.BarCode教程:使用 C# 构建 Code11 条形码生成器
  • 物理焦距、像素焦距、像元与相机内参(fx, fy)的意义与作用
  • java课前问题列表
  • vue3中两对容易搞混的概念
  • LoadRunner 对 WebTours 实现订票的性能分析
  • Python游戏开发:使用Pygame库的全面教程
  • 限行提醒小程序介绍
  • AP聚类算法实现三维数据点分类
  • 基于MATLAB的多输入多输出空时分组码通信系统仿真
  • 本土开发者生态崛起:Gitee如何重塑中国软件研发基础设施
  • .net code 连接SAP HANA 数据库
  • CentOS 上独立编译 Linux 内核一般性流程
  • VU9P板卡设计方案:565-基于VU9P的32@ SFP28+4@ QSFP28路光纤交换板卡
  • 黑产群控日损百万?设备ID乱象要如何终结?
  • 西门子分布式IO从站与主站的PN连接
  • Mysql:通用mysql备份脚本:纯shell实现:支持自动包含用户数据库、支持压缩、支持自动清理
  • JBOSS CVE-2017-7504 反序列化漏洞
  • 搞机工具箱v11.0.0免Root调试安卓
  • Gorm自定义数据类型
  • PHP流量控制令牌桶算法
  • 顽固文件夹无法删除?
  • c++ std::map
  • 软考架构备考-面向对象
  • 【Python】Word文档解析表格并导出Excel
  • 2025.9.9 总结
  • 2025 9 6 总结
  • OLE读取EXCEL内容
  • Rope pbds
  • 25.9.8随笔联考总结