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

본 포스팅의 관련 예제는 아래 github 참고

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

 

State(mutable)

- React에서 데이터를 만들고 다루는 방식

- Component가 생성될때 선언

- setState 함수 내에서 갱신

 

State를 정의하고 이벤트를 받아 갱신해보는 예제를 실행해 봅시다.

import React, { Component } from 'react';
import { Text, View } from 'react-native';

export default class MyComponent extends Component {
  constructor(){  // 1. 생성자에서 State 선언 및 초기화
    super()
    this.state = {
      year: 2018
    }
  }
  updateYear() {  // 2. render() 위에 사용자 정의 함수
    this.setState({ // * this.sate.year = 2019 처럼 직접 갱신하지 않는다.
      year: 2019
    })
  }
  render() {
    return (
      <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
        <Text onPress={() => this.updateYear()}> // 3. Text 터치 시 updateYear 함수 호출
          The year is: { this.state.year }
        </Text>
      </View>
    );
  }
}

* state를 직접 수정하면 render()가 호출되지 않아 갱신되지 않습니다. 대신 this.forceUpdate()를 통해 강제 호출하는 방법이 있습니다.

 

 

 

 

 

 

 

 

실행하면 다음과 같이 텍스트가 나타나며 클릭 시 2019로 변경

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Props(immutable)

- Component 파라미터로 전달 됨(부모에서 자식으로 전달)

- Component 내에서 갱신되지 않음

 

Props를 이해하기 위한 코드 예제

* const를 사용하여 this.state, this.props 등 반복코드를 제거한 것을 참고(네이밍 통일)

import React, { Component } from 'react';
import { Text, View } from 'react-native';

export default class LotsOfGreetings extends Component { //부모 Component export
  constructor(){
      super()
      this.state = {
          username: 'Rexxar'
      }
  }
  updateName(){
      this.setState({ username: 'Jaina'})
  }
  render() {  //name과 updateName을 props로 전달
    const { username } = this.state
    return (
      <View style={{alignItems: 'center', top: 50}}>
        <Greeting 
          updateName={ () => this.updateName() }
          name= { username } /> 
      </View>
    );
  }
}

class Greeting extends Component { //자식 Component : props를 쓴다.
  render() {
    const { name, updateName } = this.props //props를 
    return (
      <View style={{alignItems: 'center'}}>
        <Text onPress={ updateName }> Hello {name}!</Text>
      </View>
    );
  }
}

조금 복잡해 보일 수 있으나 결국 LotsOfGreetings에서 정의한 state를 Greeting에 props로 전달하여 사용할 수 있도록 하는 과정

 

 

 

 

 

 

 

 

 

왼쪽과 같은 결과 화면과 텍스트를 눌렀을때 이름이 업데이트 됨

 

 

 

 

 

 

 

 

 

 

 

 

Stateless component props(함수형 component)

기존 class 정의 형태에서 const Greeting = (props) => { ... } 형태로 코드를 간결하고 재사용성을 높일 수 있다.

 

배열 개체 받기

배열 형태의 props는 아래와 같은 형태로 핸들링 할 수 있다.

let topics = props.topics.map((topic, i) => {
  return <Text>{ topic }</Text>
})

 

생명주기 메서드

Component의 특정 주기(생성, 갱신, 파기)에 자동으로 호출되는 메서드

- getDerivedStateFromProps : props가 변경되어 갱신 시 호출

- componentDidMount : Component가 로딩되고 바로 한번

- shouldComponentUpdate : 새로운 state, props로 render의 호출 여부를 결정

- componentDidUpdate : Component가 재 렌더링 된 후 한번 호출(이전 state, props)

- componentWillUpdate : Component가 파기되기 전에 호출(리스너, 타이머 정리)

 

예제 코드를 통해서 React native의 주요 요소에 대해서 이해?했으나 한번 봐서는 난해하긴 마찬가지 입니다. 젠장..

이해가 될때까지 위 내용은 숙지를 하시고 다음 포스팅에서는 예제 앱을 만들어 보겠습니다. 

 

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

Todo 2  (0) 2019.12.25
Todo 1  (0) 2019.12.25
Project 생성 및 빌드  (0) 2019.12.25
React native intro  (0) 2019.12.25
첫 애플리케이션 만들기  (0) 2019.04.14

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

 

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

+ Recent posts