source

불변 위반: _registerComponent(...): 대상 컨테이너가 DOM 요소가 아닙니다.

bestscript 2022. 11. 12. 08:32

불변 위반: _registerComponent(...): 대상 컨테이너가 DOM 요소가 아닙니다.

사소한 React 예제 페이지를 만든 후 다음 오류가 발생합니다.

검출되지 않은 오류:불변 위반: _registerComponent(...): 대상 컨테이너가 DOM 요소가 아닙니다.

제 코드는 다음과 같습니다.

/** @jsx React.DOM */
'use strict';

var React = require('react');

var App = React.createClass({
  render() {
    return <h1>Yo</h1>;
  }
});

React.renderComponent(<App />, document.body);

HTML:

<html>
<head>
  <script src="/bundle.js"></script>
</head>
<body>
</body>
</html>

이것은 무엇을 의미합니까?

까지, 「 」는 「 」입니다.document를 아직할 수 .왜냐하면요소가존재하지않기때문입니다.script가 그 에 있다head이 솔루션은 유효한 솔루션이지만scripthead렌더링 시에는 를 아래에 배치하고 루트 컴포넌트를 다음과 같이 앞에 렌더링하는 것이 좋습니다.

<html>
<head>
</head>
<body>
  <div id="root"></div>
  <script src="/bundle.js"></script>
</body>
</html>

,에는bundle.js 콜:

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

항상 대신 네스트된 상태로 렌더링해야 합니다. 그렇지 않으면 모든 종류의 서드파티 코드(Google Font Loader, 브라우저 플러그인 등)에 의해 수정이 가능합니다.bodyReact가 예상하지 못한 경우 DOM 노드가 나타나며 추적 및 디버깅이 매우 어려운 이상한 오류가 발생합니다.이 문제에 대한 자세한 내용은 여기를 참조하십시오.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★의 장점script맨 아래에는 React 서버 렌더링을 프로젝트에 추가할 경우 스크립트가 로드될 때까지 렌더링을 차단하지 않습니다.


업데이트: (2015년 10월 7일| v0.14)

React.render 사용ReactDOM.render★★★★★★ 。

예:

import ReactDOM from 'react-dom';

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

/index.html

<!doctype html>
<html>
  <head>
    <title>My Application</title>
    <!-- load application bundle asynchronously -->
    <script async src="/app.js"></script>
    <style type="text/css">
      /* pre-rendered critical path CSS (see isomorphic-style-loader) */
    </style>
  </head>
  <body>
    <div id="app">
      <!-- pre-rendered markup of your JavaScript app (see isomorphic apps) -->
    </div>
  </body>
</html>

/app.js

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

function run() {
  ReactDOM.render(<App />, document.getElementById('app'));
}

const loadedStates = ['complete', 'loaded', 'interactive'];

if (loadedStates.includes(document.readyState) && document.body) {
  run();
} else {
  window.addEventListener('DOMContentLoaded', run, false);
}

(IE9+)

주의: 가지고 있다<script async src="..."></script>HTML 콘텐츠가 로드되기 전에 브라우저가 JavaScript 번들 다운로드를 시작합니다.

출처 : 리액트 스타터 키트, 동형식 로더

ready 함수는 다음과 같이 사용할 수 있습니다.

$(document).ready(function () {
  React.render(<App />, document.body);
});

jQuery를 할 수 .onload★★★★

<body onload="initReact()">...</body>

index.timeout에 다음 항목을 추가하는 것은 어떨까요?

type="javascript"

다음과 같습니다.

<script type="javascript" src="public/bundle.js"> </script>

나는 성공했어! :-)

저도 같은 실수를 했어요.코드 변경 후 단순한 오타가 원인인 것으로 판명되었습니다.

document.getElementById('root')

로.

document.querySelector('root')

'#'이 없어진 것을 주목해 주세요.

document.querySelector('#root')

혹시라도 다른 사람이 이 오류를 해결하는 데 도움이 될까 봐 글을 올립니다.

네, 기본적으로 올바른 작업입니다.단, JavaScript가 동기화되어 있기 때문에 DOM이 로드되기 전에 코드를 실행하고 있는 경우는 몇 가지 방법이 있습니다.

1) DOM이 완전히 로드되었는지 확인한 후 원하는 작업을 수행합니다. 예를 들어 다음과 같이 DOMContentLoaded를 들을 수 있습니다.

<script>
  document.addEventListener("DOMContentLoaded", function(event) {
    console.log("DOM fully loaded and parsed");
  });
</script>

2)를 2) 태그의 맨 입니다.document(예:

<html>
  <head>
  </head>
  <body>
  </body>
  <script src="/bundle.js"></script>
</html>

사용 3) 사용window.onload가 로드 때

window.addEventListener("load", function() {
  console.log("Everything is loaded");
});

사용 4) ★★document.onload이것은, DOM 가 준비되었을 때에 기동됩니다.

document.addEventListener("load", function() {
  console.log("DOM is ready");
});

DOM이 준비되었는지 확인하는 옵션은 더 많지만 모든 경우에 DOM이 준비되었는지 확인하기 전에 스크립트를 실행하지 마십시오.

JavaScript는 DOM 요소와 함께 작동하며 사용할 수 없는 경우 null을 반환하고 전체 응용 프로그램을 손상시킬 수 있습니다.따라서 JavaScript를 실행하기 전에 항상 완벽하게 준비가 되어 있는지 확인하십시오.

반응을 렌더링하기 위해 웹 팩을 사용하고 반응에서 HtmlWebpackPlugin을 사용하는 경우 이 플러그인은 자동으로 빈 index.html을 작성하고 div 요소를 포함하지 않도록 js 파일을 삽입합니다.Html은 HtmlWebPackPlugin 문서로서 자신의 index.html을 작성하여 이 플러그인에 주소를 지정할 수 있습니다.

plugins: [            
    new HtmlWebpackPlugin({
        title: 'dev',
        template: 'dist/index.html'
    })
],

그리고 이것은 나의 index.filename 파일입니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="shortcut icon" href="">
    <meta name="viewport" content="width=device-width">
    <title>Epos report</title>
</head>
<body>
   <div id="app"></div>
   <script src="./bundle.js"></script>
</body>
</html>

제 경우, 이 에러는 새로운 클래스를 도입할 때 핫 새로고침으로 인해 발생하였습니다.프로젝트의 그 단계에서 일반 감시자를 사용하여 코드를 컴파일합니다.

ReactJs를 사용하시는 분들을 위해.게시 후 Net 및 다음 오류 발생:

하고 .jsx 파일을 합니다.Build Action로 설정되어 있다.Content. [ ]로 None공개되지 않습니다.이 SO 답변에서 이 해결책을 찾았습니다.

같은 에러 메세지가 표시되었다.이 경우 리액트를 렌더링하는 타깃 DOM 노드가 없었습니다.JS 컴포넌트가 정의되어 있습니다.HTML 타깃 노드가 적절한 "id" 또는 "name" 및 기타 HTML 속성(설계 요구에 적합)으로 올바르게 정의되어 있는지 확인합니다.

입수 시:

오류: 수집되지 않은 오류:대상 컨테이너가 DOM 요소가 아닙니다.

DOMContentLoaded 이벤트를 사용하거나 DOMContentLoaded 이벤트를<script ...></script>몸 밑바닥에 꼬리표를 달아요.

DOMContentLoaded 이벤트는 스타일시트, 이미지 및 서브프레임 로드가 완료될 때까지 기다리지 않고 초기 HTML 문서가 완전히 로드되고 구문 분석될 때 실행됩니다.

document.addEventListener("DOMContentLoaded", function(event) {
  ReactDOM.render(<App />, document.getElementById('root'));
})

기본적인 HTML CSS js를 만들고 js에서 스크립트를 렌더링하기만 하면 됩니다.

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

var destination = document.querySelector('#container');

   ReactDOM.render(
<div>
<p> hello world</p>
</div>, destination


	); 
body{

    text-align: center;
    background-color: aqua;
  padding: 50px;
  border-color: aqua;
  font-family: sans-serif;
}
#container{
  display: flex;
  justify-content: flex;

}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
   
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />   
    <title> app  </title>
  </head>
  <body>
 

    <div id="container">
      
    </div>

  </body>
</html>

사용하는 - 는 - jQuery를 합니다.window.onloadQuery (쿼리)

그래서 이건 나한테 효과가 있었어.

<script>
    $(function () {          <= replacing window.onload = function() {
      // Begin Swagger UI call region
      const ui = SwaggerUIBundle({
        ...

      window.ui = ui;
    });
  </script>

제 경우 html 파일의 모든 것이 올바르게 설정되어 있습니다(즉, 스크립트는 본문 태그의 맨 아래에 있습니다).이 문제는 컴포넌트의 정의를 컴포넌트가 ReactDOM으로 렌더링된 다른 파일로 이동함으로써 해결되었습니다.

그래서 저는 원래

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

class Comp extends React.Component {
    // component definition
}

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

컴포넌트 정의를 다른 파일로 이동하고 Import한 후 문제가 해결되었습니다.

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

import Comp from './CompFile';

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

제 경우, 아래의 index.js를 잘못 기재하여 수정하였습니다.

오류:

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

솔루션: document.getElementById("root")

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById("root") // declared 
);

웹 팩 포함.html 파일을 정의하는 대신 htmlPlugin으로 로드할 수 있습니다.이 경우 Webpack은 스크립트태그가 root-div 요소 위에 있는html 파일을 만듭니다.빠른 수정 방법 중 하나는 돔에 동적으로 새 div를 추가한 후 리액트 돔을 쓰는 것입니다.이것은 다음과 같이 index.js 파일에 정의되어 있는 reactDom 렌더 함수(통상은)에서 실행할 수 있습니다.

import React from "react";
import ReactDOM from "react-dom";
import App from "./components/App";
import { BrowserRouter as Router } from "react-router-dom";
ReactDOM.render(
      <Router>
          <App />
      </Router>,
      document.body.appendChild(document.createElement("div"))
    );

언급URL : https://stackoverflow.com/questions/26566317/invariant-violation-registercomponent-target-container-is-not-a-dom-elem