Skip to content

Commit c487ea6

Browse files
authored
Merge pull request #7 from Jump2FE/dasom
[2회] 현다솜 - UI 표현하기 (1)
2 parents 8a7ace2 + 101bc06 commit c487ea6

1 file changed

Lines changed: 239 additions & 0 deletions

File tree

02회/hyeondasom/README.md

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
2주차 - UI 표현하기 (1)
2+
3+
https://www.notion.so/dasom-hyeon/2-UI-1-a93165af97fb43cb844d35bc8ff26926?pvs=4
4+
5+
# 첫 번째 컴포넌트
6+
7+
https://ko.react.dev/learn/your-first-component
8+
9+
마크업, CSS, JavaScript를 앱의 재사용 가능한 UI 요소인 ‘컴포넌트’로 결합할 수 있다.
10+
11+
- 컴포넌트 정의하기
12+
- 마크업으로 뿌릴 수 있는 JavaScript 함수
13+
- 컴포넌트 빌드하는 방법
14+
1. 컴포넌트 내보내기
15+
16+
```jsx
17+
export default //...
18+
```
19+
20+
2. 함수 정의하기
21+
22+
```jsx
23+
function Profile() {}
24+
```
25+
26+
- React 컴포넌트는 일반 JS 함수이지만 이름은 대문자로 시작해야한다.
27+
28+
3. 마크업 추가하기
29+
30+
```jsx
31+
return <img src="..." alt="..." />;
32+
33+
return (
34+
<div>
35+
<img src="..." alt="..." />
36+
</div>
37+
);
38+
```
39+
40+
- 괄호가 없으면 뒷라인에 있는 모든 코드가 무시 된다.
41+
42+
## 컴포넌트 사용하기
43+
44+
```jsx
45+
function A() {
46+
return <span>TEXT</span>;
47+
}
48+
49+
function App() {
50+
return (
51+
<div>
52+
<A />
53+
</div>
54+
);
55+
}
56+
```
57+
58+
## 컴포넌트 중첩 및 구성
59+
60+
컴포넌트는 일반 JavaScript 함수이므로 같은 파일에 여러 컴포넌트를 포함할 수 있다. 컴포넌트가 상대적으로 작거나 서로 밀접하게 관련되어 있을 때 편리하다. 이를 부모 컴포넌트, 자식 컴포넌트로 구분할 수 있다.
61+
62+
<aside>
63+
💡 주의
64+
컴포넌트는 다른 컴포넌트를 렌더링할 수 있지만 매우 느리고 버그를 유발하기 때문에 정의를 중첩해서는 안된다.
65+
(https://ko.react.dev/learn/preserving-and-resetting-state#different-components-at-the-same-position-reset-state)
66+
67+
</aside>
68+
69+
### key를 이용한 state 초기화
70+
71+
key를 명시하면 React는 부모 내에서의 순서 대신에 key 자체를 위치의 일부로 사용한다. 이것이 컴포넌트를 jsx에서 같은 자리에 렌더하지만 React 관점에서는 다른 카운터인 이유이다. 결과적으로 그들은 절대 state를 공유하지 않는다.
72+
73+
→ key가 전역적으로 유일하지 않다는 것을 기억하자. key는 오직 부모 안에서만 자리를 명시한다.
74+
75+
- DEEP DIVE : 제거된 컴포넌트의 state를 보존하기
76+
- CSS로 가리기
77+
- state를 상위로 올리기
78+
- localStorage 이용하기
79+
80+
---
81+
82+
# 컴포넌트 import 및 export 하기
83+
84+
https://ko.react.dev/learn/importing-and-exporting-components
85+
86+
컴포넌트의 가장 큰 장점은 재사용성으로 컴포넌트를 조합하여 또 다른 컴포넌트를 만들 수 있다는 것이다. 분리할수록 나중에 파일을 찾기 더 쉽고 재사용이 편리해진다.
87+
88+
## Root 컴포넌트란
89+
90+
기본적으로는 App.js
91+
92+
Next.js 같은 경우는 페이지별로 root 컴포넌트가 다를 수 있다.
93+
94+
## 컴포넌트를 import, export 하는 방법
95+
96+
1. 컴포넌트를 추가할 js 파일 생성
97+
2. 새로만든 파일에서 함수 컴포넌트를 export
98+
99+
(default / named export)
100+
101+
3. 컴포넌트를 사용할 파일에서 import
102+
103+
(default / named export)
104+
105+
<aside>
106+
💡 Default 와 Named Exports
107+
default export 의 경우 한 파일에 하나만 존재,
108+
named export 는 여러개가 존재존재
109+
110+
export 방식에 따라 import 하는 방식이 정해져있다.
111+
112+
</aside>
113+
114+
---
115+
116+
# JSX로 마크업 작성하기
117+
118+
https://ko.react.dev/learn/writing-markup-with-jsx
119+
120+
JSX는 JavaScript를 화강한 문법으로 js파일을 HTML과 비슷하게 마크업을 작성할 수 있도록 해준다.
121+
122+
## JSX: JavaScript에 마크업 넣기
123+
124+
기존에는 HTML, JavaScript, CSS 를 따로 관리하였지만 웹이 더욱 인터렉티브해지면서 로직이 내용을 결정하고 스타일을 변경하는 경우가 많아졌다. 그렇기 때문에 React에서 렌더링 로직과 마크업이 같은 위치에 함께 있게된 이유이다.
125+
126+
<aside>
127+
💡 JSX는 확장된 문법, 독립적으로도 사용가능
128+
React는 JavaScript 라이브러리
129+
별개의 개념임을 인지하자!
130+
131+
</aside>
132+
133+
## JSX의 규칙
134+
135+
1. 하나의 루트 엘리먼트로 반환
136+
- JSXHTML처럼 보이지만 내부적으로는 일반 JavaScript 객체로 변환된다. 하나의 배열로 감싸지 않은 하나의 함수에서는 두개의 객체를 반환할 수 없다. 따라서 또 다른 태그나 Fragment로 감싸지 않으면 JSX 태그를 반환할 수 없다.
137+
2. 모든 태그는 닫아주기
138+
3. 거의 대부분 카멜 케이스로
139+
- class → className
140+
- aria-_, data-_ 는 대시 사용
141+
142+
---
143+
144+
# 중괄호가 있는 JSX 안에서 자바스크립트 사용하기
145+
146+
https://ko.react.dev/learn/javascript-in-jsx-with-curly-braces
147+
148+
## 따옴표로 문자열 전달하기
149+
150+
```jsx
151+
<img className="test" src={url} alt="..." />
152+
```
153+
154+
문자열을 따옴표, 큰따옴표
155+
156+
변수를 넣기 위해서는 중괄호를 사용한다
157+
158+
## 중괄호 사용하기: JavaScript 세계로 연결하는 창
159+
160+
JSX 내에서 JavaScript 를 사용하기위해 중괄호를 사용한다.
161+
162+
```jsx
163+
const TestComponent = () => {
164+
const name = "dasom";
165+
166+
const addZzang = (name) => {
167+
return name + "ZZANG";
168+
};
169+
return (
170+
<h1>
171+
{name} {addZzang(name)}
172+
</h1>
173+
);
174+
};
175+
```
176+
177+
## 중괄호를 사용하는 곳
178+
179+
- JSX 태그 안의 문자
180+
- = 바로 뒤에 오는 어트리뷰트
181+
182+
## 이중 중괄호 사용하기: JSXCSS와 다른 객체
183+
184+
```jsx
185+
<div style={{ color: "red" }} />
186+
```
187+
188+
<aside>
189+
💡 인라인 style 프로퍼티는 카멜 케이스로 작성된다.
190+
191+
</aside>
192+
193+
---
194+
195+
# 컴포넌트에 props 전달하기
196+
197+
https://ko.react.dev/learn/passing-props-to-a-component
198+
199+
react 컴포넌트는 props를 이용해 서로 통신한다. 모든 부모 컴포넌트는 props를 자식 컴포넌트에 정보를 전달해줄 수 있다.
200+
201+
props는 HTML 어트리뷰트를 생각나게 할 수도 있지만 객체나 배열, 함수 등 모든 JavaScript 값을 전달할 수 있다.
202+
203+
받아온 props는 컴포넌트에서
204+
205+
```jsx
206+
const TestComponent = ({ name, age }) => {};
207+
```
208+
209+
구조분해할당을 이용해서 명시할 수 있다.
210+
211+
### prop의 기본값 지정
212+
213+
```jsx
214+
const Test = ({ name = "dasom", age = "30" }) => {};
215+
```
216+
217+
### JSX spread 문법으로 props 전달
218+
219+
```jsx
220+
<Test {...props} />
221+
```
222+
223+
### 자식 컴포넌트를 JSX로 전달
224+
225+
```jsx
226+
const Test = ({ children }) => {
227+
return <div>{children}</div>;
228+
};
229+
```
230+
231+
### 시간에 따라 props가 변하는 방식
232+
233+
시간이나 상태를 이용해서 내려주는 props를 바로바로 적용시킬 수 있다.
234+
235+
<aside>
236+
💡 props는 컴퓨터 과학에서 “변경할 수 없다”라는 의미의 불변성을 가지고 있다. 자식 컴포넌트에서 부모 컴포넌트에서 받아온 props를 변경해야 하는 경우 부모 컴포넌트에 다른 props를 받도록 ‘요청’해야 한다.
237+
props 변경을 시도하지 말자. → state를 사용
238+
239+
</aside>

0 commit comments

Comments
 (0)