东莞网站制作的公司永久f194078w78w

张小明 2025/12/27 17:35:59
东莞网站制作的公司,永久f194078w78w,价格低的股票,在线网页制作工具写在前面#xff1a;从 Vue 转到 React#xff0c;最大的挑战往往不是 JSX 语法#xff0c;而是对渲染机制底层逻辑的理解偏差。今天从一个看似简单的 Bug#xff0c;探讨 React 的 Reconciliation#xff08;协调#xff09;算法原理。 前排广告位#xff…写在前面从 Vue 转到 React最大的挑战往往不是 JSX 语法而是对渲染机制底层逻辑的理解偏差。今天从一个看似简单的 Bug探讨 React 的 Reconciliation协调算法原理。前排广告位欢迎访问我的个人网站https://hixiaohezi.com在 React 社区的问答中有一个现象非常普遍“为什么我的 Input 输入框每输入一个字符就会失去焦点”其实是因为它触及了 React 最核心的渲染原理——组件身份Identity与协调Reconciliation。问题背景很多从 Vue 转向 React 的开发者包括我自己在初期为了方便或者实现逻辑闭环可能会写出类似这样的代码export default function UserForm() { const [name, setName] useState(); // 错误示范在组件内部定义组件 // 很多开发者习惯在 Vue 的 template 中直接写局部逻辑 // 在 React 中容易误以为这样是在拆分 render 函数 const StyledInput ({ value, onChange }) ( input style{{ border: 1px solid blue, padding: 10px }} value{value} onChange{onChange} / ); return ( div h3用户录入/h3 StyledInput value{name} onChange{(e) setName(e.target.value)} / p当前输入{name}/p /div ); }Bug 出现当在输入框中按下第一个字符比如 ‘a’name状态更新组件重渲染。紧接着输入框的焦点瞬间丢失。除了失去焦点如果这个子组件里有任何内部 State它们也会全部重置。原理深度分析要理解这个问题必须深入 React 的 Diff 算法协调过程。React 在更新时会比较新旧两棵虚拟 DOM 树Fiber Tree。比较的一个核心策略是类型Type的同一性检查。1. 不同的类生成不同的树React 检查一个节点时首先看它的type如果oldNode.type newNode.typeReact 认为这是同一个组件它会保留该组件实例及其 State只更新 PropsUpdate。如果oldNode.type ! newNode.typeReact 认为这是两个完全不同的东西它会**卸载Unmount旧组件丢失其所有状态和 DOM 节点然后挂载Mount**新组件。2. 函数也是对象回到上面的代码。StyledInput是在UserForm内部定义的函数。这意味着UserForm每次渲染时都会创建一个全新的StyledInput函数引用地址不同。渲染流程回放第一次渲染创建StyledInput(函数地址 A)。渲染StyledInput /(Type 是 A)。结果挂载组件 A。用户输入 ‘a’ - 触发 setName - 触发第二次渲染UserForm重新执行。创建新的StyledInput(函数地址 B)。注意虽然代码逻辑一样但在内存中A ! B。React 比较旧节点的 Type 是 A新节点的 Type 是 B。判定Type 不同这不是同一个组件执行卸载 A移除 DOM销毁 State挂载 B创建新 DOM初始化 State。3.DOM 的毁灭与重生因为组件被卸载并重新挂载旧的inputDOM 元素被从页面中移除一个新的input被创建并插入。物理 DOM 都换了焦点自然就没了。Vue 与 React 的视角差异对于习惯 Vue 的开发者来说这种行为可能略显反直觉Vue 的视角组件通常是在.vue文件中静态定义的或者在components选项中注册。组件定义的引用在整个应用生命周期中通常是稳定的Static。即使在setup()内部返回渲染函数也不太容易犯在渲染过程中重新定义组件类的错误。React 的视角React Component 本质就是 JavaScript 函数。在 JS 中函数内定义函数等于每次执行外层函数时都新建一个闭包函数。React 的渲染完全依赖于 JS 的运行结果因此对引用的稳定性要求极高。解决方案修正方案非常简单保证组件类型Type的引用稳定性。方案一移到外部标准解法将子组件定义移到父组件外面。这样StyledInput就在模块加载时被创建一次永远不会变。// ✅ 正确定义在外部引用地址恒定 const StyledInput ({ value, onChange }) ( input ... / ); export default function UserForm() { // ... return StyledInput ... /; }方案二使用 render props 或直接写 JSX如果不仅仅是为了复用只是为了拆分 JSX 结构可以直接拆分成函数返回注意不是组件是返回 Element 的函数或者直接把 JSX 存在变量里。总结在 React 中组件在 UI 树中的位置Position和类型Type共同决定了它的身份Identity。身份变了状态就没了。欢迎访问我的个人网站 hixiaohezi.com愿我们对原理的每一次深究都能化作代码中的一份从容。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

wordpress图库seo和sem的区别

你是否曾想过,让一个拥有6710亿参数的巨型AI模型在你的个人电脑上流畅运行?这听起来像是科幻电影的情节,但通过现代量化技术,这个梦想已经变成了现实。本文将带你一步步实现这个看似不可能的任务,让你的笔记本电脑也能…

张小明 2025/12/26 7:48:42 网站建设

淘宝做代码的网站深圳网站制作哪家好薇

Conda 实战指南(偏详细版) 0. 总体认识:conda 究竟解决什么问题? 一句话:conda 环境管理器(虚拟环境) 包管理器(跨语言包),解决“依赖地狱 环境冲突”。和…

张小明 2025/12/27 15:19:01 网站建设

罗马柱 东莞网站建设html5怎么做二手网站

LLaMA-Factory分布式训练实践指南 在大模型落地日益加速的今天,一个现实问题摆在开发者面前:如何用有限的GPU资源,高效完成7B甚至更大规模语言模型的微调任务?传统的单卡训练早已无法满足需求,而分布式训练又常因配置…

张小明 2025/12/26 7:47:34 网站建设

做网站在哪里怎么注册网站啊

Excalidraw 部署选型:从技术细节看本地化与 SaaS 的真实代价 在一次内部架构评审会上,团队需要快速绘制一个涉及核心业务逻辑的数据流图。有人提议用 Excalidraw —— 简洁、直观、支持实时协作。但问题很快浮现:我们该用官网的在线服务&…

张小明 2025/12/26 7:47:01 网站建设

浙江省建设厅查询官方网站上海网站建设 中华企业录

cmus终极音效优化:专业调音与音频增强完全指南 【免费下载链接】cmus Small, fast and powerful console music player for Unix-like operating systems. 项目地址: https://gitcode.com/gh_mirrors/cm/cmus 你是否在使用cmus音乐播放器时感到音质不够理想&…

张小明 2025/12/26 7:45:54 网站建设

网站后台更新后主页不显示建设网站要什么时候开始

LangFlow城市治理建议征集与反馈机器人 在城市治理日益数字化的今天,市民对公共服务的响应速度和沟通质量提出了更高要求。一个常见的痛点是:大量来自微信公众号、政务网站或热线电话的群众建议,往往因人工处理效率低、分类不精准、反馈周期长…

张小明 2025/12/26 7:45:20 网站建设