Skip to content

ssi02014/React-Native-Tutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

16 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ’ป 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๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ, ์ž˜๋ชป๋œ ํƒ€์ž…์„ ์ „๋‹ฌํ–ˆ์„ ๋•Œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    MyButton.propTypes = {
        //title์€ string์ด์—ฌ์•ผ ํ•˜๋ฉฐ, ํ•„์ˆ˜๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
        //onPress๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
        title: PropTypes.string.isRequired,
        onPress: PropTypes.func.isRequired,
    };

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป JSX์—์„œ if๋ฌธ ์‚ฌ์šฉ

  • JSX๋Š” ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด์•ผ์ง€ if๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    <Text>
        {(() => {
            if(name === 'Minjae') return 'My name is Minjae';
            else return 'My First React Native';
        })()}
    </Text>

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป press ์ด๋ฒคํŠธ

  • onPressIn: ํ„ฐ์น˜๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ˜ธ์ถœ
  • onPressOut: ํ„ฐ์น˜๊ฐ€ ํ•ด์ฒด๋  ๋•Œ ํ˜ธ์ถœ
  • onPress: ํ„ฐ์น˜๊ฐ€ ํ•ด์ฒด ๋  ๋•Œ onPressOut ์ดํ›„ ํ˜ธ์ถœ
  • onLongPress: ํ„ฐ์น˜๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ์ด์ƒ ์ง€์†๋˜๋ฉด ํ˜ธ์ถœ

press

    <TouchableOpacity
        onPressIn={_onPressIn}
        onLongPress={_onLongPress}
        onPressOut={_onPressOut}
        onPress={_onPress}
        //3์ดˆ๋™์•ˆ ํด๋ฆญํ•ด์•ผ onLongPress๊ฐ€ ํ˜ธ์ถœ
        delayLongPress={3000}
    >

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป change ์ด๋ฒคํŠธ

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

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

    <TextInput 
        style={{borderWidth: 1, padding: 10, fontSize: 20}}
        placeholder="Enter a Text..."
        // onChange={_onChange}
        onChangeText={_onChangeText}
    />

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Pressable ์ปดํฌ๋„ŒํŠธ

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

pressable

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

    <Pressable
        pressRetentionOffset={{bottom:50, left: 50, right: 50, top: 50,}}
        hitSlop={50}
    >
        <Text style={{padding:10, fontSize:30}}>{props.title}</Text>
    </Pressable>

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป ํด๋ž˜์Šค ์Šคํƒ€์ผ๋ง(์—ฌ๋Ÿฌ๊ฐœ ์Šคํƒ€์ผ๋ง ์ ์šฉ)

  • ํด๋ž˜์Šค ์Šคํƒ€์ผ๋ง์€ ์ปดํฌ๋„ŒํŠธ์˜ ํƒœ๊ทธ์— ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, ์Šคํƒ€์ผ์‹œํŠธ์— ์ •์˜๋œ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    //์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํƒ€์ผ ์ ์šฉ1, ๋’ค์— ์˜ค๋Š” ์Šคํƒ€์ผ์ด ์•ž์— ์žˆ๋Š” ์Šคํƒ€์ผ์„ ๋ฎ์Œ
    <Text style={[styles.text, styles.error]}>Class Style-Error</Text>

    //์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํƒ€์ผ ์ ์šฉ2
    <Text style={[styles.text, {color: 'green'}]}>Class Style-Text</Text>

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป Platform

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

platform

    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) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    //์Šคํƒ€์ผ ์ ์šฉ ์˜ˆ์‹œ
    const Container = styled.View`
        flex: 1;
        background-color: #fff;
        align-items: center;
        justify-content: center;
    `;

๐Ÿƒ Styled-components์— props ์‚ฌ์šฉํ•˜๊ธฐ

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

props

    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 (
            <ButtonContainer title={title}>
                <Title>{title}</Title>
            </ButtonContainer>
        );
    };

๐Ÿƒ Styled-components์— attrs ์‚ฌ์šฉํ•˜๊ธฐ

  • attrs๋Š” Styled-components์—์„œ ์†์„ฑ์„ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

attrs

    //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 (
            <StyledInput borderColor={borderColor} />
        )
    }

    //App.js
    <Input borderColor='#3498db'></Input>
    <Input borderColor='#9b59b6'></Input>

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published