์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ๋ชจ๋ฐ์ผ์ฑํ๋ก๊ทธ๋๋ฐ
- ๋ฆฌ์กํธ๋ค์ดํฐ๋ธ
- ๊ทธ๋ฆฌ๋์๊ณ ๋ฆฌ์ฆ
- ํ๋ก ํธ์ค๋
- spring
- ๋ฐฑ์๋
- SSE
- ๋ฐฑ์ค1436
- ChatGPT
- ์๊ณ ๋ฆฌ์ฆ
- ์๋ฃ๊ตฌ์กฐ
- boj11653
- ๋จ์ํ ์คํธ
- ์ปด๊ณต
- ํ๋ก๊ทธ๋๋ฐ
- ๊ทธ๋ฆฌ๋
- ๋ฐฑ์ค
- ๊ฐ๋ฐ์
- ์ดํญ๊ณ์
- ์ฐ์ ์์ํ
- ์ฝ๋ฉํ ์คํธ
- ์ปดํจํฐ๊ณตํ
- ์น๊ฐ๋ฐ
- ์ฝ๋ฉ
- ๋ฆฌ์กํธ
- ๋ฐฑ์คํ์ด
- ์ปด๊ณต์
- ์น๊ฐ๋ฐ๊ธฐ๋ก
- ํ์ด์ฌ
- ์คํ๋ง
- Today
- Total
๐ป๐ญ๐ง๐
[React Native] 02-3. ์ปดํฌ๋ํธ์ ์์ฑ ์ดํดํ๊ธฐ ๋ณธ๋ฌธ
[React Native] 02-3. ์ปดํฌ๋ํธ์ ์์ฑ ์ดํดํ๊ธฐ
adorableco 2023. 8. 4. 04:322. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ธฐ๋ณธ ๋ค์ง๊ธฐ ์ค 02-3 ์ปดํฌ๋ํธ์ ์์ฑ ์ดํดํ๊ธฐ๋ฅผ ๊ณต๋ถํด๋ณด๊ฒ ์๋๋ค.
(์๊ฐ๋ณด๋ค ํ ๋ถ๋ถ ์ฑํฐ์ ์์ด ๋ง์์ ์ด๋ฒ ๊ธ๋ถํฐ ์ ๋ชฉ์ ์ฑํฐ๊ฐ ์๋ ์๋ธ ์ฑํฐ๋ก ๋ฐ๊พธ๊ธฐ๋ก ๊ฒฐ์ ...)
faker ์ธ๋ถ ํจํค์ง ์ค์นํ๊ธฐ
โก๏ธ ๊ฐ๋ฐ์ ํ์ํ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ํจํค์ง
npm i faker
npm i -D @types/faker
โป npm i faker ๋ก ํจํค์ง๋ฅผ ์ค์นํ ์ ์์ ๋
faker ํจํค์ง ์ ์์๊ฐ ํจํค์ง๋ฅผ ๊ณ ์์ ์ผ๋ก ์์์์ผ ๋์๋ค๊ณ ํ๋ค. (์์ธํ ์ด์ผ๊ธฐ๋ ๋ชจ๋ฅด๊ฒ ์)
๊ทธ๋์ ์๋์ ๊ฐ์ ์ฝ๋๋ก ๋ค๋ฅธ ๋ฒ์ ์ faker ํจํค์ง๋ฅผ ์ค์นํ๋ฉด ๋๋ค.
npm i -D faker@5
src/data/util.ts ํ์ผ์ ์๋์ ๊ฐ์ด ์์ฑ
export const makeArray = (length: number) => new Array(length).fill(null)
export const random = (min: number, max: number): number =>
Math.round(Math.random() * (max - min)) + min
export const unsplashUrl = (width: number, height: number): string =>
'https://source.unsplash.com/random/${width}x${height}'
export const avatarUriByName = (name: string) =>
'https://ui-avatars.com/api/?name=${name.split(" ").join("+")}'
โ unsplash.com : ํน์ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณต๋ฐ๋๋ค.
โ ui-avatars.com : ์ด๋ฆ์ ์ง์ ํ๋ฉด ์๋ฐํ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณต๋ฐ๋๋ค.
src/data/faker.ts ํ์ผ์ ์๋์ ๊ฐ์ด ์์ฑ
โก๏ธ faker ํจํค์ง์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๋๋คํ๊ฒ ์์ฑํ ์ ์๋ค.
import faker from 'faker'
import * as U from './util'
export const randomId = (): string => faker.datatype.uuid()
export const randomName = (): string => faker.name.findName()
export const randomEmail = (): string => faker.internet.email()
export const randomAvatarUrl = (name?: string): string =>
U.avatarUriByName(name ?? randomName())
export const randomDate = (): Date => faker.date.recent()
export const randomParagraphs = (count: number = 2): string =>
U.makeArray(count).map(faker.lorem.paragraph).join('\n')
export const randomImage = (): string =>
U.unsplashUrl(U.random(800, 800), U.random(800, 1000))
name ?? randomName() ์๋ฏธ : ์ฐ์ฐ์ ์์ ๋ณ์ซ๊ฐ(์ฌ๊ธฐ์์ name)์ด null ์ด๋ undefined ๋ผ๋ฉด ์ฐ์ฐ์ ๋ค์ ๊ฐ(์ฌ๊ธฐ์๋ randomName()) ์ ์ฌ์ฉํ๋ผ๋ ๋ป์ด๋ค.
โป faker ํจํค์ง ๋ฑ ์ฌ๋ฌ๊ฐ์ง ํจํค์ง๋ค์ด ์ธ์์ด ์๋๋ฉด์ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค๋ฉด
๋ชจ๋ 'faker'์ ๋ํ ์ ์ธ ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค. '/Users/parkseyeon/React-Native/ch02/ch02_3/node_modules/faker/index.js'์๋ ์์์ ์ผ๋ก 'any' ํ์์ด ํฌํจ๋ฉ๋๋ค.
ํด๋น ํญ๋ชฉ์ด ์๋ ๊ฒฝ์ฐ 'npm i --save-dev @types/faker'์(๋ฅผ) ์๋ํ๊ฑฐ๋, 'declare module 'faker';'์(๋ฅผ) ํฌํจํ๋ ์ ์ ์ธ(.d.ts) ํ์ผ ์ถ๊ฐ
โ d.ts ํ์ผ์ ๋ง๋ค์ด์ declare module '๋ชจ๋๋ช ' ์ ์์ฑํ๋ค.
src/data/createRandomPerson.ts ํ์ผ์ ์๋์ ๊ฐ์ด ์์ฑ
import type {IPerson} from './IPerson'
import * as F from './faker'
import * as U from './util'
export const createRandomPerson = (): IPerson => {
const name = F.randomName()
return {
id= F.randomId()
createDate: F.randomDate(),
modifiedDate: new Date,
name,
email: F.randomEmail(),
avatar: F.randomAvatarUrl(name),
image: F.randomImage(),
comments: F.randomParagraphs(4),
counts: {
comment: U.random(10,100),
retweet: U.random(10,100),
heart: U.random(100,1000)
}
}
}
src/data/index.ts ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ
// src/data ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ์ฌ์ฉํ๋ ์ฝ๋์ import๋ฌธ์ ๊ฐ๊ฒฐํ๊ฒ ํ๊ธฐ ์ํด์ ์์ฑ
export * from './util'
export * from './faker'
export * from './IPerson'
export * from './createRandomPerson'
๋ง์ง๋ง์ผ๋ก App.tsx ์๋
import React from 'react'
import {SafeAreaView, Text} from 'react-native'
import * as D from './src/data'
const person = D.createRandomPerson()
export default function App() {
return (
<SafeAreaView>
<Text>{JSON.stringify(person, null, 2)}</Text>
</SafeAreaView>
)
}
โ JSON.stringfy() ํจ์๋ฅผ ์ด์ฉํด ๋ฌธ์์ด๋ก ๋ณํํจ โก๏ธ JSON.stringfy(JSON ๋ฌธ์์ด๋ก ๋ณํํ Object, replacer ํจ์, JSON ๋ฌธ์์ด์ ๊ฐ๋ ์ฑ์ ์ํด ๊ณต๋ฐฑ์ ์ฝ์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ์นธ(๊ณต๋ฐฑ๋ฌธ์ ๊ฐ์))
์ฌ์ฉ์ ์ปดํฌ๋ํธ : User-defined component
- ํจ์ ์ปดํฌ๋ํธ(function component) ์ ํด๋์ค ์ปดํฌ๋ํธ(class component)๊ฐ ์๋ค.
ํด๋์ค ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
cd src
mkdir screens
touch screens/ClassComponent.tsx
cd ..
โ ๋ฆฌ์กํธ์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ํด๋์ค ์ปดํฌ๋ํธ๋ ๋ฐ๋์ Component ํด๋์ค(react ํจํค์ง์์ ์ ๊ณต)๋ฅผ ์์ํด์ผํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ ๊ตฌํ
import React, {Component} from 'react'
import {Text} from 'react-native'
import * as D from '../data'
const person = D.createRandomPerson()
export default class ClassComponent extends Component {
render() {
return <Text>{JSON.stringify(person, null, 2)}</Text>
}
}
โ ์ปดํฌ๋ํธ ์ ์ โก๏ธ ์ฆ ์ฝ์ด ํํฌ๋ํฐ๋ฅผ ํ๋ฉด์ ๋ ๋๋ง ํ๋ ์ผ
โก๏ธ ๊ทธ๋์ ํด๋์ค ์ปดํฌ๋ํธ์๋ render ๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๋ฃ์ด์ผ ํ๋ค.
ClassComponent.tsx
import React, {Component} from 'react'
import {Text} from 'react-native'
import * as D from '../data'
const person = D.createRandomPerson()
export default class ClassComponent extends Component {
render() {
return <Text>{JSON.stringify(person, null, 2)}</Text>
}
}
์ด๋ ๊ฒ ํ๋ฉด App.tsx ๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์๋ค.
App.tsx ์
import ClassComponent from './src/screens/ClassComponent'
๋ค์๊ณผ ๊ฐ์ด ClassComponent ๋ฅผ import ํด์ฃผ๋ฉด
<SafeAreaView>
<Text>{JSON.stringify(person, null, 2)}</Text>
</SafeAreaView>
<SafeAreaView>
<ClassComponent />
</SafeAreaView>
์์ ์ฝ๋๋ฅผ ์๋ ์ฝ๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์๋ค.
ํด๋์ค ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
- ๋ณดํต ์์ฑ์ด ์๋ ์ปดํฌ๋ํธ๋ function ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๊ณ , ์์ฑ์ด ์๋ค๋ฉด ํ์ดํ ํจ์๋ก ๋ง๋ ๋ค.
ArrowComponent.tsx
import React from 'react'
import {Text} from 'react-native'
import * as D from '../data'
const person = D.createRandomPerson()
const ArrowComponent = () => {
return <Text>{JSON.stringify(person, null, 2)}</Text>
}
export default ArrowComponent
โ ํด๋์ค ๋ฐฉ์ ์ปดํฌ๋ํธ์ render ๋ฉ์๋ == ํจ์ ๋ฐฉ์ ์ปดํฌ๋ํธ์ ํจ์ ๋ชธํต
์์ฑ์ด๋?
- ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ (member variable) ์ ์๋ฏธํ๋ค.
- ์์ฑ์ ๊ทธ ๊ฐ์ด ์์๋ก ๋ฐ๋ ์ ์๋ค. โก๏ธ ๋ฆฌ์กํธ์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ ๋ฐ๋ ์์ฑ๊ฐ์ ์ฆ๊ฐ ํ๋ฉด์ ๋ฐ์ํด์ผ ํ๋ค. ( = ์ฌ๋ ๋๋ง)
์์ฑ์ ์ฉ๋ : ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ ์ชฝ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
โ ํ์ ์คํฌ๋ฆฝํธ ์ปดํ์ผ ๋๋ง ํ์ํ ํ์ (ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ์ปดํ์ผ ๋๊ณ ๋๋ฉด ์ฌ๋ผ์ง๋ ๊ฒ)์ import type ๊ตฌ๋ฌธ์ผ๋ก ๊ตฌํํ๋ค.
ํ์ ์คํฌ๋ฆฝํธ๋ก ํจ์ ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
src/screens/Person.tsx
import React from 'react'
import type {FC} from 'react'
import * as D from '../data'
import {Text} from 'react-native'
export type PersonProps = {
person: D.IPerson
}
const Person: FC<PersonProps> = ({person}) => {
return <Text>{JSON.stringify(person, null, 2)}</Text>
}
export default Person // ๋ด๋ณด๋ด๊ธฐ
์ฌ๊ธฐ์ ๋ฌธ๋ฉ... ๋ด๊ฐ ํ์ดํ ํจ์์ ๋ํด์ ์ ๋ชจ๋ฅด๊ตฌ๋ ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
const ๋ณ์๋ช
: (๋งค๊ฐ๋ณ์๋ช
= ์๋ฃํ) => {
์ฒ๋ฆฌ๊ตฌ๋ฌธ
}
๋ผ๊ณ ํ๋ค. ์์ ์ฝ๋์ ์ ์ฉํด๋ณด๋ฉด FC<PersonProps> ๊ฐ ๋งค๊ฐ๋ณ์์ด๋ฉฐ ์ด์ ์๋ฃํ์ {person} ์ธ ๊ฒ์ด๋ค.
ScrollView ์ฝ์ด ์ปดํฌ๋ํธ์ Key ์์ฑ
์ฝ์ด ์ปดํฌ๋ํธ (Core Component) : React Native App์ ๊ตฌ์ฑ์์๋ฅผ ๋ปํ๋ฉฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ๋จ์
โ Person ์ปดํฌ๋ํธ๋ฅผ ScrollView์ ์์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค๋ฉด ScrollView๊ฐ ์ ๊ณตํ๋ ์คํฌ๋กค ๊ธฐ๋ฅ์ ์ด์ฉํด ๋ชจ๋ Person ์ปดํฌ๋ํธ๋ฅผ ๋ณผ ์ ์๋ค.
ScrollView ๋ฅผ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import React, {Children, Component} from 'react'
import {SafeAreaView, ScrollView, Text} from 'react-native'
import Person from './src/screens/Person'
import * as D from './src/data'
const people = D.makeArray(100).map(D.createRandomPerson)
export default function App() {
const children = people.map(person => (
<Person key={person.id} person={person} />
))
return (
<SafeAreaView>
<ScrollView>{children}</ScrollView>
</SafeAreaView>
)
}
<Person key={person.id} person={person} /> ์์ key = {person.id} ๋ ๋ ๋๋ง ์๋๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ๋ชจ๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ๋ถํ ์ ์๋๋ก ํค๊ฐ์ ๋ถ์ฌํ๋ ๊ฒ์ด๋ค.
โก๏ธ person.id ๋ faker.datatype.uuid() ๋ก ์์ฑํ ๊ฐ์ด๋ค. (uuid : universally unique identifier)
'๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์ฑ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React Native] 03-2 View ์ปดํฌ๋ํธ์ CSS ๋ฐ์ค ๋ชจ๋ธ (0) | 2023.08.07 |
---|---|
[React Native] 03-1 style ์์ฑ๊ณผ StyleSheet API ์ดํดํ๊ธฐ (0) | 2023.08.05 |
[React Native] 02-4 ์ปดํฌ๋ํธ์ ์ด๋ฒคํธ ์์ฑ ์ดํดํ๊ธฐ (0) | 2023.08.05 |
[React Native] 02. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ธฐ๋ณธ ๋ค์ง๊ธฐ -1 (0) | 2023.08.02 |
[React Native] 01. ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ๊ฐ๋ฐ ํ๊ฒฝ ๊ฐ์ถ๊ธฐ (0) | 2023.08.01 |