服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

可视化搭建 - keepAlive 模式

日期: 来源:前端精读评论收集编辑:黄子毅

由于 React 的特点,组件改变所在父级后会产生 Remount,而在可视化搭建场景存在两个特点:

  1. 自由、磁贴、流式布局都可以通过拖拽轻松改变组件父元素。
  2. 大数据量下组件 Remount 的消耗不容忽视。

结合上面两个特点,拖拽过程中或者松手时不可避免会产生卡顿,这就是我们这篇文章要解决的问题。

利用 createPortal 解决 Remount 问题

createPortal 可以将 React 实例渲染到任意指定 DOM 上,所以我们利用这个 API,将组件树的组件打平,但通过 createPortal 生成到嵌套的 DOM 树上,就同时实现了以下两点:

  • 在 dom 结构上依然符合组件树的嵌套描述。
  • 在 React 实例角度,没有嵌套关系。

实现分为三步:

  1. 遍历组件树,根据组件树嵌套结构生成 createPortal 的目标 dom,我们姑且称为 keepElement,对需要挂载 keepElement 的容器位置生成 dom,称为 keepContainer。对于没有渲染的容器,可以先不挂载 keepElement,而是等到父容器 mount 后再将 keepElement 移过去,后面再展开说明。
  2. 遍历组件树,一次性打平渲染所有树中 React 组件实例,并利用 createPortal 挂载到对应的 keepElement 上。
  3. 当数据流产生变化导致父级变化,或者布局插件拖动改变父级时,我们仅利用 dom api 将 keepElement 在不同的 keepContainer 之间移动,而在 React 实例视角没有发生任何变化。

协议做到用户无感知

因为实现了 dom 结构与 React 实例结构分离,因此开启 keepAlive 模式不需要改变 componentTree 描述,也不会影响任何逻辑功能,我们只需要标记一下 keepAlive 参数即可开启:

import { createDesigner } from 'designer'

const { Designer, Canvas, useDesigner } = createDesigner()

const App = () => {
  <Designer keepAlive={true} />
}

渲染增加了额外 dom 嵌套

keepAlive 模式唯一对功能产生的影响是增加了额外 dom 嵌套,分别是 keepContainer 与 keepElement,产生这两层 dom 的原因分别是:

  • keepElement: 因为 React 实例 Remount 的作用范围是该组件自身 return 的所有虚拟 dom 最终映射的真实 dom,为了保证 React 映射 dom 与 React 树结构的对应,为了不产生 Remount 就必须要用额外的游离态 dom 作为 createPortal 的挂载节点。
  • keepContainer: 由于不仅要知道组件产生移动时,应该将 keepElement 移动到哪个 keepContainer 下,还需要在比如容器代码 return children 位置突然 return null 并恢复时,重新构建 keepElement,所以我们需要监听每一个 keepContainer 生命周期,所以需要额外生成一个 dom。

因此 keepAlive 模式势必会打乱原有应用的 dom 结构,新增的 dom 结构在比如流式布局时可能产生意外的定位错误,所以 keepAlive 模式尽量与绝对定位的布局方式结合。

总结

keepAlive 模式可以在不改变任何协议、应用代码的情况下,解决跨父级移动导致的 Remount 问题,但这种设计也会引入新增 dom 结构的问题,只要尽量采用绝对定位的布局策略,就可以避免负面影响。

讨论地址是:精读《可视化搭建 - keepAlive 模式》· Issue #475 · dt-fe/weekly

如果你想参与讨论,请 点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。

关注 前端精读微信公众号

版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)


相关阅读

  • React SSR 实现原理:从 renderToString 到 hydrate

  • SSR 是 Server Side Rendering,服务端渲染,服务端返回渲染出的 html,浏览器解析 html 来构建页面。其实这是一项很古老的技术,很早之前服务端就是通过 JSP、PHP 等模版引擎,渲染
  • 精读《利用 GPT 解读 PDF》

  • ChatPDF 最近比较火,上传 PDF 文件后,即可通过问答的方式让他帮你总结内容,比如让它帮你概括核心观点、询问问题,或者做观点判断。背后用到了几个比较时髦的技术,还好有 ChatGPT
  • “为淄博荣誉而战”?不妨放平心态

  • 文|孙小婷一串烧烤带火一座城。近日,有关淄博烧烤和城市旅游的新闻频繁引发关注。新闻有暖心的,比如一博主分享在淄博旅游时买下的20元一盒锅饼,发现正常价格为6元左右后,淄博网
  • 2023年购房节创意海报参考100+

  • 关注「地产全案」公众号,每天收看全国顶尖创意作品案例~往期参考:购房节(2023版)、购房节(2020版) 各类海报参考大全 4月节日 | 愚人节 清明节 谷雨 地球日 读书
  • 本周大事件!

  • 最难过的周一来了大家挺住!本周广州有这些大事需要关注赶紧转起来告诉更多小伙伴!广州交通有调整第133届中国进出口商品交易会于4月15日-5月5日在广州举行,期间广州限行、地铁
  • 省级示范!苏州这些乡村再也藏不住了

  • “归园田居”的苏式慢生活藏在姑苏城外的小村庄里林渡暖村近些年苏州大力推进乡村旅游业态创新不仅给身为游客的我们带来世外桃源般的旅游体验也让当地居民住得更舒心并带动

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四
  • 美国对华2000亿关税清单,到底影响有多大?

  • 1 今天A股大跌,上证最大跌幅超过2%。直接导火索是美国证实计划对华2000亿美元产品加征25%关税。 听起来,2000亿美元数目巨大,我们来算笔账。 2000亿美元,按现在人民币汇率

最新文章

  • React SSR 实现原理:从 renderToString 到 hydrate

  • SSR 是 Server Side Rendering,服务端渲染,服务端返回渲染出的 html,浏览器解析 html 来构建页面。其实这是一项很古老的技术,很早之前服务端就是通过 JSP、PHP 等模版引擎,渲染
  • 精读《利用 GPT 解读 PDF》

  • ChatPDF 最近比较火,上传 PDF 文件后,即可通过问答的方式让他帮你总结内容,比如让它帮你概括核心观点、询问问题,或者做观点判断。背后用到了几个比较时髦的技术,还好有 ChatGPT
  • 可视化搭建 - keepAlive 模式

  • 由于 React 的特点,组件改变所在父级后会产生 Remount,而在可视化搭建场景存在两个特点:自由、磁贴、流式布局都可以通过拖拽轻松改变组件父元素。大数据量下组件 Remount 的消