조건을 만족하지 않으면, 아무것도 랜더링하지않는다. --> null
값을 준다
function App() {
const name = '리액트';
return (
<>
{name === '리액트' ? <h1>리액트입니다.</h1> : null}
</>
);
}
&&연산자를 사용해서 조건부 랜더링을 한다.
위에 코드와 같은 의미
function App() {
const name = '리액트';
return (
<>
{name === '리액트' ? <h1>리액트입니다.</h1>}
</>
);
}
주의! 리액트 특성
falsy한 값인 0은 예외적으로 화면에 나타난다.
function App() {
const name = '리액트';
const number = 0; // 0
return (
<>
{name === '리액트' && <h1>리액트입니다.</h1>}
{number && <div>내용</div>}
</>
);
}
number = 1
: 내용
number = false
: ' '
number = true
: 내용
💬 왜 0이 나오지 라는 생각을 했는데,
1이 true이고, 0이 false이기때문에
0을 할당한 것은 false 이기때문에 빈칸이 나와야하지만,
리액트 특성상, 0은 0 그대로 출력 이라는 의미 같다.
: 카멜표기법으로 작성해야한다.
import './App.css';
function App() {
// const name = '리액트';
// const style = {
// backgroundColor: 'black',
// color: 'aqua',
// fontSize: '48px',
// fontWeight: 'bold',
// padding: 16,
// };
// return <div style={style}>{name}</div>
---위아래 같은 결과값 표현만 다르다---
return <div style={{
backgroundColor: 'black',
color: 'aqua',
fontSize: '48px',
fontWeight: 'bold',
padding: 16,}}>{name}</div>;
}
export default App;
// App.css
.react {
background: aqua;
color: black;
font-size: 48px;
font-weight: bold;
padding: 16;
}
// App.js
import './App.css';
function App() {
const name = '리액트';
return <div className='react'>{name}</div>;
}
export default App;
기존에는 class = "클래스이름" 이였다면,
리액트에서는 className = "클래스이름" 이다.
HTML에서는 열고 닫지 않아도 되는 태그가 있었다.
ex) <br>
, <input>
JSX는 열었으면 무조건 닫아야한다.
ex) <input />
-->self-closing태그
주석
{/* 리액트 주석은 이렇게 작성 */}
// App.js
import './App.css';
import MyComponent from '../Components/MyComponent.js';
function App() {
return (
<>
<MyComponent></MyComponent>
</>
);
}
export default App;
// MyCoponent.js
const MyComponent = () => {
return (
<>
<h1>My Component</h1>
</>
);
};
export default MyComponent;
props : properties
: 컴포넌트 속성을 설정할 때 사용하는 요소
-컴포넌트 사용할 때, props 값 지정
props는 읽기전용, 컴포넌트끼리 값을 전달하는 방법
부모 컴포넌트에서 설정할 수있음
1.컴포넌트를 사용할 때 props값 지정
// App.js
function App() {
return (
<>
<MyComponent name='기본이름'></MyComponent>
</>
);
}
// MyComponent.js
function MyComponent(props) {
console.log(props);
// {name : "기본이름" }
return (
<>
<h1>안녕하세요. 저는 {props.name}입니다.</h1>
</>
);
}
export default MyComponent;
2. props 기본값 설정: defaultProps
// App.js
name값 지우고, Mycomponent.js에서 name 할당
function MyComponent(props) {
console.log(props);
// {name : "기본이름" }
return (
<>
<h1>안녕하세요. 저는 {props.name}입니다.</h1>
</>
);
}
MyComponent.defaultProps = {
name: '기본이름',
};
export default MyComponent;
3.태그 사이에 내용을 보여주는 children
// App.js
function App() {
return (
<>
<MyComponent>리액트</MyComponent>
</>
);
}
// MyComponent.js
function MyComponent(props) {
console.log(props);
// {name : "기본이름" }
return (
<>
<h1>안녕하세요. 저는 {props.name}입니다.</h1>
<p>children값은 {props.children} 입니다.</p>
</>
);
}
MyComponent.defaultProps = {
name: '기본이름',
};
export default MyComponent;
4. ⭐비구조화 할당 문법을 통해 props 내부 값 추출⭐
function MyComponent({ name, children }) {
return (
<>
<h1>안녕하세요. 저는 {name}입니다.</h1>
<p>children값은 {children} 입니다.</p>
</>
);
}
MyComponent.defaultProps = {
name: '기본이름',
};
export default MyComponent;
코드가 짧아진다.
이 방법으로, props를 사용하도록 한다.
5.propTypes를 통한 props 검증
import PropTypes from 'prop-types';
// import로 불러와야한다
MyComponent.propTypes = {
name: PropTypes.string,
};
// propType지정
// name 값이 무조건 string(문자열)형태로 전달해야 된다.
// 숫자 값이 들어가면 콘솔에 경고메세지가 뜬다
state : 컴포넌트 내부에서 바뀔 수 있는 값
// Say.js
import { useState } from 'react';
const Say = () => {
const [message, setMessage] = useState('');
const onClickEnter = () => setMessage('안녕하세요!');
const onClickLeave = () => setMessage('안녕히 가세요!');
return (
<>
<button onClick={onClickEnter}>입장</button>
<button onClick={onClickLeave}>퇴장</button>
<h1>{message}</h1>
</>
);
};
export default Say;
import { useState } from 'react';
const Say = () => {
const [message, setMessage] = useState('');
const onClickEnter = () => setMessage('안녕하세요!');
const onClickLeave = () => setMessage('안녕히 가세요!');
const [color, setColor] = useState('black');
return (
<>
<button onClick={onClickEnter}>입장</button>
<button onClick={onClickLeave}>퇴장</button>
<h1 style={{ color }}>{message}</h1>
<button style={{ color: ' red' }} onClick={() => setColor('red')}>
빨간색
</button>
<button style={{ color: 'green' }} onClick={() => setColor('green')}>
초록색
</button>
<button style={{ color: 'blue' }} onClick={() => setColor('blue')}>
파란색
</button>
</>
);
};
import { useState } from 'react';
// useState를 사용하겠다
function Like() {
// Like 컴포넌트 선언
const [heart, setHeart] = useState(['']);
// useState에는 일단 빈칸을 할당
// heart는 현재 상태, setHeart는 상태를 바꾸어주는 함수
const clickLike = () => setHeart('🧡');
// clickLike 함수는 heart의 값을 '🧡'로 바꿔준다
const clickBad = () => setHeart('❌');
// clickLike 함수는 heart의 값을 '❌'로 바꿔준다
return (
// 컴포넌트의 출력값
// h1태그안에 heart값을 입력
// 맨 윗 줄에 heart갑은 빈칸이지만,
// 좋아요 버튼을 누르면 clickLike함수가 실행되서 heart의 값이 변한다.
// 싫어요 버튼을 누르면 clickBad함수가 실행되서 heart의 값이 변한다.
<>
<h1>{heart}</h1>
<button onClick={clickLike}>좋아요👍</button>
<button onClick={clickBad}>싫어요😂</button>
</>
);
}
export default Like;
return (
<>
<h1>이벤트 연습</h1>
<input
type='text'
name='message'
placeholder='아무거나 입력해보세요'
onChange={(e) => {
console.log(e.target.value);
// input으로 받는 값
}}
></input>
</>
);
}
import { useState } from 'react';
// useState를 사용하겠다.
function EventPractice() {
// EventPractice라는 컴포넌트 선언
const [text, setText] = useState('');
// text에 일단 빈칸을 선언, setText로 상태를 변화시킬예정
const clickEvent = () => {
alert(text);
};
// clickEvent라는 함수선언
// 알림창에 text를 보여주겠다.
return (
<>
<h1>이벤트 연습</h1>
<input
value={text}
onChange={(e) => {
setText(e.target.value);
// console.log(e.target.value);
}}
></input>
<button onClick={clickEvent}>확인</button>
</>
);
}
// input 를 text로 할당, 지금 text는 할당된 값이 없다.
// e.target.value라는 값은 input부분이라는 걸 알수있었다.
// onChnage 이벤트로 e.target.value라는text의 값의 상태를 변경해주었다.
// e.target.value 값을 text에 할당
// 확인버튼을 누르면 알림창에 text값이 나오게 했다.
export default EventPractice;