1. 컴포넌트의 종류
1.1 클래스형 컴포넌트
- class 키워드 필요
- Component로 상속 받아야 함
- render() 메소드 반드시 필요
- state, lifeCycle 관련 기능 사용 가능
- 함수형보다 메모리 자원을 더 사용
1/**2* 클래스형 컴포넌트3*/4class FriendList extends React.Component {5render() {6return (7<View>8<Friend name="뭐시기1" />9<Friend name="뭐시기2" />10<Friend name="뭐시기3" />11<Friend name="뭐시기4" />12<Friend name="뭐시기5" />13<Friend name="뭐시기6" />14</View>15)16}17}
1.2 함수형 컴포넌트
- state, lifeCycle 관련 기능 사용 불가능 -> hook으로 해결
- 클래스형보다 메모리 자원을 덜 사용
- 컴포넌트 선언이 편함
- 공식문서에서도 함수형 컴포넌트 + hook 사용을 권장
1/**2* 함수형 컴포넌트3*/4const Friend = props => {5return <Text>{props.name}</Text>6}78export default () => {9return (10<View>11<Friend name="뭐시기1" />12<Friend name="뭐시기2" />13<Friend name="뭐시기3" />14<Friend name="뭐시기4" />15<Friend name="뭐시기5" />16<Friend name="뭐시기6" />17</View>18)19}
2. Hooks
2.1 useState
1import React, { useState } from 'react'2import { View, Text, Button, Switch, TextInput } from 'react-native'34const Component = () => {5const [count, setCount] = useState(0) // number6const [isOn, setIsOn] = useState(false) // boolean7const [name, setName] = useState('') // string89return (10<View>11<Text>You clicked {count} times</Text>12<Button title="Click me" onPress={() => setCount(count + 1)} />1314<Text>-------</Text>15<Switch16value={isOn}17onValueChange={v => {18console.log('v', v)19setIsOn(v)20}}21/>2223<Text>-------</Text>24<TextInput25value={name}26onChangeText={v => {27console.log('v', v)28setName(v)29}}30/>31</View>32)33}3435export default Component
2.2 useEffect
1import React, { useEffect, useState } from 'react'2import { View, Text, Button, TextInput, Switch, ActivityIndicator } from 'react-native'34const Component = () => {5const [count, setCount] = useState(0)6const [isOn, setIsOn] = useState(true)7const [input, setInput] = useState('')8const [isRefresh, setIsRefresh] = useState(false)910useEffect(() => {11console.log('didMount')12}, [])1314useEffect(() => {15console.log('didUpdate - count', count)16}, [count])1718useEffect(() => {19console.log('didUpdate - isOn', isOn)20}, [isOn])2122useEffect(() => {23console.log('didUpdate - input', input)24}, [input])2526useEffect(() => {27// 2초 동안 true인 isRefresh를 유지하다 false로 변경28if (isRefresh) {29setTimeout(() => {30setIsRefresh(false)31}, 2000)32}33}, [isRefresh])3435return (36<View style={{ alignItems: 'center' }}>37<Text>You clicked {count} times</Text>38<Button title="Click me" onPress={() => setCount(count + 1)} />3940<Text style={{ marginVertical: 15 }}>-------------------------------------------------</Text>41<Switch value={isOn} onValueChange={setIsOn} />4243<Text style={{ marginVertical: 15 }}>-------------------------------------------------</Text>4445<Text>input: {input}</Text>46<TextInput value={input} onChangeText={setInput} style={{ borderBottomWidth: 1, borderColor: 'grey' }} />4748<Text style={{ marginVertical: 15 }}>-------------------------------------------------</Text>49<Button50title="새로고침!"51onPress={() => {52setIsRefresh(true)53}}54/>55{isRefresh && <ActivityIndicator />}56</View>57)58}5960export default Component
2.3 커스텀 hooks
1import React, { useState } from 'react'2import { Button, TextInput, View } from 'react-native'34const InputBox = props => {5return (6<View style={{ flexDirection: 'row' }}>7<TextInput8value={props.value}9onChangeText={props.onChangeText}10style={{ borderBottomWidth: 1, width: 200 }}11placeholder={props.placeholder}12/>13<Button title="초기화" onPress={props.onReset} />14</View>15)16}1718const useInput = initialValue => {19const [value, setValue] = useState(initialValue)2021const resetValue = () => setValue(initialValue)2223return {24value,25setValue,26resetValue,27}28}2930const CustomHook = () => {31const { value: name, setValue: setName, resetValue: resetName } = useInput('')32const { value: age, setValue: setAge, resetValue: resetAge } = useInput('')33const { value: city, setValue: setCity, resetValue: resetCity } = useInput('')3435return (36<View>37<InputBox value={name} onChangeText={setName} placeholder="이름을 입력해 주세요" onReset={resetName} />38<InputBox value={age} onChangeText={setAge} placeholder="나이를 입력해 주세요" onReset={resetAge} />39<InputBox value={city} onChangeText={setCity} placeholder="사는 곳을 입력해 주세요" onReset={resetCity} />40</View>41)42}4344export default CustomHook