React 커스텀 컴포넌트의 조건부 렌더링 문제 살펴보기
P粉301523298
2023-08-18 15:58:43
<p>내 React 애플리케이션의 사용자 정의 구성요소에서 조건부 렌더링에 문제가 있습니다. 저는 특정 조건이 충족될 때만 콘텐츠를 렌더링하는 조건부 렌더링용 사용자 정의 구성 요소를 만드는 작업을 해왔습니다. 현재 코드는 다음과 같습니다. </p>
<pre class="brush:js;toolbar:false;">'react'에서 React 가져오기;
function ConditionalRenderComponent({ 조건, 하위 }) {
반품 (
<div>
{조건 및 어린이}
</div>
);
}
기본 ConditionalRenderComponent 내보내기;
</pre>
<p>이 맞춤 구성요소를 사용하는 동안 <code>condition</code>인 경우에도 콘텐츠가 <code>children</code> 액세스하고 실행했습니다. 이는 조건이 <code>false</code>인 경우 맞춤 구성요소 없이 직접 <code>condition && <div></div></code>를 사용하는 동작과 다릅니다. 콘텐츠에 대한 접근이 적절하게 차단되었습니다. </p>
<p><strong>맞춤 구성요소를 사용하는 방법은 다음과 같습니다.</strong></p>
<pre class="brush:js;toolbar:false;">'react'에서 React, { useState, useEffect } 가져오기;
'./ConditionalRenderComponent'에서 ConditionalRenderComponent를 가져옵니다.
함수 앱() {
const [userData, setUserData] = useState(null);
const isLoggedIn = userData !== null;
useEffect(() => {
setTimeout(() => {
setUserData({
사용자 이름: 'john_doe',
이메일: 'john@example.com'
});
}, 1000);
}, []);
반품 (
<div>
<h1>내 앱에 오신 것을 환영합니다</h1>
<ConditionalRenderComponent 조건={isLoggedIn}>
<div>
<p>안녕하세요, {userData.username}님! </p>
<p>귀하의 이메일: {userData.email}</p>
</div>
</ConditionalRenderComponent>
{!isLoggedIn <p>사용자 데이터에 액세스하려면 로그인하세요. </p>}
</div>
);
}
기본 앱 내보내기;
</pre>
<p>위의 예에서 <code>userData</code>는 처음에는 <code>null</code>이며 나중에 서버에서 검색된 데이터로 채워집니다. <code>isLoggedIn</code> 조건은 <code>userData</code> </p>
<p>그러나 <code>isLoggedIn</code> 조건이 <code>false</code>(데이터를 가져오기 전)임에도 불구하고 <code>ConditionalRenderComponent</code> <code>userData</code>에 액세스하고 표시합니다. 이로 인해 "TypeError: null 속성을 읽을 수 없습니다('username' 읽기)"라는 오류 메시지가 나타납니다. </p>
<p><strong>표준 조건부 렌더링과의 비교: </strong></p>
<p>다음은 표준 <code>condition <div></div></code>을 사용한 동작을 비교한 것입니다. </p>
<pre class="brush:js;toolbar:false;">// 표준 조건부 렌더링
{isLoggedIn &&
<div>
<p>안녕하세요, {userData.username} 님! </p>
<p>귀하의 이메일: {userData.email}</p>
</div>
)}
</pre>
<p>위의 코드에서 볼 수 있듯이 표준 방법을 사용하면 조건이 <code>false</code>일 때 <code>userData</code> 값에 대한 액세스가 올바르게 차단됩니다. </p>
<p><code>children</code> 속성이 있는 맞춤 구성요소를 사용할 때 동작에 이러한 차이가 발생하는 이유가 무엇인지 잘 모르겠습니다. 디버깅을 시도하고 해결책을 찾아보았지만 아직 명확한 답을 찾지 못했습니다. </p>
<p> 이러한 현상이 발생하는 이유와 <code>children</code> 속성에 대해 예상되는 조건부 렌더링 동작을 달성하기 위해 맞춤 구성요소를 수정하는 방법에 대한 통찰력이나 제안을 보내주시면 감사하겠습니다. </p>
<p>도움을 주셔서 미리 감사드립니다! </p>
왜 이런 일이 발생하나요?
이런 일이 발생하는 이유는
ConditionalRenderComponent
컴포넌트에서 하위 요소가 (함수에 대한 매개변수와 같은) 속성으로 전달되기 때문이라고 생각합니다. JSX 표현식은 함수에 대한 인수로 평가됩니다.즉,
함수에 전달되기 전에 평가됩니다.condition
이 false인 경우에도condition
为false,children
在传递给ConditionalRenderComponent
는PlayStation
(在你的左手)和数学试卷成绩
아이에게children
아이는 이미 왼손에 PlayStation을 볼 수 있으므로(JSX 표현으로children
이제 주먹을 쥐면children
。这样,您可以确保只有在condition
为真时才会评估children
구성 요소에서 직접 렌더링하는 대신 함수를 하위 요소로 사용하여 사용자 정의 구성 요소를 수정합니다조건
이 true인 경우에만가 평가됩니다.
ConditionalRenderComponent 변경 사항
으아악 🎜ConditionalRenderComponent 렌더링 변경 사항🎜 으아악조건부 렌더링을 위한 컴포넌트를 생성하는 것을 권장하지는 않지만, 만들고 싶다면 렌더링 속성 패턴을 사용하여 조건이 true인 경우에만 함수가 호출되도록 할 수 있습니다. 이렇게 하면 표현식이 즉시 평가되지 않습니다.
으아악