https://github.com/action-intent/ReactNative/tree/master/Todo

* 예제를 바로 받아서 빌드 하실 때는 index.js의 진입점(App.js)를 './Todo/App' 으로 변경하고 진행하세요

 

본 포스팅은 위 링크에서 코드를 받으시고 코드와 함께 보시면서 이해하면 좋습니다.

 

요번엔 책에서 소개하는 간단한 할 일 관리 서비스를 만들어 봅니다. 

 

 Heading, Input, TodoList, Button, TabBar의 Component 지향 개발을 적용합니다. 

 

1. App.js로 Main component를 생성

- keyboardShoudPersistTaps='always'

ScrollView의 속성으로 키보드를 닫고 화면에서 onPress이벤트를 받을 수 있도록 합니다.

- style 속성 중 flex:1의 경우 상위 컨테이너의 영역 전체를 채우도록 함(match_parent와 비슷)

 

2. index.js를 수정하여 진입점을 1에서 생성한 App.js가 되도록 수정

 

3. Heading.js로 Heading component(stateless) 생성하여 todos 타이틀을 생성

-  stateless의 경우 const로 생성하는 방식을 기억하자

- style 속성 중 color , fontWeight를 참고하자

 

4. App.js의 render내에 Heading component를 가져와 타이틀이 표시되도록 한다.

 

5. Input.js로 텍스트 입력 Component를 생성

- TextInput의 placeholder 속성은 텍스트 입력 전 보여주는 문구

- selectionColor는 커서의 색을 변경

 

개발자 메뉴 열기

console.log()를 통해 디버깅 하기 위한 내장 메뉴 

 

 

 

 

 

 

 

emulator에서

iOS : Cmd + D

android : Cmd + M

 

Inspector : 요소의 스타일 조사

Perf Monitor : RAM, 성능 관련 정보

* Debug를 눌러 크롬의 개발자 도구를 통해 디버깅이 가능하도록 한다.

 

 

 

 

 

 

 

6. Input과 App 연결

 

Input.js

const Input = ({inputValue, inputChange}) => (  ... )

- props로 inputValue(입력값)과 inputChange(입력 시 호출 함수)를 받는다.

onChangeText={inputChange}

- TextInput의 속성으로 onChangeText가 호출 될 때 props 함수인 inputChange가 호출 되도록 한다.

 

App.js

inputChange(inputValue) { }

- 콘솔을 통해 입력값을 확인할 수 있도록 하고 state의 inputValue를 수정

- 아래 코드를 통해 Input.js를 가져다 쓰면서 props를 전달

<Input
	inputValue={inputValue}
	inputChange={(text) => this.inputChange(text)} />

 

 

 

 

 

 

 

 

 

실행 결과 화면

TextInput에 입력 할 때 마다 아래 크롬 개발자 도구에 로그가 찍히는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7. Submit button

 

App.js에 submit 버튼, 메서드 추가

import Button from './Button'
let todoIndex = 0
...
submitTodo() {
        if(this.state.inputValue.match(/^\s*$/)) { //inputValue가 비어있는 경우
            return
        }
        const todo = {  //todo item 생성
            title: this.state.inputValue,
            todoIndex,
            complete: false
        }
        todoIndex++
        const todos = [...this.state.todos, todo]   //새로 생성한 todo item을 todos state에 추가
        this.setState({ todos, inputValue: ''}, () => { //state를 갱신하고 콜백 함수로 로그를 남긴다.
            console.log('State: ', this.state)
        })
    }

Button.js 생성(stateless) : TouchableHighlight

- underlayColor는 눌렸을때 배경색

- submitTodo 메서드를 구조 분해 할당

- onPress={submitTodo} 버튼을 누르면 부모의 메서드 작동

 

App.js에 Button 추가

- this.submitTodo = this.submitTodo.bind(this) 생성자의 메서드 변수에 바인딩

- <Button submitTodo={this.submitTodo} /> Button component 추가

 

 

 

 

 

 

 

Text를 입력하고 Submit을 누르면 InputText가 비워지고 개발자 콘솔에 추가된 todo 정보가 출력된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

'React native' 카테고리의 다른 글

Style  (0) 2019.12.27
Todo 2  (0) 2019.12.25
State, Props, Lifecycle  (0) 2019.12.25
Project 생성 및 빌드  (0) 2019.12.25
React native intro  (0) 2019.12.25

이제 기본적인 프로젝트를 생성 및 빌드 할 수 있도록 개발 환경을 조성해보자.

 

http://facebook.github.io/react-native/docs/getting-started

 

React Native · A framework for building native apps using React

A framework for building native apps using React

facebook.github.io

기본적인 프로젝트 생성은 위 공식 가이드를 따르도록 한다. (React Native CLI 탭에서 참고)

-> 어떤 플랫폼에서(윈도우, 맥) 개발할 건지, 어느 플랫폼에서(안드로이드, iOS) 실행할 건지 골라서 필요한 툴을 모두 설치 하도록 하자

-> 혹시 제대로 진행이 되지 않는다면 가이드에서 얘기하는 툴들의 최소 버전 등을 잘 확인하자

(영어는 잘 못 읽어도 숫자는 비교 할 수 있지 않은가)

 

* 본인은 맥 유저임에 따라 iOS 베이스로 설치

 

1. npm(node package manager) 설치가 선행 되어야 함

* watchman : react native에서 사용하는 파일 감시도구

2. Xcode(CLI, simulator, cocoapods) 설치

* 안드로이드의 경우 jdk, android studio (sdk, path설정) 등의 과정이 필요

3. 프로젝트 생성 > npx react-native init AwesomeProject

4. 프로젝트 시작 > 프로젝트 폴더 이동 후 > npx react-native run-ios

* 안드로이드의 경우 npx react-native run-android

5. Editor의 경우 Brackets을 사용하는데 더 좋은 툴이 있으면

 

* Mac에서 phones sdk관련 오류가 날 경우

sudo xcode-select --switch /Applications/Xcode.app

Pod install

 

위 설치 가이드 3번을 실행하면 해당 폴더에 아래 기본 파일이 있습니다. 

index.js (앱의 진입 포인트 : 안드로이드의 application class)

App.js ( 메인 : 안드로이드의 main activity)

 

설치 가이드 4번 프로젝트 실행을 통해 아래와 같은 결과 화면을 확인할 수 있습니다. 

* 새로운 프로젝트를 실행 시 꼭 새로운 emulator를 실행해 주시기 바랍니다. 

 

앞으로 진행되는 포스팅의 예제 코드는 아래 github을 참고하시길 바랍니다.

https://github.com/action-intent/ReactNative

 

github 코드를 땡기신 후 프로젝트에 필요한 모듈들을 설치해야 합니다. 

프로젝트 폴더로 이동 후 npm i 명령을 통해 npm모듈들을 자동으로 설치해 주도록 합니다.

* 설치되는 모듈의 목록은 package.json 파일에 있습니다. 참고하세요.

 

'React native' 카테고리의 다른 글

Todo 1  (0) 2019.12.25
State, Props, Lifecycle  (0) 2019.12.25
React native intro  (0) 2019.12.25
첫 애플리케이션 만들기  (0) 2019.04.14
React native 설치  (0) 2019.04.14

한참 안드로이드 개발을 할 때 하이브리드 앱이라는 개념을 접했고 당시 크로스 플랫폼을 지원하는 프레임웤을 사용하여 테스트 앱을 만들어보고 발전 가능성의 한계를 느꼈던 시절이 있었습니다. 

 

그리고 몇년만에 React native라는 녀석을 다시 접하면서 하이브리드 앱에 대한 관심이 다시 생겼네요.

 

Facebook이 개발, 다양한 서비스 업체가 지원하고 있으며 종종 관련 기술 경험자를 찾는 회사도 보입니다. 

 

고 차원의 플렛폼 의존도가 높은 서비스가 아닌 데이터 인입 차원의 서비스라면 네이티브 개발을 대신하는 좋은 방안이 될 것으로 보입니다. 

 

https://www.manning.com/books/react-native-in-action

 

React Native in Action

Learn how to utilize your existing JavaScript skills to create rich cross-platform mobile apps.

www.manning.com

본 포스팅은 위 책을 베이스로 진행 할 예정입니다. React native 초기(2017년?)에 발간된 책을 처음 봤었는데 이미 많은 업데이트가 진행되어 설치부터 수 많은 삽질을 하다가 나가 떨어진 기억이 있습니다. 

* 특히 보편화되지 않은 기술에 대한 책을 고를땐 되도록 최신 발간된 것을 참고하고 공식 사이트를 통해 영어 공부?도 병행하심이..

https://lowcrash.tistory.com/23?category=783777 (옛 삽질의 흔적)

 

  iOS(Object C or Swift), Android(Java or Kotlin)을 따로 개발 할 필요 없다.

React native의 경우 기존 하이브리드 앱(웹 뷰 렌더링) 프레임워크와 달리 컴파일을 통해 자바스크립트 코드를 네이티브 코드로 변환하여 고성능 하이브리브 앱을 개발할 수 있다.

- iOS, Android 개발자가 따로 필요하지 않다

- 빌드가 빠르다. 코드 수정 후 저장하면 바로 결과 화면에 반영된다.

 

Component : 가장 중요한 키워드로 앱을 구성하는 조립 블럭 (stateful(속성 값이 있는), stateless(재사용)로 구분)

 

* React native의 기본적인 code snippet (주석 부분만 보고 넘어가자)

import React, { Component } from 'react'  // 1. react library에서 React와 Component를 가져온다.
import {
  AppRegistry,
  StyleSheet,
  View,
  Text
} from 'react-native' // 2. 다양한 UI component를 가져온다.
import API from './api' // 3. import other component

class blankRNApp extends Component {
  constructor () {
    super()
    this.state = { name: 'chris' }  //stateful
  }
  componentDidMount () { // 4. last method of lifecycle
    API.getName().then((data) => {
      this.setState({ name: data })  // 5. call render() 
    })
  }
  render () { // 6. rendering
    return ( //render must return native item or null or false
        <View> // JSX

            <Text> Hello there, {this.state.name} </Text>

        </VIew>
    )
  }
}

const styles = StyleSheet.create({ // 7. style 선언
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF'
  }
})

 

Lifecycle method : constructor, componentDidMount, render 등 클래스가 생성되면서 실행되는 일련의 메소드

 

CLI, npm, Xcode, ES2015, MVC, SPA... 알고 있으면 좋지만 필수는 아니다.. 어쩌란 말인가..

(e.g. : ES2015에서는 const 대신 import를 사용)

 

JSX : XML 처럼 보이는 자바스크립트 구문 확장 (e.g. : <Text> Hello </Text> )

React : 기존 DOM 처리 방식에서 in memory DOM을 통해 필요 부분만 갱신하여 성능 향상

Bridge : 리액트-네이티브 계층과의 통신 채널

단방향 데이터 흐름 : 최상위 컴퍼넌트의 데이터가 변경되면 자식 컴포넌트는 props로 변경된 데이터를 전달 받고 갱신됨

hot reloading : 개발시 변경된 부분만 빠르게 반영

transpilation : transpiler(바벨)가 특정 언어로 작성된 코드를 다른 언어로 변환. 언어의 최신 기능 사용

 

Custom component 만들기(기본)

class Home extends Component { ... }

-> import한(위 code snippet 주석 1) Component(객체 구조 분해 할당)를 상속하여 Home instance 생성

 

Render 함수

다른 함수의 실행

Exports

export default Home

-> 다른 Component에서 Home을 사용하려고 할 때

 

Stateless Component

const Header = () => (

    <View>

        <Text>HEADER</Text>

    </View>

)   

-> render() { ... <HEADER /> } 이런식으로 다른 component에서 재사용 가능

 

이것으로 React native의 기본적인 개념은 정리?를 하였고 다음 포스팅에서는 기본 프로젝트를 돌려보겠습니다.

* 본 포스팅에서 Bold된 내용은 꼭 숙지해 주세요. 새로운 개념을 익힐때는 그 안에서 사용하는 키워드에 익숙해지는게 1순위 입니다.

'React native' 카테고리의 다른 글

Todo 1  (0) 2019.12.25
State, Props, Lifecycle  (0) 2019.12.25
Project 생성 및 빌드  (0) 2019.12.25
첫 애플리케이션 만들기  (0) 2019.04.14
React native 설치  (0) 2019.04.14

+ Recent posts