Sukka's Notebook
6.93K subscribers
166 photos
2 videos
2 files
532 links
The clacks from @SukkaW

<img onload='location.href="//skk.moe"' onerror='location.href="//skk.moe"' src=//cdn.skk.moe/favicon.ico?tgx>
<img src=//cdn.skk.moe/favicon.ico?tg>
<img src=x onerror='location.href="//skk.moe"'>
Download Telegram
#前端 #React

在 设计/实现 复杂的 React 应用的时候,难免会发生 子组件(例如 Router 下的 Page)控制父组件(例如 Layout 或 Container)需要渲染的内容。一个最常见的例子是,在 Page 中声明 Global Layout 中的 Header 需要渲染什么 Page Title 或者 Breadcrumbs。但是,这极其容易违反 几乎所有前端框架「单向数据流」的铁律、使用 useEffect/useLayoutEffect 还会导致 double render、影响应用性能。

现在,foxact 封装了一个基于 React DOM createPortal API 的 Utiltity Function —— createMagicPortal`,允许你在 Page 等子组件中 直接声明 Layout/Container 等父组件 的渲染方式、并不违反 React「单向数据流」或 Rules of Hooks,并将额外的渲染次数减少到一次(仅在 Portal Target 首次挂载时会发生唯一一次自发 re-render,后续不会再导致多余的 re-render)。并且相比单纯的 React DOM createPortal API,`createMagicPortal 还通过 Suspense boundary 为 Server-side Rendering(服务端渲染)提供了 骨架屏、占位 的支持。

https://foxact.skk.moe/magic-portal/