
11.12 手写 Suspense
Suspense 的最小实现只有四步——组件在渲染中 throw 一个 thenable → 渲染器捕获它、向上找到最近的边界 → 把「正在等的 promise」记在边界上并让本次渲染作废(重渲染时边界就渲染 fallback)→ promise resolve 时「ping」一次触发重渲染;

Suspense 的最小实现只有四步——组件在渲染中 throw 一个 thenable → 渲染器捕获它、向上找到最近的边界 → 把「正在等的 promise」记在边界上并让本次渲染作废(重渲染时边界就渲染 fallback)→ promise resolve 时「ping」一次触发重渲染;

写一个 mini React 只需要四块——createElement 造元素对象 → Fiber 树用「parent/child/sibling」三个指针串起来 → workLoop 用「全局指针 + 时间片」实现可中断的深度优先遍历 → commit 阶段把 Fiber 树同步落到 DOM,再加…

压缩、裁剪、加水印、抠图、拼接都在本地完成。不限张数、不限次数,图片不会传到服务器。

手写简易 diff 的目标是「理解 React 如何把两棵 vnode 树变成最小的 DOM 操作」——核心是「同层比较 + type 不同直接重建 + 用 key 匹配同一层数组」,把 O(n³) 降到 O(n)。

Error Boundary 只能由类组件实现——依赖 static getDerivedStateFromError(渲染降级 UI)与 componentDidCatch(上报),并要提供「重置」能力;用「包装组件 + 函数式 fallback」可以让使用方是函数组件。

无限滚动的推荐实现是「用 IntersectionObserver 观察一个列表底部的「哨兵元素」」——它比监听 scroll 事件更高效(不读布局、不频繁触发),配合 rootMargin 还能「提前触发」实现无感加载。

一个合格的 Modal 要处理五件事——「用 Portal 挂到 body」「焦点管理(移入 + 陷阱 + 归还)」「ESC 关闭」「滚动锁定(并还原)」「无障碍属性(role="dialog" + aria-modal)」。

虚拟滚动的核心是「只渲染可视区域内的几十个元素」,用「占位元素撑起总高度」+「translateY 偏移渲染层」——公式是「startIndex = floor(scrollTop / rowHeight)、visibleCount = ceil(containerHeight / rowHeigh…

手写 useLocalStorage 要解决四件事——「惰性初始化(只读一次)」「序列化异常兜底」「跨标签页同步(storage 事件)」「SSR 兼容(没有 window)」。

手写请求 Hook 的关键是「状态机建模(idle/loading/success/error)+ 依赖触发 + 竞态取消(AbortController)+ 卸载清理」;进阶再加「手动触发、重试、防抖、回调」。

防抖(debounce)是「停止触发 N 毫秒后才执行」,节流(throttle)是「每 N 毫秒最多执行一次」;在 React 里封装成 Hook 的关键是「用 useRef 存定时器/时间戳」「清理函数里清掉」「用 useRef 保存最新回调」。
最新评论
读过书不知道欧·亨利的人少。教科书上选文有
这小生活不错呀
不错,必须顶一下!
看着你还在坚持,很好
看来忙了也没时间更新博客了
NIce。学习了。。。。
网站不错!!!!
简洁实用,好文章!