>웹 프론트엔드 >JS 튜토리얼 >React 새로운 기능, 중요한 이유 및 마이그레이션 팁

React 새로운 기능, 중요한 이유 및 마이그레이션 팁

Patricia Arquette
Patricia Arquette원래의
2024-12-19 19:39:09684검색

React  What’s New, Why It Matters, and Migration Tips

다시 시작합니다. React ?의 새로운 기능에 대한 또 다른 게시물입니다. 하지만 솔직히 이것은 그만한 가치가 있습니다. React 19는 2024년 4월 출시된 Release Candidate(RC)에서 강력한 업데이트가 포함된 안정적인 릴리스로 공식적으로 이동했습니다! 성능 개선부터 새로운 후크 및 도구에 이르기까지 React 19는 소규모 앱을 구축하든 엔터프라이즈급 솔루션을 구축하든 모든 사람에게 무언가를 제공합니다.

프로젝트를 원활하게 업그레이드하는 데 도움이 되는 코드 예제와 마이그레이션 팁을 통해 새로운 기능을 살펴보겠습니다.

React 19의 새로운 기능

1. 성능 최적화

React 19에서는 다음을 소개합니다.

  • 선택적 수분 공급 강화: 필요에 따라 UI의 일부만 수분 공급하여 서버 렌더링 앱의 수분 공급을 최적화합니다.
  • 더 작은 번들 크기: React 19의 라이브러리는 더 가벼워서 로드 시간이 더 빨라지고 네트워크 사용량이 줄어듭니다.

예: 효율적인 수분 공급

import { hydrateRoot } from 'react-dom/client';
import App from './App';

const container = document.getElementById('root');
hydrateRoot(container, <App />);

2. 새롭게 강화된 후크

아. useFormStatus: 단순화된 양식 상태 관리

새로운 useFormStatus 후크를 사용하면 양식을 더 쉽게 관리할 수 있습니다. 사용자 정의 컨텍스트나 소품 드릴링 없이도 양식의 보류 상태를 추적합니다.

import { useFormStatus } from 'react-dom';

function SubmitButton() {
  const { pending } = useFormStatus();
  return <button type="submit" disabled={pending}>Submit</button>;
}

ㄴ. useDeferredValue: 초기값 옵션

업데이트된 useDeferredValue 후크는 지연된 데이터를 처리하는 동안 초기 대체 값을 렌더링하여 보다 원활한 UI 전환을 보장합니다.

import { useDeferredValue } from 'react';

function Search({ deferredValue }) {
  const value = useDeferredValue(deferredValue, '');

  return <Results query={value} />;
}

ㄷ. useOptimistic: 낙관적 업데이트 처리

새로운 useOptimistic 후크를 사용하면 낙관적 UI 업데이트가 간단해집니다.

import { useOptimistic } from 'react';

function LikeButton() {
  const [optimisticLikes, setOptimisticLikes] = useOptimistic(0);

  function handleLike() {
    setOptimisticLikes(prev => prev + 1);
    fetch('/api/like', { method: 'POST' });
  }

  return <button onClick={handleLike}>Likes: {optimisticLikes}</button>;
}

3. 문서 메타데이터 호이스팅

React 19는 및 <메타> 문서의 <head> 섹션.<br> </p> <pre class="brush:php;toolbar:false">import { hydrateRoot } from 'react-dom/client'; import App from './App'; const container = document.getElementById('root'); hydrateRoot(container, <App />); </pre> <h3> <strong>4. 개선된 참조</strong> </h3> <ul> <li> <strong>Refs as Props</strong>: 이제 refs를 함수 구성요소에 직접 props로 전달할 수 있습니다.</li> <li> <strong>참조 정리 함수</strong>: useEffect와 유사하게 참조에 대한 정리 논리를 정의할 수 있습니다. </li> </ul> <pre class="brush:php;toolbar:false">import { useFormStatus } from 'react-dom'; function SubmitButton() { const { pending } = useFormStatus(); return <button type="submit" disabled={pending}>Submit</button>; } </pre> <h3> <strong>5. 디버깅 및 동시 렌더링</strong> </h3> <ul> <li>React DevTools의 오류 로그가 개선되었습니다.</li> <li> <strong>자동 일괄 처리</strong> 및 <strong>전환</strong>과 같은 기능을 통해 동시 렌더링에 대한 지원이 향상되었습니다. </li> </ul> <pre class="brush:php;toolbar:false">import { useDeferredValue } from 'react'; function Search({ deferredValue }) { const value = useDeferredValue(deferredValue, ''); return <Results query={value} />; } </pre> <h2> <strong>마이그레이션 팁</strong> </h2> <p>React 19로 업그레이드하는 것은 대부분의 프로젝트에서 간단하지만 다음은 원활한 전환을 위한 몇 가지 팁입니다.</p> <h3> <strong>1. 종속성 업데이트</strong> </h3> <p>React 및 React DOM을 최신 버전으로 업데이트하세요.<br> </p> <pre class="brush:php;toolbar:false">import { useOptimistic } from 'react'; function LikeButton() { const [optimisticLikes, setOptimisticLikes] = useOptimistic(0); function handleLike() { setOptimisticLikes(prev => prev + 1); fetch('/api/like', { method: 'POST' }); } return <button onClick={handleLike}>Likes: {optimisticLikes}</button>; } </pre> <h3> <strong>2. 더 이상 사용되지 않는 기능 확인</strong> </h3> <p>React 19에서는 일부 레거시 API를 제거했습니다. 더 이상 사용되지 않는 기능에 대한 자세한 내용은 React 19 변경 로그를 확인하세요.</p> <h3> <strong>3. 동시 기능 테스트</strong> </h3> <p>프로젝트에서 서버 측 렌더링이나 동시 기능을 사용하는 경우 앱을 철저하게 테스트하여 React 19 최적화와 호환되는지 확인하세요.</p> <h3> <strong>4. 새로운 후크를 점진적으로 사용하세요</strong> </h3> <p>useFormStatus 또는 useOptimistic과 같은 새로운 후크를 광범위하게 출시하기 전에 앱의 격리된 부분에 채택해 보세요.</p> <h3> <strong>5. 메타데이터 처리 업데이트</strong> </h3> <p>메타데이터 관리를 위해 타사 라이브러리에 의존하는 경우 React 19의 메타데이터 호이스팅이 설정에서 어떻게 작동하는지 테스트하세요. 불필요한 종속성을 제거하여 코드베이스를 단순화할 수 있습니다.</p> <h3> <strong>6. 디버깅 및 개발</strong> </h3> <p>디버깅을 위해 업데이트된 React DevTools를 활용하세요. 수화 또는 렌더링 중에 오류가 발생하는 경우 React 19는 문제를 더 빠르게 해결할 수 있도록 보다 자세한 로그를 제공합니다.</p> <h3> <strong>7. 동시 렌더링 준비</strong> </h3> <p>구성요소가 동시 렌더링을 올바르게 처리하는지 확인하세요. 예:</p> <ul> <li>동기식 렌더링 동작에 의존하지 마세요.</li> <li>예기치 않은 동작을 방지하기 위해 전환 내에서 상태 업데이트를 테스트하세요.</li> </ul> <h2> <strong>React 19가 중요한 이유</strong> </h2> <p>React 19는 단순한 업데이트 그 이상입니다. 성능, 개발자 경험, 최신 UI 개발 면에서 한 단계 더 발전한 것입니다. 새로운 후크, 향상된 메타데이터 관리, 동시 렌더링 개선 등 이번 릴리스를 통해 개발자는 더 나은 앱을 더 빠르게 구축할 수 있습니다.</p> <h2> <strong>최종 생각</strong> </h2> <p>React 19로 업그레이드할 준비가 되셨나요? 더 가벼운 설치 공간, 강력한 기능 및 향상된 개발자 도구 덕분에 최신 React 애플리케이션에 더 이상 생각할 필요도 없습니다. 위의 마이그레이션 팁을 사용하여 원활한 전환을 보장하고 React 19의 새로운 기능을 탐색해 보세요.</p> <p>자세한 내용은 공식 React 19 블로그 게시물을 확인하세요. 여러분이 가장 좋아하는 새로운 기능과 React 19가 개발 작업 흐름을 어떻게 개선했는지 알려주세요. 즐거운 코딩하세요! ?</p> <p>위 내용은 React 새로운 기능, 중요한 이유 및 마이그레이션 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!</p></div><div class="nphpQianMsg"><a href="javascript:void(0);">define</a> <a href="javascript:void(0);">if</a> <a href="javascript:void(0);">for</a> <a href="javascript:void(0);">while</a> <a href="javascript:void(0);">Error</a> <a href="javascript:void(0);">function</a> <a href="javascript:void(0);">dom</a> <a href="javascript:void(0);">this</a> <a href="javascript:void(0);">transition</a> <a href="javascript:void(0);">ui</a><div class="clear"></div></div><div class="nphpQianSheng"><span>성명:</span><div>본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.</div></div></div><div class="nphpSytBox"><span>이전 기사:<a class="dBlack" title="다시 그리기 위해 HTML5 캔버스를 효율적으로 지우려면 어떻게 해야 합니까?" href="https://m.php.cn/ko/faq/1796727314.html">다시 그리기 위해 HTML5 캔버스를 효율적으로 지우려면 어떻게 해야 합니까?</a></span><span>다음 기사:<a class="dBlack" title="다시 그리기 위해 HTML5 캔버스를 효율적으로 지우려면 어떻게 해야 합니까?" href="https://m.php.cn/ko/faq/1796727338.html">다시 그리기 위해 HTML5 캔버스를 효율적으로 지우려면 어떻게 해야 합니까?</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>관련 기사</h2><em><a href="https://m.php.cn/ko/article.html" class="bBlack"><i>더보기</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="https://m.php.cn/ko/faq/1609.html" title="Bootstrap 목록 그룹 구성 요소에 대한 심층 분석" class="aBlack">Bootstrap 목록 그룹 구성 요소에 대한 심층 분석</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1640.html" title="JavaScript 함수 커링에 대한 자세한 설명" class="aBlack">JavaScript 함수 커링에 대한 자세한 설명</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1949.html" title="JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)" class="aBlack">JS 비밀번호 생성 및 강도 감지의 전체 예(데모 소스 코드 다운로드 포함)</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2248.html" title="Angularjs는 WeChat UI(weui)를 통합합니다." class="aBlack">Angularjs는 WeChat UI(weui)를 통합합니다.</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2351.html" title="JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술" class="aBlack">JavaScript를 사용하여 중국어 번체와 중국어 간체 간을 빠르게 전환하는 방법과 중국어 간체와 중국어 번체 간 전환을 지원하는 웹사이트의 요령_javascript 기술</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!</p></div><div class="footermid"><a href="https://m.php.cn/ko/about/us.html">회사 소개</a><a href="https://m.php.cn/ko/about/disclaimer.html">부인 성명</a><a href="https://m.php.cn/ko/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body><!-- Matomo --><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://tongji.php.cn/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '9']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!-- End Matomo Code --></html>