首页
关于
壁纸
Search
1
新泰寺山
4 阅读
2
h5移动端项目总结
3 阅读
3
生活随笔
2 阅读
4
vue 中怎么实现样式隔离?
1 阅读
5
vue3-vite-语法大全
1 阅读
前端笔记
生活随笔
旅行见闻
Search
七叶
累计撰写
41
篇文章
累计收到
1
条评论
首页
栏目
前端笔记
生活随笔
旅行见闻
页面
关于
壁纸
搜索到
26
篇与
的结果
2026-04-29
vue3为什么不需要时间分片?
Vue 3 没有采用时间分片(Time Slicing)技术,主要是因为其核心架构和一系列优化措施已经能够在绝大多数场景下高效运行,从而避免了引入该技术带来的复杂性。下面这张图清晰地展示了 Vue 3 实现高效更新的核心机制,它通过精准的依赖追踪和智能的异步调度,实现了“按需更新”。css 体验AI代码助手 代码解读复制代码flowchart TDA[响应式数据变更] --> B[Proxy 精准依赖追踪] B --> C[触发组件更新effect] C --> D{scheduler调度} D --> E[批量作业入队<br>queueJob] E --> F[异步微任务执行<br>Promise.then] F --> G[DOM更新] G --> H[流畅视图] I[编译时优化] --> J[静态提升] I --> K[Patch Flag] I --> L[事件缓存] J --> M[减少运行时计算] K --> M L --> M M --> G 下面我们来详细解读图中的关键环节。🔧 核心机制:精准的响应式与智能调度Vue 3 的响应式系统基于 Proxy 构建,能够非常精确地追踪数据依赖。当数据变化时,Vue 能准确知道哪些组件需要更新,只触发相关的更新函数(effect),而不是盲目地检查整个组件树。这从源头上极大地减少了需要计算的工作量。 这些更新任务会被一个调度器(scheduler) 接管。调度器使用 queueJob函数将任务放入一个队列,并进行去重处理(确保同一组件的多次更新在同一个事件循环中只执行一次)。最后,它利用 Promise.then()将执行队列的“冲刷”操作(flushJobs)推迟到当前的同步代码执行完毕后的微任务队列中执行。这种批量异步更新机制,将可能发生的多次数据变更合并为一次视图更新,有效避免了频繁的、不必要的重渲染,从而保持主线程的流畅。✨ 编译时优化:从源头减负Vue 3 的编译器在将模板编译成渲染函数时,会进行深入的静态分析,实施多种优化策略:静态提升(Static Hoisting):将模板中纯静态的节点和属性提升到渲染函数之外,只在首次渲染时创建一次,后续更新直接复用。Patch Flags(补丁标志):在编译阶段为动态节点打上标记,标明其具体是哪个部分需要更新(如文本、类名、样式)。这样在运行时进行虚拟DOM对比(diff)时,就可以直接根据这些标志进行靶向更新,跳过大量的静态内容对比。事件缓存(Event Caching):缓存内联事件处理函数,避免子组件因父组件更新而重新渲染。这些优化使得最终生成的渲染函数运行时效率极高,需要进行的虚拟DOM对比计算量大幅降低。⚖️ 与React的对比:不同的设计哲学Vue 3 和 React 在更新策略上的差异,根源在于其不同的设计哲学和响应式原理:维度Vue 3React更新触发响应式驱动,数据变,视图自动变手动触发,需调用setState更新粒度组件级,依赖追踪,按需更新默认全量,可能重新渲染整个组件子树优化重点编译时优化,减少运行时计算运行时优化,依赖时间分片、React.memo等手动优化架构复杂度避免时间分片,保持核心相对简洁引入Fiber架构实现时间分片,复杂度较高React 采用 JSX 和虚拟 DOM Diff,其默认更新策略相对“保守”,为了避免在大型应用中出现长时间占用主线程的 Diff 计算,它引入了基于 Fiber 架构的时间分片,将任务拆分成小片段,以便浏览器能及时响应用户交互。而 Vue 3 的设计目标是从一开始就最大限度地减少不必要的计算,通过响应式依赖追踪和编译优化,使得更新计算量通常很小,很少出现需要长时间阻塞主线程的情况,因此时间分片的收益相对较小,而引入的复杂性却很高。💎 总结总而言之,Vue 3 通过其精准的响应式系统、智能的异步批量更新调度以及强大的编译时优化,三位一体地确保了极高的渲染效率。这使得它在绝大多数应用场景下,无需引入时间分片这种复杂的技术,就能提供流畅的用户体验。这体现了 Vue 3 注重开发者体验和架构简洁性的设计哲学。 不过,在极少数需要处理海量数据实时渲染或复杂可视化图表的极端场景下,你仍然可以探索使用类似 requestIdleCallback的技术自行实现分片逻辑。但对于99%的Vue 3应用而言,其内置的优化机制已经足够高效。 希望这些解释能帮助你透彻地理解 Vue 3 的设计思路!
2026年04月29日
0 阅读
2026-04-29
说说你对slot的理解?slot使用场景有哪些?
在 Vue.js 中,slot(插槽) 是一种强大的组件间内容分发机制,它允许父组件向子组件传递自定义内容(包括 HTML 结构、文本甚至其他组件),从而极大地增强了组件的灵活性和可复用性。 下面这个表格可以帮助你快速把握 slot 的核心分类与特点:插槽类型核心功能语法关键词适用场景默认插槽为组件定义一个主要的内容注入点组件只有一个可定制区域时具名插槽为组件定义多个有特定位置的内容注入点name属性, v-slot:name组件布局复杂,需要多处定制(如头部、主体、尾部)作用域插槽子组件向父组件传递数据,父组件决定如何渲染v-slot="slotProps"组件的 UI 样式需自定义,但数据逻辑由子组件管理💡 核心价值与使用场景slot 的存在主要是为了解决组件封装中的灵活性问题。它的核心价值体现在:提升组件复用性:通过 slot,你可以创建出高内聚、低耦合的通用组件。组件的“骨架”和“内容”分离,使得同一个组件可以在不同场景下通过注入不同的内容来满足需求,无需为了细微差别而创建多个相似组件。实现内容定制:当父组件需要在子组件内部插入特定内容时,slot 提供了标准的“接口”。这在构建布局组件(如卡片、模态框、标签页)、数据展示组件(如表格行、列表项)时尤为有用。分离关注点:slot 使得子组件可以专注于自身的布局和数据结构,而将具体的UI 表现权交给父组件,尤其通过作用域插槽,实现了数据逻辑和UI渲染的解耦。🛠️ 三种 Slot 详解与代码示例默认插槽 (Default Slot)这是最基础的插槽,充当子组件的内容占位符。如果父组件提供了内容,就会替换掉 标签;如果没有提供,则显示 标签内的默认内容。子组件定义 (ChildComponent.vue):xml 体验AI代码助手 代码解读复制代码 通用卡片头 这是后备默认内容,如果父组件不传内容,就会显示这个。 父组件使用:xml 体验AI代码助手 代码解读复制代码 <!-- 注入自定义内容到默认插槽 --> <h3>我是父组件传过来的标题</h3> <p>这里是父组件定义的卡片正文内容。</p>具名插槽 (Named Slots)当一个组件需要多个插槽时,使用具名插槽来区分。通过 name属性给插槽命名,父组件使用 v-slot:name或 #name来定向分发内容。子组件定义 (LayoutComponent.vue):xml 体验AI代码助手 代码解读复制代码 父组件使用:xml 体验AI代码助手 代码解读复制代码 <template #header> <!-- 或 v-slot:header --> <h1>这是页眉</h1> </template> <p>这段内容会自动放入默认插槽。</p> <template #footer> <p>这是页脚信息</p> </template>作用域插槽 (Scoped Slots)这是最强大的插槽类型。它允许子组件将数据传递给父组件,父组件可以利用这些数据来灵活定义渲染逻辑。这常用于循环渲染或数据展示组件,如表格、列表。子组件定义 (TodoList.vue):xml 体验AI代码助手 代码解读复制代码 {{ todo.text }} export default { data() { return { todos: [ { id: 1, text: '学习 Vue', isCompleted: true }, { id: 2, text: '理解 Slot', isCompleted: false } ] } } } 父组件使用:xml 体验AI代码助手 代码解读复制代码 <!-- 通过 `v-slot` 接收子组件传递的数据 --> <template v-slot:default="slotProps"> <!-- slotProps 是一个对象,包含了子组件传递的所有 prop --> <span :style="{ textDecoration: slotProps.todoItem.isCompleted ? 'line-through' : 'none' }"> {{ slotProps.todoItem.text }} </span> </template>在这个例子中,父组件根据子组件传来的 todo-item数据,决定是否给待办项添加删除线,实现了UI 渲染的完全自定义。⚠️ 注意事项与最佳实践缩写语法:v-slot:可以缩写为 #,例如 #header。但注意,#default不能简写为 #。默认内容:始终在 标签内提供有意义的默认内容,这能提升组件的健壮性。作用域:父模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子级作用域中编译的。作用域插槽是唯一一个例外。动态插槽名:Vue 2.6.0+ 支持使用动态指令参数定义动态插槽名,例如 v-slot:[dynamicSlotName]。希望这份详细的解释能帮助你全面理解 Vue 中的 slot 机制!
2026年04月29日
0 阅读
2026-04-29
vue中,key的原理
Vue 中 key属性的原理核心在于,它作为虚拟 DOM 节点的唯一标识,帮助 Vue 的 Diff 算法在更新时高效、准确地匹配新旧节点,从而决定是复用现有 DOM 还是创建新节点。下面这张图清晰地展示了 Vue 在列表更新时,Diff 算法如何处理新旧虚拟 DOM 树,并凸显了 key在其中起到的关键匹配作用:css 体验AI代码助手 代码解读复制代码flowchart TDA[数据变化,生成新虚拟DOM树] --> B{Diff算法比较} B --> C[遍历新旧子节点列表] C --> D{Key匹配成功?} D -- 是 --> E[进一步对比节点内容] E --> F{内容是否变化?} F -- 是 --> G[更新现有DOM节点内容] F -- 否 --> H[直接复用真实DOM] D -- 否 --> I[创建新真实DOM节点] G --> J[更新界面] H --> J I --> J 下面我们来详细解读 key的工作原理、注意事项和最佳实践。🔧 核心原理:key如何辅助 Diff 算法Vue 的渲染是基于虚拟 DOM 的。当数据变化时,Vue 会生成一个新的虚拟 DOM 树,并将其与旧的虚拟 DOM 树进行比较(这个过程就是 Diff),找出最小差异,然后批量更新真实 DOM,以此提升性能。 key在这个 Diff 过程中扮演着关键匹配标识的角色。对于列表渲染(v-for),Vue 的 Diff 算法采用了一种高效的同级比较策略。key的作用机制可以概括为:精准匹配:当比较新旧子节点列表时,Vue 会优先检查节点的 key是否相同。如果找到 key相同的节点,则认为它们是同一个节点。判断复用或更新:对于 key匹配的节点,Vue 会进一步比较这两个节点的其他属性(如 tag、data等)。如果节点内容(如文本、属性)没有变化,则直接复用之前的真实 DOM 元素;如果内容发生了变化,则更新真实 DOM 节点的相应部分。这避免了完全推倒重来的开销。处理新增与删除:如果在新列表中发现某个 key在旧列表中不存在,Vue 会新建真实的 DOM 节点。反之,如果旧列表中的某个 key在新列表中找不到,则会销毁并移除对应的真实 DOM 节点。正是通过 key的精准匹配,Vue 能够最大限度地复用 DOM 元素,将算法复杂度从 O(n³) 优化到接近 O(n),显著减少了不必要的 DOM 操作,提升了性能。⚠️ 不当使用 key的风险与误区错误地使用 key不仅无法提升性能,还可能引发问题。使用 index作为 key的隐患在很多初学者示例中,会使用循环的索引 index作为 key。这在静态列表(列表项仅用于展示,且顺序不会改变)中可能不会立即表现出问题。然而,一旦列表发生动态变化,如逆序添加、逆序删除或在中间位置插入/删除项,index就会变得不稳定。效率低下:因为 index的变化会导致大部分节点的 key都发生变化,Vue 会误判为节点身份改变,从而触发大面积的 DOM 更新或重新创建,而非高效的复用。状态错乱(严重问题):如果列表项包含带有状态的表单元素(如输入框),使用 index作为 key会导致界面显示错乱。例如,删除第一项后,原来的第二项变成了第一项,其 key从 1 变为 0。Vue 在匹配 key时可能会错误地复用之前第一项的 DOM 节点,导致输入框的内容与数据绑定错位。不提供 key的默认行为如果不显式设置 :key,Vue 会默认采用一种“就地复用”的策略,其行为类似于使用 index作为 key,因此会面临上述同样的问题。💡 最佳实践与使用场景首选唯一标识:理想情况下,key应该是数据项本身的一个唯一且稳定的标识符,例如数据对象的 id、身份证号、手机号等。强制重新渲染的妙用:key并不局限于 v-for。通过改变组件的 key值,可以强制 Vue 完全重新渲染该组件。这在需要组件内部状态完全重置时非常有用,例如在表单重置或切换用户身份后。希望这份详细的解释能帮助你透彻地理解 Vue 中 key的原理和作用!
2026年04月29日
0 阅读
2026-04-29
vue 的双向绑定原理
Vue 3 的双向绑定是其响应式系统的直接体现,它优雅地实现了数据与视图之间的自动同步。其核心原理可以通过下面的流程图快速把握,它展示了从数据被访问到视图更新的完整闭环:css 体验AI代码助手 代码解读复制代码flowchart TDA[访问响应式数据<br>(如模板渲染)] --> B[Proxy getter 拦截操作] B --> C[依赖收集<br>Track] C --> D[返回数据值] D --> E[数据变化<br>用户输入/脚本赋值] E --> F[Proxy setter 拦截操作] F --> G[触发更新<br>Trigger] G --> H[重新执行副作用<br>(如组件渲染)更新视图] H --> A 下面我们来详细剖析图中的每个关键部分。🔧 响应式基础:Proxy 与 ReflectVue 3 抛弃了 Vue 2 基于 Object.defineProperty的实现,转而使用现代浏览器广泛支持的 Proxy 来代理目标对象。这是一个根本性的改变,带来了巨大的优势 。全面的拦截能力:Proxy可以拦截对一个对象的各种底层操作,包括属性读取(get)、设置(set)、删除(deleteProperty)、in操作符检查等多达13种操作。这意味着无论是对象、数组的新增、删除还是数组索引的直接设置,Vue 3 都能有效监听,无需像 Vue 2 那样重写数组方法或使用 Vue.set。惰性响应化:Vue 3 不会在初始化时递归地遍历并转换整个对象的所有嵌套属性。它采用了一种惰性策略:只有当某个嵌套属性被访问时,才会递归地将其转换为响应式。这提升了初始化的性能,特别是在处理大型复杂对象时 。Reflect 的配合:在 Proxy的处理器(handler)中,Vue 使用 Reflect对象的方法来执行默认行为。例如,在 get陷阱中,使用 Reflect.get(target, key, receiver)来获取属性值,这确保了与 this上下文相关的行为正确无误 。⚙️ 依赖收集与触发更新响应式系统的核心是依赖追踪,也就是明确“谁用到了这个数据”,并在数据变化时通知“使用者”更新。依赖收集(Track):当组件的渲染函数(或一个 computed计算属性、watchEffect副作用函数)执行时,会读取响应式数据。此时,Proxy的 get拦截器被触发。Vue 会调用 track函数,将当前正在执行的“副作用函数”(例如组件的更新函数)与该属性关联起来,记录下这个依赖关系 。这个关系被存储在一个全局的 WeakMap(targetMap) 结构中。触发更新(Trigger):当你修改响应式数据的值时(例如通过 v-model输入或直接赋值),Proxy的 set拦截器被触发。Vue 会调用 trigger函数,根据之前收集的依赖关系,找到所有依赖于这个属性的“副作用函数”,并重新执行它们 。对于组件而言,这就意味着重新渲染,视图得以更新。🧩 双向绑定的语法糖:v-model在模板中,我们通过 v-model指令来轻松实现双向绑定。在 Vue 3 中,v-model的本质是一种语法糖,它同时做了两件事 :将数据绑定到视图:将响应式数据的值传递给表单元素的 value(或 checked等)属性。监听视图变化更新数据:为表单元素添加一个事件监听(如 input或 change),当用户输入时,将最新值同步回响应式数据。在原生元素上的实现:ini 体验AI代码助手 代码解读复制代码编译后大致等同于:ini 体验AI代码助手 代码解读复制代码<input :value="message" @input="message = $event.target.value"在自定义组件上的实现 : Vue 3 对 v-model进行了改进,支持多个 v-model绑定和自定义修饰符。ini 体验AI代码助手 代码解读复制代码在子组件 CustomInput中,需要声明对应的 props并触发更新事件:xml 体验AI代码助手 代码解读复制代码defineProps(['title', 'content'])defineEmits(['update:title', 'update:content'])<input :value="title" @input="$emit('update:title', $event.target.value)"💎 总结:Vue 3 的卓越之处Vue 3 的双向绑定原理建立在其先进的响应式系统之上。通过 Proxy实现全面、精确的数据劫持,结合高效的依赖收集和触发更新机制,最终通过 v-model指令提供简洁的模板语法。这套设计使得 Vue 3 在性能、功能性和开发体验上相比 Vue 2 都有了显著的提升 。 希望这些解释能帮助你透彻地理解 Vue 3 双向绑定的工作原理。
2026年04月29日
0 阅读
2026-04-29
用 Proxy 优雅地实现双向绑定
“双向绑定”是现代前端框架中非常重要的一个概念,它可以大大简化我们的代码,提高开发效率。大家在平时开发的过程中基本都会用到,特别是包含了大量表单的官网和 ToB 网站更是如此。很多前端框架也都内置了对双向绑定的支持,例如 Vue 的 v-model,Angular、Svelte 等框架也能够方便地实现双向绑定。双向绑定的功能非常强大,但其背后的实现原理并不复杂,在这篇文章中,我将会介绍单向绑定和双向绑定的基本原理,并讲解 Proxy 的基本概念,最后手把手地带大家用纯 JS 实现一个双向绑定的表单页面。读完这篇文章之后,相信你能够对响应式 UI 框架的基本原理有进一步的认识。什么是双向绑定单向绑定假设我们想要实现一个简单的计数器,页面中有一个显示数字的 元素和一个将数字 +1 的按钮。html 体验AI代码助手 代码解读复制代码0+1在不使用响应式前端框架的情况下,要想实现点击按钮就给数字加 1 的功能,需要用到下面的代码:js 体验AI代码助手 代码解读复制代码const countEle = document.getElementById("count");const buttonEle = document.getElementById("increment");let count = 0;buttonEle.addEventListener("click", () => { count++; countEle.textContent = count;});我们首先必须保存 元素和按钮元素的引用,并声明一个 count 变量用于记录当前的数值。然后给按钮添加点击事件,每次点击就给count加1,然后改变 元素显示的内容。可以看出,这个过程还是非常绕的,一旦应用功能变得复杂起来,代码的复杂度会成倍地上升。理想的方式是每次我们更新 count 变量, 元素的内容就会自动更新。这就是现代前端响应式框架解决的核心问题,我们以下面的这段 svelte 代码为例:html 体验AI代码助手 代码解读复制代码 let count = 0;{count} count++}> +1我们声明了一个响应式变量 count,每次按钮点击时把 count 加 1, 元素的内容就是 count 的值,会随着其变化自动更新,这大大简化了我们的代码。这里, 标签的内容完全由 count 的值决定,也就是它的值被 count 变量“绑定”了,这就是单向绑定。双向绑定那么双向绑定又是怎么一回事呢?我们不妨把刚刚的 标签换成一个 标签,同时对 js 代码做一点改动,维持我们原有的单向绑定功能。js 体验AI代码助手 代码解读复制代码const countEle = document.getElementById("count");const buttonEle = document.getElementById("increment");let count = 0;buttonEle.addEventListener("click", () => { count++; countEle.value = count;});这时我们会发现一个问题,就是 input 框的内容是可以随时被用户改变的,但每次用户改变了其内容之后点击按钮,输入框中原有的内容就会被覆盖掉。这是因为目前我们只做到了 对 count 的绑定,也就是 count 的更新会引起 内容的更新,反过来则没有。我们希望 的值改变时,count 变量的值也跟着改变,用下面的代码可以实现这个功能:js 体验AI代码助手 代码解读复制代码countEle.addEventListener("change", () => { count = Number(countEle.value);});我们监听了输入框的 change 事件,每次用户改变输入框的值,我们就更新 count 的值。因为 countEle.value 返回的是一个字符串,所以我们需要用 Number() 做一个类型转换。这样我们就实现了输入框和 count 变量的双向绑定,不仅输入框的内容被绑定为 count 的值,而且count 的值也会始终和输入框保持一致,改变两端的任何一个值都会造成另外一个值的变化。如果用 Vue 之类的前端框架来实现双向绑定就会非常方便,只需要使用 v-model 指令就可以。vue 体验AI代码助手 代码解读复制代码 +1 export default { data() { return { count: 0, } }, methods() { increment() { this.count++; } } } 用 Proxy 实现双向绑定通过上面的例子可以看出,用纯 JS 实现双向绑定是非常麻烦的一件事,但是一个输入框就已经需要大量的代码。如果是复杂的表单,代码会变得很难维护。幸运的是,我们可以利用 Proxy 来对双向绑定进行简化。Proxy简单来说,Proxy 可以用于拦截对象操作,例如属性设置、属性访问等。:js 体验AI代码助手 代码解读复制代码let target = { a: "hello", b: "everyone",};const proxiedTarget = new Proxy( target, { get(target, prop) { console.log(target, prop); }, set(target, prop, value) { console.log(target, prop, value); }, });proxiedTarget.a; // {a: 'hello', b: 'everyone'} 'a'proxiedTarget.b = "world"; // {a: 'hello', b: 'everyone'} 'b' 'world'这里我们将 target 对象利用 Proxy 做了一层封装,我们会拦截针对 target 的属性访问(get)和属性设置(set)操作。具体来说,我们会在每次 get 操作时打印出 get 的目标对象(也就是 target 对象)和访问的属性名(property),在每次 set 操作时打印出目标对象(target)、属性名(property)和将要设置的属性值(value)。用 Proxy 实现复杂表单的双向绑定项目准备我们的 HTML 代码如下:html 体验AI代码助手 代码解读复制代码 用户名: 邮箱: 手机号: 用户名:清空邮箱:清空手机号:清空我们在页面中创建了一个表单,包含用户名、邮箱和手机号三个输入框,同时还有三个展示对应数据的 段落,以及对应每项数据的清空按钮。如果我们还是按照刚刚的方式来进行数据的双向绑定,就意味着每项数据都要进行输入框 change 事件的绑定、 和 标签内容与变量内容的绑定以及按钮点击事件的绑定,这是非常复杂的一件事情,而越是复杂的代码就越容易出错。利用刚刚介绍的 Proxy 我们可以简化这一流程。首先我们把要用到的数据都收敛到一个 user 对象中:bash 体验AI代码助手 代码解读复制代码let user = { name: "", email: "", phone: "",};然后我们给表单的各个输入框绑定内容改变的监听事件,每次用户改变输入时就更改对应的属性值。因为我们的属性名称和输入框的name 属性是一一对应的,所以我们可以用下面的代码来实现数据绑定:js 体验AI代码助手 代码解读复制代码const form = document.querySelector("form");Array.from(form.elements).forEach((element) => { if (element.name) {element.addEventListener("input", () => { user[element.name] = element.value; });}});同时我们还需要在“清空”按钮点击时清除对应的数据。遍历每一个 标签包含的按钮,因为 p.id 对应的就是该按钮控制的属性名称,所以我们可以得到下面的代码:js 体验AI代码助手 代码解读复制代码document.querySelectorAll("p").forEach((p) => { p.querySelector("button").addEventListener("click", () => {user[p.id] = "";});});最后,我们利用 Proxy 来监听 user 对象的属性变更,从而实现响应式的 UI 更新。js 体验AI代码助手 代码解读复制代码user = new Proxy(user, { set(target, property, value) {target[property] = value; form.elements[property].value = value; document.getElementById(property).querySelector("span").textContent = value; return true;},});我们监听了 user 对象的 set 操作,在 set 操作触发时,首先进行正常的属性更新。然后把表单中相应的输入框内容更新:这里 form.elements 的 key 就是元素的 name 属性,而我们的 name 属性又是和 user 的属性名称一一对应的,所以用 form.elements[property] 就可以取到需要更新的输入框。(例如用户改变了 user.email,此时 property 就是 email,那么表单中 name="email" 的元素 value 就会被更新了。)同理,我们更新下方 标签中的内容。最后 return true,表示 set 操作正常进行。可以看到下方的数据会随着我们的输入改变,通过按钮清空数据,也会马上反映在输入框中。这表明我们已经建立了数据和表单的双向绑定。只用了不到三十行代码,我们就在不依赖任何框架的情况下建立起了一个双向绑定的响应式 UI 表单。如果想要扩展更多的属性也很简单,只要给 user 对象添加新的属性,然后在 HTML 中增加相应的输入框和 元素就OK了(注意 name 和 id 要和属性名称相同)。小结在这篇文章中,我们了解了单向绑定、双向绑定的概念和实现原理,学习了 Proxy 的基本概念,最后还实现了一个纯 JS 的响应式表单。实际上 Vue 等框架实现响应式更新的底层原理就是通过 Proxy,相信你现在已经对响应式 UI 的基本原理有了进一步的理解了。
2026年04月29日
0 阅读
1
...
3
4
5
6