Reactjs 如何确保ReactDOM.createPortal应用程序内组件在我的测试用例中挂载时运行?

Reactjs 如何确保ReactDOM.createPortal应用程序内组件在我的测试用例中挂载时运行?,reactjs,jestjs,enzyme,react-dom,Reactjs,Jestjs,Enzyme,React Dom,我尝试通过首先装载来运行测试应用程序组件,但它抛出错误:目标容器不是DOM元素,指向ReactDOM.createPortal函数中的第二个参数“header”…那么,我如何确保装载后名为element的头在那里???我试图通过制作一些document.createElement来添加头元素,但没有帮助…请帮助 用最新的版本来回应和开玩笑就可以了 App.test.js import React from 'react'; import { mount } from 'enzyme'; imp

我尝试通过首先装载来运行测试应用程序组件,但它抛出错误:目标容器不是DOM元素,指向ReactDOM.createPortal函数中的第二个参数“header”…那么,我如何确保装载后名为element的头在那里???我试图通过制作一些document.createElement来添加头元素,但没有帮助…请帮助

用最新的版本来回应和开玩笑就可以了

App.test.js


import React from 'react';
import { mount } from 'enzyme';
import App from './App';

it('render app', () => {
    const rendered = mount(<App />);
});

从“React”导入React;
从“酶”导入{mount};
从“./App”导入应用程序;
它('渲染应用',()=>{
const rendered=mount();
});
App.js


import React from 'react';
import './App.css';
import ReactDOM from 'react-dom';

const headerProp = document.getElementById('header');
console.log("headerProp in App.js :: " , headerProp);
function App() {
  return (
    <div className="App">
      {ReactDOM.createPortal(<div id='cntr'>HIIIIIIIII</div> , headerProp)}
    </div>
  );
}

export default App;


从“React”导入React;
导入“/App.css”;
从“react dom”导入react dom;
const headerProp=document.getElementById('header');
log(“App.js:中的headerProp:”,headerProp);
函数App(){
返回(
{ReactDOM.createPortal(hiiii,headerProp)}
);
}
导出默认应用程序;
index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(<App />, document.getElementById('root'));

serviceWorker.unregister();

从“React”导入React;
从“react dom”导入react dom;
导入“./index.css”;
从“./App”导入应用程序;
将*作为serviceWorker从“/serviceWorker”导入;
ReactDOM.render(,document.getElementById('root'));
serviceWorker.unregister();
index.html


....
.....
<body>
    <noscript>
        You need to enable JavaScript to run this app.
    </noscript>
    <div class="jp-react-cmp" id="header">
    </div>
    <div class="jp-react-cmp" id="banner">
    </div>
    <div class="jp-react-cmp" id="root">
    </div>

...
....


....
.....
您需要启用JavaScript才能运行此应用程序。
...
....
npm运行测试后出错::


Invariant Violation: Target container is not a DOM element.

       8 |   return (
       9 |     <div className="App">
    > 10 |       {ReactDOM.createPortal(<div id='cntr'>HIIIIIIIII</div> , headerProp)}
         |                 ^
      11 |     </div>
      12 |   );
      13 | }

不变冲突:目标容器不是DOM元素。
8 |返回(
9 |     
>10 |{ReactDOM.createPortal(HIIIII,headerProp)}
|                 ^
11 |     
12 |   );
13 | }

代码中的问题是,您提供了无效的标题作为createPortal的参数

使用ReactDOM.createPortal的一个简单示例是:

import React from "react";
import ReactDOM from "react-dom";

function MyPortal() {
  return ReactDOM.createPortal(
    <div>Content</div>,
    document.body
  )
}

function App() {
  return (
    <div className="App">
      <MyPortal />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

从“React”导入React;
从“react dom”导入react dom;
函数MyPortal(){
返回ReactDOM.createPortal(
内容,,
文件正文
)
}
函数App(){
返回(
);
}
const rootElement=document.getElementById(“根”);
render(,rootElement);

希望这有帮助

您希望此门户的具体内容是什么?正如我所看到的,问题可能是提供的“header”参数不是有效的DOM节点。另外,我认为最好不要将其置于状态。请重新检查,我实际上有index.html中的标题引用,我的应用程序在其中呈现为根元素,如::
ReactDOM.render(routes,document.getElementById('root'))
;index.html中也有header div,如上图所示…@Jojo Tutorcan您记录了“header”的值吗?确保这不是空值。不,实际上整个应用程序都在运行,…目前最新开发版本中存在一些bug(与createPortal无关),所以我将在bug解决后记录header的值。我运行了一个不同的bug生成代码,并在控制台上以===>headerProp的形式在app.js中得到输出:(无论我传递到createPortal的是哪个孩子)​嘿@Jojo Tutor,你发现用我更新的代码复制问题并获得解决方案有什么运气吗?