리액트 네이티트 2/E 2주차
코드종의 클래스
지난 주 내용 다시 보기
Just 10 min 지난 내용 질문
- 리액트 네이티브 동작의 이해 : 브리지, VirtualDom
- 프로젝트 생성 및 실행
-
관련 뉴스
- CRNA가 Expo CLI로~
오늘 다룰 내용은?
- 4장 모바일 컴포넌트
- 5장 스타일
4장 모바일 컴포넌트
리액트 네이티브에서 제공하는 각종 ==React.Component==
HTML 엘리먼트와 네이티브 컴포넌트의 유사성
리액트 | 리액트 네이티브 |
---|---|
div | View |
span | Text |
li, ul | FlatList, 자식 아이템 |
img | Image |
- 대체할 수 없지만 비슷한 용도로 쓰임
React Native for Web
50쪽 : 리액트네이티브와웹앱의코드를서로공유할수있나요?
- 리액트 네이티브 코드를 웹브라우저에서 돌아가게 만드는 프로젝트
- Write once, render anywhere?
-
믿거나 말거나??
-
-
어떻게 가능할까?
- React를 이용한 js코드는 화면에 어떻게 그려야되는지를 나타냄
- 어떻게 그려야되는지까지 결정되었으니 그리는 실행 주체만 구현하면 OK
<Text> 1/2
- h1, em, strong 등이 없다.
-
<Text>
컴포넌트만이 플레인 텍스트 노드를 자식으로 가질 수 있다. - 중첩 가능
- 일부 스타일이 상속된다. (Text 트리에서만 가능)
<Text style={{fontWeight: 'bold'}}>
I am bold
<Text style={{color: 'red'}}>
and red
</Text>
</Text>
/*
"I am bold and red"
0-9: bold
9-17: bold, red
*/
<Text>
2/2
- 스타일이 적용된 컴포넌트를 만들어서 재사용
<Text>
The quick <Em>brown</Em> fox jumped over the lazy <Strong>dog</Strong>.
</Text>
- 오동작을 막기 위해서는 text는 text와 관련된 일만 하도록 권장 (관련 jsdev.kr 글)
- iOS / Android 전용 속성이 많다: 주의
-
adjustsFontSizeToFit
&minimumFontScale
: iOS only -
textBreakStrategy
: Android only
-
- 개행
{'\n'}
, 스페이스{' '}
더 자세한 사항은
<Text />
공식 문서
<Image>
언제나 공식 가이드 꼼꼼히 살펴봅시다.
<Image>
리소스 불러오는 두가지 방법
// 프로젝트 폴더에 넣은 이미지 (정적 이미지 리소스)
<Image source={require("./puppies.png")} />
// uri로 접근하는 이미지 (인터넷, 카메라롤 ...)
<Image source={{uri:"https://facebook.github.io/react/img/logo_og.png"}}
style={{width: 400, height: 400}} />
- 원격 이미지 소스를 이용할 경우 이미지 사이즈를 따로 지정해야 한다.
- 자식 컨텐츠를 가질 수 없다. 배경으로 이미지를 넣고 싶다면
-
<ImageBackground>
를 이용하거나StyleSheet.absoultefill
으로 스타일링
-
<Image>
정적 이미지 리소스 장점
.
├── button.js
└── img
├── check@2x.png
└── check@3x.png
└── done.ios.png
└── done.android.png
<Image source={require('./img/check.png')} />
<Image source={require('./img/done.png')} />
- iOS와 Android 동일한 방법으로 사용
- JS 파일처럼 관리되고 불러옴
- 코드 변경할 때 처럼 시뮬레이터만 refresh해서 확인 가능
- 이미지 사이즈, 비율, 디바이스 디스플레이 등을 알아서…
` 정적 이미지 리소스 사용시 주의 점
// GOOD
<Image source={require('./my-icon.png')} />;
// BAD
var icon = this.props.active ? 'my-icon-active' : 'my-icon-inactive';
<Image source={require('./' + icon + '.png')} />;
// GOOD
var icon = this.props.active
? require('./my-icon-active.png')
: require('./my-icon-inactive.png');
<Image source={icon} />;
<Image>
원격 이미지 리소스
- 반드시 사이즈를 적어야 한다!
-
Cache Control (iOS Only)
- 공격적인 cache를 원한다면 DylanVann/react-native-fast-image
<Image>
에서 유용한 속성
모바일에서는 화면의 가로 세로 비율이 다르므로
cover
속성을 유용
터치와 체스처 다루기 1/3
언제나 공식 문서부터 살펴보자
구분 | 미리 보기(출처) | 비고 |
---|---|---|
Button | X | 솔직히 안씀 |
TouchableOpacity | 투명 | |
TouchableHighlight | 레이어 | |
TouchableNativeFeedback | Android ripple |
터치와 체스처 다루기 2/3
-
<Button/>
타이틀을 정해서 누를 수 있도록 -
<TouchableHighlight>
,<TouchableOpacity>
영역 전체가 누를 수 있도록 (마치 웹이<a/>
) - PandResponder : 디테일하게 다루기
터치와 체스처 다루기 3/3 : PanResponder
this._panResponder = PanResponder.create({
// 누가 Responder가 될 것인가를 결정 true 혹은 false 리턴
onStartShouldSetPanResponder: ()=>{},
onMoveShouldSetPanResponder: ()=>{}
onStartShouldSetPanResponderCapture: ()=>{}
onMoveShouldSetPanResponderCapture: ()=>{}
// 내가 Responder가 되거나 안 되는게 결정된 순간
onPanResponderGrant: (e, gestureState) => {...},
onPanResponderMove: (e, gestureState) => {...},
// Responder일 때 호출될 수 있는 함수
onPanResponderStart: (e, gestureState) => {...}
onPanResponderMove: (e, gestureState) => {...}
onPanResponderEnd: (e, gestureState) => {...}
onPanResponderRelease: (e, gestureState) => {...}
onPanResponderTerminate: (e, gestureState) => {...}
onPanResponderTerminationRequest: (e, gestureState) => {...}
});
리스트 관련 컴포넌트
-
<ListView>
: deprecated! 쓰지마세요. <FlatList>
<SectionList>
- 예제 코드를 보면서 설명
리스트 관련 주요 개념
<FlatList
data={[{key: 'a'}, {key: 'b'}]}
renderItem={({item}) => <Text>{item.key}</Text>}
/>
- Item
- data
- key
Bestseller 예제를 살펴보자
4장 요약
<Text/>
<Image/>
<FlatList/>
앱을 만드는 기본기는 갖춘 셈!
이제 멋(style)을 낼 차례
5장 스타일
스타일 정의 및 다루기
flex 레이아웃
스타일 정의 방법
- 인라인 스타일
<Text>
The quick <Text style={{fontStyle: "italic"}}>brown</Text> dog.
</Text>
- 오브젝트로 스타일 정의
const bold = {
fontWeight: "bold"
};
- Stylesheet.create 이용
const styles = StyleSheet.create({
button: {
borderRadius: "8px",
backgroundColor: "#99CCFF"
}
});
어떤 방법으로 스타일을 써야 하나?
- 오브젝트로 스타일 정의하기 보다 StyleSheet.create 이용
- 생성한 스타일이 네이티브 영역에 존재하고 해당 스타일의 id만 브릿지를 통해서 전달되게 됨
- 인라인은 아주 요긴
스타일 사용 팁
- 스타일 병합
<Text style={[ styles.button, styles.accentText ]}>
Wow
</Text>
- 조건에 따른 적용
<View style={[
styles.button,
this.state.touching && styles.highlight
]} />
위치 잡기와 레이아웃 디자인
- flex, flex, flex!
- 개구리 게임
- 그림으로 설명 된 글 : freecodecamp.org
- 리액트 네이티브 문서
- 지원하는 props : https://facebook.github.io/react-native/docs/layout-props
- yoga layout : https://yogalayout.com/docs/
- 직접해봐야 알게 된다. 궁금한 점 물어보세요~
5장 요약
- 스타일의 다양한 선언 방법 :
Stylesheet.create({})
- 스타일을 다루는 법 : 병합, 조건…
- flex 스타일
과제
안한다고 혼나지는 않아요.
- Naver API를 이용한 BookList에 검색어를 붙여서 책 검색으로 만들어보자!
오늘은 여기까지 입니다.
무엇이든 물어보세요.
감사합니다.