当前位置: 首页 > 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.wxhsa.cn/company.asp?id=56

相关文章:

  • 旧版本Flutter使用xcode16打包上架时报错
  • 国产化Excel处理组件Spire.XLS教程:C# 读取 CSV 文件,从基础读取到 DataTable 转换
  • 常用redis客户端对比
  • 【URP】Shader绘制棋盘格对比内置管线
  • Codeforces Round 1049 (Div. 2)(C-E)
  • 虚拟列表
  • 条码控件Aspose.BarCode教程:使用 C# 构建 Code11 条形码生成器
  • 智能引擎驱动软件工业化革命:Gitee PPM如何重塑企业级开发范式
  • 深入解析Web Components:Shadow DOM实战指南
  • HCIP回顾— BGP基础
  • 你的测试又慢又不可靠-因为你测错了东西
  • 你的错误处理一团糟-是时候修复它了-️
  • 物理焦距、像素焦距、像元与相机内参(fx, fy)的意义与作用
  • 实时通信的头痛-问题不在WebSocket而是你的框架
  • 文件不只是数据-一份稳健的文件处理指南
  • vue+websocket+Stomp组件实现前端长连接
  • java课前问题列表
  • 多字段排序工具类,支持树形
  • 鸿蒙 HAP 包处理全攻略:从解包到签名,So 库加固一步到位
  • 关于vue在PC端,rem对不同屏幕进行适配
  • GreatSQL分页查询优化案例实战
  • 技术面:Java并发(线程同步、死锁、多线程编排)
  • vue3中两对容易搞混的概念
  • LoadRunner 对 WebTours 实现订票的性能分析
  • mac一键关闭chrome自动更新
  • Python游戏开发:使用Pygame库的全面教程
  • 同城黑卡小程序系统介绍
  • 限行提醒小程序介绍
  • 365 快乐农场小程序介绍
  • AP聚类算法实现三维数据点分类