exportfunctionrender( element: React$Element<any>, container: Container, callback: ?Function ) { if (__DEV__) { console.error( "ReactDOM.render is no longer supported in React 18. Use createRoot " + "instead. Until you switch to the new API, your app will behave as " + "if it's running React 17. Learn " + "more: https://reactjs.org/link/switch-to-createroot" ); }
if (!isValidContainerLegacy(container)) { thrownewError("Target container is not a DOM element."); }
if (__DEV__) { const isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; if (isModernRoot) { console.error( "You are calling ReactDOM.render() on a container that was previously " + "passed to ReactDOM.createRoot(). This is not supported. " + "Did you mean to call root.render(element)?" ); } } return legacyRenderSubtreeIntoContainer( null, element, container, false, callback ); }
ReactDOM.render()는 처음 호출할 때 기존의 DOM 엘리먼트를 교체하며 이후의 호출은 React의 DOM diffing 알고리즘을 사용하여 더욱 효율적으로 업데이트한다.
ReactDOM.render()는 컨테이너 노드를 수정하지 않고 컨테이너의 하위 노드만 수정하여 자식 노드를 덮어쓸 필요 없이 기존의 DOM 노드에 컴포넌트를 추가할 수 있다.
ReactDOM.render()는 현재 ReactComponent 루트(root) 인스턴스에 대한 참조를 반환한다. 그러나 이 반환 값을 사용하는 것은 피해야한다. ReactComponent 인스턴스의 참조가 필요하다면 권장하는 해결책은 루트 엘리먼트에 콜백 ref를 붙여야한다.
ReactDOM.render()를 사용해 서버에서 렌더링한 컨테이너에 이벤트를 보충할 때는 hydrate()를 사용해야 한다.
exportfunctionhydrate( element: React$Node, container: Container, callback: ?Function ) { if (__DEV__) { console.error( "ReactDOM.hydrate is no longer supported in React 18. Use hydrateRoot " + "instead. Until you switch to the new API, your app will behave as " + "if it's running React 17. Learn " + "more: https://reactjs.org/link/switch-to-createroot" ); }
if (!isValidContainerLegacy(container)) { thrownewError("Target container is not a DOM element."); }
if (__DEV__) { const isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; if (isModernRoot) { console.error( "You are calling ReactDOM.hydrate() on a container that was previously " + "passed to ReactDOM.createRoot(). This is not supported. " + "Did you mean to call hydrateRoot(container, element)?" ); } } // TODO: throw or warn if we couldn't hydrate? return legacyRenderSubtreeIntoContainer( null, element, container, true, callback ); }
if (!MONGODB_URI) { thrownewError( "Please define the MONGODB_URI environment variable inside .env.local" ); }
/** * Global is used here to maintain a cached connection across hot reloads * in development. This prevents connections growing exponentially * during API Route usage. */ let cached = global.mongoose;
위 예제 코드에선 첫 렌더링에 counter rendered가 콘솔에 기록되고, Counter의 count 값이 변화할 때 마다 counter rendered가 콘솔에 기록될 것이다. 여기서 <Logger label="counter"/> 엘리먼트는 렌더링할 때 변하지 않는 정적인 엘리먼트이다.