An open API service indexing awesome lists of open source software.

https://github.com/ssi02014/react-native-tutorial


https://github.com/ssi02014/react-native-tutorial

Last synced: 8 months ago
JSON representation

Awesome Lists containing this project

README

          

# ๐Ÿ’ป React-Native-Tutorial
### React-Native-Tutorial ์ €์žฅ์†Œ


## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป React-native ๋‚ด์žฅ ์ปดํฌ๋„ŒํŠธ
๐Ÿ”– https://reactnative.dev/docs/components-and-apis

### ๐Ÿƒ Basic Components
- View: UI ๊ตฌ์ถ•์„ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ
- Text: ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ
- Image: ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ
- TextInput: ํ‚ค๋ณด๋“œ๋ฅผ ํ†ตํ•ด ์•ฑ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ
- ScrollView: ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ๋ณด๊ธฐ๋ฅผ ํ˜ธ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํฌ๋กค ์ปจํ…Œ์ด๋„ˆ
- StyleSheet: CSS ์Šคํƒ€์ผ ์‹œํŠธ์™€ ์œ ์‚ฌํ•œ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ณต


### ๐Ÿƒ User Interface
- Button: ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•˜๋Š” ํ„ฐ์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ฒ„ํŠผ ๊ตฌ์„ฑ ์š”์†Œ
- Switch: Boolean ์ž…๋ ฅ์„ ๋ Œ๋”๋งํ•œ๋‹ค


### ๐Ÿƒ List Views
- FlatList: ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ
- SectionList: FlatList์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ Section ๋ชฉ๋ก์— ์‚ฌ์šฉ๋œ๋‹ค.


### ๐Ÿƒ Android Components and APIs
- BackHandler: ๋’ค๋กœ ํƒ์ƒ‰์„ ์œ„ํ•œ ํ•˜๋“œ์›จ์–ด ๋ฒ„ํŠผ ๋ˆ„๋ฆ„์„ ๊ฐ์ง€
- DrawerLayoutAndroid: DrawerLayoutAndroid์—์„œ ๋ Œ๋”๋งํ•œ๋‹ค.
- PermissionsAndroid: Android M์— ๋„์ž… ๋œ ๊ถŒํ•œ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์—‘์„ธ์Šค๋ฅผ ์ œ๊ณต
- ToastAndroid: Android Toast ์•Œ๋ฆผ์„ ๋งŒ๋“ ๋‹ค.


### ๐Ÿƒ iOS components and APIs
- ActionsSheetIOS: iOS ์ž‘์—… ์‹œํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์‹œํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” API


### ๐Ÿƒ Others
- ActivityIndicator: ์›ํ˜• ๋กœ๋”ฉ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
- Alert: ์ง€์ •๋œ ์ œ๋ชฉ๊ณผ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ๊ณ  ๋Œ€ํ™” ์ƒ์ž๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
- Animated: ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
- Dimensions: ์žฅ์น˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
- KeyboardAvoidingView: ๊ฐ€์ƒ ํ‚ค๋ณด๋“œ์—์„œ ์ž๋™์œผ๋กœ ๋ฒ—์–ด๋‚˜๋Š” ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
- Linking: ์ˆ˜์‹  ๋ฐ ๋ฐœ์‹  ์•ฑ ๋งํฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
- Modal: Modal ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
- PixelRatio: ์žฅ์น˜ ํ”ฝ์…€ ๋ฐ€๋„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
- RefreshControl: ScrollView pull, refresh ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
- StatusBar: ์•ฑ ์ƒํƒœ ํ‘œ์‹œ ์ค„์„ ์ œ์–ดํ•˜๋Š” ๊ตฌ์„ฑ์š”์†Œ์ด๋‹ค.


## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป prop-types ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
- props๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ, ์ž˜๋ชป๋œ ํƒ€์ž…์„ ์ „๋‹ฌํ–ˆ์„ ๋•Œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

```javascript
MyButton.propTypes = {
//title์€ string์ด์—ฌ์•ผ ํ•˜๋ฉฐ, ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
//onPress๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
title: PropTypes.string.isRequired,
onPress: PropTypes.func.isRequired,
};

```


## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป JSX์—์„œ if๋ฌธ ์‚ฌ์šฉ
- JSX๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด์•ผ์ง€ if๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

```javascript

{(() => {
if(name === 'Minjae') return 'My name is Minjae';
else return 'My First React Native';
})()}

```


## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป press ์ด๋ฒคํŠธ
- onPressIn: ํ„ฐ์น˜๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ˜ธ์ถœ
- onPressOut: ํ„ฐ์น˜๊ฐ€ ํ•ด์ฒด๋  ๋•Œ ํ˜ธ์ถœ
- onPress: ํ„ฐ์น˜๊ฐ€ ํ•ด์ฒด ๋  ๋•Œ onPressOut ์ดํ›„ ํ˜ธ์ถœ
- onLongPress: ํ„ฐ์น˜๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ ์ง€์†๋˜๋ฉด ํ˜ธ์ถœ

![press](https://user-images.githubusercontent.com/64779472/113672119-43e0f380-96f2-11eb-995f-02f28a464c18.PNG)

```javascript

```

## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป change ์ด๋ฒคํŠธ
- ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” change ์ด๋ฒคํŠธ๋Š” TextInput ์ปดํฌ๋„ŒํŠธ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
- event๊ฐ์ฒด์˜ **nativeEvent.text** ๋ฅผ ์‚ฌ์šฉํ•ด์„œ text ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
- onChangeText: ์ปดํฌ๋„ŒํŠธ์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ, ๋ณ€๊ฒฝ ๋œ ํ…์ŠคํŠธ์˜ ๋ฌธ์ž์—ด๋งŒ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉฐ ํ˜ธ์ถœ๋œ๋‹ค.
```javascript
const _onChange = e => {
setText(e.nativeEvent.text);
}

const _onChangeText = text => {
setText(text);
}


```

## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Pressable ์ปดํฌ๋„ŒํŠธ
- ๊ธฐ์กด์˜ TouchableOpacity ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” Pressable ์ปดํฌ๋„ŒํŠธ.
- HitReact: ๋ฒ„ํŠผ ๋ชจ์–‘๋ณด๋‹ค ์•ฝ๊ฐ„ ๋–จ์–ด์ง„ ๋ถ€๋ถ„๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” pressable์˜ ๊ธฐ๋Šฅ
- PressRect: ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ์ƒํƒœ์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€์–ด์ ธ์•ผ ์œ ํšจ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚ฌ๋‹ค๊ณ  ํŒ๋‹จ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ

![pressable](https://user-images.githubusercontent.com/64779472/113674464-2e20fd80-96f5-11eb-816f-3e5876257834.PNG)

```javascript
import { Text, Pressable } from 'react-native';


{props.title}

```

## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ํด๋ž˜์Šค ์Šคํƒ€์ผ๋ง(์—ฌ๋Ÿฌ๊ฐœ ์Šคํƒ€์ผ๋ง ์ ์šฉ)
- ํด๋ž˜์Šค ์Šคํƒ€์ผ๋ง์€ ์ปดํฌ๋„ŒํŠธ์˜ ํƒœ๊ทธ์— ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, ์Šคํƒ€์ผ์‹œํŠธ์— ์ •์˜๋œ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

```javascript
//์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํƒ€์ผ ์ ์šฉ1, ๋’ค์— ์˜ค๋Š” ์Šคํƒ€์ผ์ด ์•ž์— ์žˆ๋Š” ์Šคํƒ€์ผ์„ ๋ฎ์Œ
Class Style-Error

//์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํƒ€์ผ ์ ์šฉ2
Class Style-Text
```

## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Platform
- Platform ๋ชจ๋“ˆ์„ ํ†ตํ•ด์„œ ๊ฐ ํ”Œ๋žซํผ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์ ์šฉ๋˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
- iOS์—์„œ shadow๋Š” shadowColor(์ƒ‰), shadowOffset(๊ฑฐ๋ฆฌ), shadowOpacity(๋ถˆํˆฌ๋ช…๋„), shadowRadius(ํ๋ฆ„ ๋ฐ˜๊ฒฝ) ๋“ฑ์˜ ์Šคํƒ€์ผ ์†์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
- Android์—์„œ๋Š” elevation ์ด๋ผ๋Š” ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

![platform](https://user-images.githubusercontent.com/64779472/113681358-d5edf980-96fc-11eb-8f82-f57ec6bc503f.PNG)

```javascript
const styles = StyleSheet.create({
shadow: {
...Platform.select({
ios: {
shadowColor: '#000',
shadowOffset: {
width: 10,
height: 10,
},
shadowOpacity: 0.5,
shadowRadius: 10,
},
android: {
elevation: 20,
}
}),
},
});
```

## ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ(Styled-components) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๐Ÿ”– https://styled-components.com/

### ๐Ÿƒ ๊ธฐ๋ณธ์ ์ธ Styled-components
- ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์Šคํƒ€์ผ์—์„œ ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ์˜ ์ฐจ์ด๋กœ ์ดํ•œ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œ์‹œ์ผœ ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
- **styled.[์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„]** ํ˜•ํƒœ ๋’ค์— ๋ฐฑํ‹ฑ(`)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๋ฌธ์ž์—ด์„ ๋ถ™์ด๊ณ  ๊ทธ ์•ˆ์— ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ•์„ **ํƒœ๊ทธ๋“œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด(Tagged Template Literals)** ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

```javascript
//์Šคํƒ€์ผ ์ ์šฉ ์˜ˆ์‹œ
const Container = styled.View`
flex: 1;
background-color: #fff;
align-items: center;
justify-content: center;
`;
```

### ๐Ÿƒ Styled-components์— props ์‚ฌ์šฉํ•˜๊ธฐ
- Styled-components ์—์„œ๋Š” ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฒกํ„ฐ ์•ˆ์—์„œ props์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์žฅ์ ์„ ์ด์šฉํ•ด ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณณ์—์„œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

![props](https://user-images.githubusercontent.com/64779472/113683601-5a417c00-96ff-11eb-8f2f-fd64cf273c56.PNG)

```javascript
const ButtonContainer = styled.TouchableOpacity`
background-color: ${props => props.title === 'Minjae' ? '#3498db' : '#9b59b6'};
border-radius: 15px;
padding: 15px 40px;
margin: 10px 0px;
justify-content: center;
`;

const Button = ({ title }) => {
return (

{title}

);
};
```

### ๐Ÿƒ Styled-components์— attrs ์‚ฌ์šฉํ•˜๊ธฐ
- attrs๋Š” Styled-components์—์„œ ์†์„ฑ์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

![attrs](https://user-images.githubusercontent.com/64779472/113809631-80b8f300-97a3-11eb-9164-94c531acb1c7.PNG)

```javascript
//components/Input.js
const StyledInput = styled.TextInput.attrs(props => ({
placeholder: 'Enter a text...',
placeholderTextColor: props.borderColor,
}))`
(...)
border-color: ${props => props.borderColor};
`;

const Input = ({borderColor}) => {
return (

)
}

//App.js


```