javascript – 如何在另一个React / Redux应用程序中嵌入React / Redux应用程序而不会遇到生命周期问题?

前端之家收集整理的这篇文章主要介绍了javascript – 如何在另一个React / Redux应用程序中嵌入React / Redux应用程序而不会遇到生命周期问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

App A是一个独立的单页React / Redux应用程序,可以插入其他应用程序(不一定用React / Redux编写).我正在尝试将app A嵌入到另一个单页React / Redux应用B中,如下所示:

>在应用B中,创建一个组件ComponentA,其路由与app A使用的相同,并且其render()方法为主机app A生成DIV标记.
>在ComponentA的componentWillMount()方法中,通过附加相应的< script>来加载以前为应用A构建的js包.文档正文末尾的标记,这会导致应用A在页面上呈现.

这似乎工作正常,但是,当我离开ComponentA并返回时,我看到Chrome Dev Tools控制台中出现以下错误次数与访问ComponentA的次数一样多:“Uncaught(in promise)TypeError:无法读取属性’replaceChild’为null“.

当我检查Dev Tools的“React”选项卡时,我可以看到app A的组件层次结构多次出现,只有最后一个实际上附加到物理DOM.

我的猜测是,当我导航到应用程序B的其他部分(使用应用程序B的链接)时,应用程序A不知道路由更改,因此它永远不会卸载,这会导致一些意外行为和后续错误.

我是这项技术的新手,我想知道是否有可能在另一台React / Redux应用程序中嵌入React / Redux应用程序.如果是,那么我怎样才能改变我的方法以使其正常工作?

我暂时没有包含任何代码片段,因为代码是非常标准的,基本的React / Redux代码,而且这是我所质疑的方法本身.

最佳答案
我能够通过修改应用程序A的入口点中的代码并更改应用程序的构建方式来解决问题.

在修复之前:

> App A是作为一个独立的自我渲染应用程序构建的.
> App B的ComponentA正在其componentWillMount()方法添加app A的bundle脚本标签.
> App A的条目JSX立即执行ReactDOM.render(),并且无法从应用程序B中卸载它.

修复后:

> App A构建为库(在Webpack配置中指定).
> App A的条目JSX定义了库接口,公开了自定义new(),render()和unmount()方法.
> App A的捆绑脚本标签在app B的index.html中进行了硬编码.
> App B的ComponentA:

> in componentWillMount():实例化app A.
>在componentDidMount()中:调用app A的render().
> in componentWillUnmount():调用app A的unmount(),它调用ReactDOM.unmountComponentAtNode().

我现在只在“React”选项卡中看到app A的组件层次结构的一个实例,并且控制台中不再出现错误.

对于任何感兴趣的人来说,修复的灵感来自于我最终遇到的以下文章https://codeburst.io/building-react-widget-libraries-using-webpack-e0a140c16ce4

原文链接:https://www.f2er.com/js/429238.html

猜你在找的JavaScript相关文章