我不确定这是否会对原始海报有所帮助,但万一其他人遇到这个......
我的项目正在使用 React,我们将 React 根安装到 index.jsp 中具有静态 id 的元素,称为 html 根。
当您尝试在一个页面上实例化同一个 portlet 的多个实例时,后续实例将不会呈现,因为存在多个具有相同 id 的元素。
解决方案是创建一个您自己的实例 id 并创建一个新元素来替换 html 根,以便 html 根成为占位符。由于每次添加 portlet 实例时都会删除 html 元素,因此您可以可靠地多次挂载 React 根目录而不会出现问题。
在这里你可以看到我写的一个工具来创建一个唯一的根并替换占位符(我称之为 RootUtil):
export default {
makeId: function(length) {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < length; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
},
renderRoot: function(placeholderId) {
// create unique id
var instanceId = this.makeId(10);
var id = "react-root-instance-" + instanceId;
// create unique root
var root = document.createElement("div");
root.setAttribute("id", id);
// find placeholder
const placeholder = document.getElementById(placeholderId);
// replace placeholder
//placeholder.replaceWith(root); **breaks in IE**
placeholder.parentElement.replaceChild(root, placeholder); //workaround
// return the new element
return document.getElementById(id);
}}
我在这里称它为:
ReactDOM.render(
<Provider store={Store}>
<div>
...
</div>
</Provider>,
RootUtil.renderRoot("html-root"));