React에서는 원하는 동작을 캡슐화 하는 컴포넌트를 만들 수 있고, 애플리케이션의 상태에 따라서 컴포넌트 중 일부만 렌더링 할 수 있다.
if
나 조건부 연산자
와 같은 JavaScript 연산자로 현재 상태를 나타내는 엘리먼트를 만드는 데 사용하면 React는 현재 상태에 맞게 UI를 업데이트 한다.UserGreeting
컴포넌트와 GuestGreeting
컴포넌트가 있다.
function UserGreeting(props) {
return <h1>Welcome back!</h1>;
}
function GuestGreeting(props) {
return <h1>Please sign up.</h1>;
}
Greeting
컴포넌트 생성isLoggedIn
prop에 따라 다른 인사말을 렌더링 한다.function Greeting(props) {
const isLoggedIn = props.inLoggedIn;
if (isLoggedIn) {
return <UserGreeting />;
}
return <GestGreeting />;
}
const root = ReactDom.createRoot(document.getElementById('root'));
// Try changing to is LoggedIn={true}:
root.render(<Greeting isLoggedIn={false} />);
LoginButton
버튼과 LogoutButton
버튼 컴포넌트가 있다.
function LoginButton(props) {
return (
<button onClick={props.onClick}>Login</button>
);
}
function LogoutButton(props) {
return (
<button onClick={props.onClick}>Logout</button>
);
}
LoginControl
이라는 유상태 컴포넌트 생성<LoginButton />
또는 <LogoutButton />
을 렌더링<Greeting />
도 함께 렌더링class LoginControl extends React.Component {
constructor(props) {
super(props);
this.handleLoginClick = this.handleLoginClick.bind(this);
this.handleLogoutClick = this.handleLogoutClick.bind(this);
this.state = {isLoggedIn: false};
}
handleLoginClick() {
this.setState({isLoggedIn: true});
}
handleLogoutClick() {
this.setState({isLoggedIn: false});
}
render() {
const isLoggedIn = this.state.isLoggedIn;
let button;
if (inLoggedIn) {
button = <LogoutButton onClick={this.handleLogoutClick} />;
} else {
button = <LoginButton onClick={this.handleLoginClick} />;
}
}
return (
<div>
<Greeting inLoggedIn={isLoggedIn} />
{button}
</div>
)
}
const root = ReactDom.createRoot(document.getElementById('root'));
root.render(<LoginControl />);
여러 조건을 JSX 안에서 인라인으로 처리해보기
JSX 안에는 중괄호를 이용해서 표현식을 포함할 수 있다. 그 안에서 Javascript의 논리 연산자 &&
를 사용하면 쉽게 엘리먼트를 조건부로 넣을 수 있다.
true && expression
은 항상 expression
으로 평가false && expression
은 항상 false
로 평가⇒ 따라서 &&
뒤에 엘리먼트는 조건이 ture
일때 출력되고, false
라면 React는 무시하고 건너뛴다.
funtion Mailbox(props) {
const unreadMessages = props.unreadMessages;
return (
<div>
<h1>Hello!</h1>
{unreadMessages.length > 0 &&
<h2>You have {unreadMessages.length} unread messages.</h2>
}
</div>
)
}
&&
뒤에 있는 표현식은 건너뛰지만, falsy 표현식은 반환된다<div>0</div>
이 render메서드에서 반환된다.render() {
const count = 0;
return (
<div>
{count && <h1>Messages: {count}</h1>}
</div>
);
}
See the Pen Inline If-Else with Logical && Operator by bori (@boriguri) on CodePen.
삼항 연산자인 condition ? true : false
를 사용하여 엘리먼트를 조건부로 렌더링
render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> looged in.
</div>
);
}
// 삼항 연산자로 컴포넌트를 조건부 렌더링
render() {
const isLoggedIn = this.state.isLoggedIn;
return (
<div>
{isLoggedIn
? <LogoutButton onClick={this.handleLogoutClick} />
: <LoginButton onClick={this.handleLoginClick} />
}
</div>
);
}
⇒ 조건이 너무 복잡하다면 컴포넌트를 분리하는 것이 좋다.
다른 컴포넌트에 의해 렌더링될 때 컴포넌트 자체를 숨기고 싶을 경우, 렌더링 결과를 출력하는 대신 null
을 반환할 수 있다.
<WarningBanner />
컴포넌트
warn
prop의 값에 의해서 렌더링false
라면 컴포넌트를 렌더링하지 않는다.funtion WarningBanner(props) {
if (!props.warn) {
return null;
}
return (
<div className="warning">Warning!</div>
);
}
class Page extends React.Component {
constructor(props) {
super(props);
this.state = {showWarning: true};
this.handleToggleClick = this.handleToggleClick.bind(this);
}
handleToggleClick() {
this.setState(state => ({
showWarning: !state.showWarning
}));
}
render() {
return (
<div>
<WarningBanner warn={this.state.showWarning} />
<button onClick={this.handleToggleClick}>
{this.state.showWarning ? 'Hode' : 'Show'}
</button>
</div>
)
}
}
const root = ReactDom.createRoot(document.getElementById('root'));
root.render(<Page />);
⇒ 컴포넌트의 render
메서드로부터 null
을 반환하는 것은 생명주기 메서드 호출에 영향을 주지 않는다.
그 예로 componentDidUpdate
는 계속 호출된다.