useForm的设计理念随笔

> 之前在研摩完 https://github.com/react-hook-form/react-hook-form 后感叹到前端的设计理念博大精深,但是一直没有整理,这两天考试周回校有空整理了一下

前有数据驱动视图的 Vue 和 React ,现在到了特殊场景又要具体分析开发的视图驱动数据的 useForm

业务情景:当一个大表单的局部字段变更时,普通 React 会直接 re-render 整个大表单导致性能耗散,最优解是尽量避免重渲染

useForm的内部可以理解为:

当用户 input 的时候 register 捕获事件,向内写入到 formValues 并更新 formState ,接着 subjects 通过观察者模式遍历广播变更,仅订阅了这些 subjects 的 hooks 会调用 useState ,从而触发最小范围的 Fiber 调度

而普通的 input 做了特判完全不会触发 re-render

复制代码
[用户输入]
    ↓ (onChange)
register -> handleChange
    ↓
更新 _formValues
    ↓
_subjects.watch.next({ name, value })  // 发布事件
    ↓
useWatch/useFormState/useController 订阅回调
    ↓
setState(...)
    ↓
React Fiber 调度(仅局部组件)

需要注意,这里的观察者模式并不像 Vue 那样去挟持属性实现响应化( Vue2 的 Object.defineProperty 和 Vue3 的 Proxy ),而是其内部自己维护了一个 subjects ,从而避免像 Vue 一样自动更新视图,遵循 React 的显式思维去广播变更,触发局部的 Fiber 调度

相关推荐
妙码生花8 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(十七):登录接口完善,登录页接口整合,解决跨域
前端·后端·ai编程
唐诗18 分钟前
改 3 行配置,我的 Tauri dev 冷启动从 100 秒干到 4 秒
前端·客户端
SmartBoyW30 分钟前
深入ECMAScript规范:彻底搞懂JS隐式类型转换与底层ToPrimitive机制
前端·javascript
牧艺32 分钟前
Cursor Rules / Skills 分层设计:让 Agent 像「团队新同事」
前端·人工智能·cursor
咪库咪库咪1 小时前
vue3-组件
vue.js
光影少年1 小时前
react navite 跨端核心原理
前端·react native·react.js
用户852495071841 小时前
解密 JavaScript 中的 this:谁才是真正的调用者?
javascript·面试
monologues1 小时前
Vue 3 渲染器的核心秘密:从 VNode 创建到快速 Diff 算法
前端
奇奇怪怪的1 小时前
从开发到生产——生成优化、监控、安全与成本
前端
10share1 小时前
100行代码 模拟实现Vue 响应式系统
前端·vue.js