react-native
에서 styled-components
의 createGlobalStyle
을 사용하여 공통 style을 잡고 싶다.
import { createGlobalStyle } from 'styled-components';
export const GlobalStyle = createGlobalStyle`
body, * {
padding:0;
margin:0;
font-size:14px;
}
li {
list-style:none;
}
button, a{
text-decoration:none;
border:none;
backgorund:none;
}
body {
padding: 0 10px;
}
`;
import React from 'react';
import { ApolloProvider } from 'react-apollo-hooks';
import ApolloClient from 'apollo-boost';
import apolloClientOptions from './apollo';
import StatusBarComponent from './components/StatusBarComponent';
import BottomTabNavigation from './navigation/BottomTabNavigation';
import { NavigationContainer } from '@react-navigation/native';
import { GlobalStyle } from './styles/common';
const client = new ApolloClient({
...apolloClientOptions,
});
function App(): React.ReactElement {
return (
<ApolloProvider client={client}>
<GlobalStyle />
<StatusBarComponent />
<NavigationContainer>
<BottomTabNavigation />
</NavigationContainer>
</ApolloProvider>
);
}
export default App;
이렇게 넣어줬더니 아래와 같은 에러가 발생한다..
공식문서에 찾아보니.. 이렇게 나와있다.
web-only
... 그러면 모바일에서 글로벌 스타일을 적용시키려면 어떻게 해야할까..
( 아직 해결 못함.. 계속 찾아보는중.. ㅜㅜ )
이 포스트에 답이 있는거 같은데.. KeyboardAvoidingView 적용하기
해결..!!
블로깅 링크
KeyboardAwareScrollView
에는 extraScrollHeight
용도로 사용할 수 있는 props
가 있다.오.. react native input Do not cover keypad
이렇게 검색해보았더니 그럴싸한 글들이 몇개 나온다..!!하단 고정 버튼
과 컨텐츠
영역을 분리하고 최상위객체(PageWrap
)에 flex:1
을 준다.
import ReactNative, { View, Button, ScrollView } from 'react-native';
.
.
(생략)
.
.
return (
<PageWrap style={{ flex: 1 }}>
<ScrollView>
<FormBox>
<InputTitle>프로젝트명</InputTitle>
<InputText placeholder="프로젝트명을 입력하세요" onFocus={focusInputEvent} />
</FormBox>
<FormBox>
<InputTitle>포지션 및 멤버수</InputTitle>
<InputText placeholder="포지션을 입력하세요" onFocus={focusInputEvent} />
<FixBottomButton title="포지션 추가" />
</FormBox>
<FormBox>
<InputTitle>기술스택</InputTitle>
<InputText placeholder="기술스택 입력 후 엔터" onFocus={focusInputEvent} />
</FormBox>
</ScrollView>
<View>
<FixBottomButton title="완료" />
</View>
</PageWrap>
)
styled component
를 사용해 react native button
을 커스텀마이징 해보려했는데 아무리해도 css
가 적용되지 않는다 그래서 구글링 해보았더니 아래와 같은 이유로 react native button
을 사용하지 않고 TouchableOpacity
안에 Text
를 감싸 커스터마이징 한다고 한다.. 오...
Button 컴포넌트
를 사용하면 각 플랫폼
에 따라 네이티브 버튼이 다르기 때문
에 UI 조절이 제한적
이고, 일관성이 없게 된다.
Button 컴포넌트
는 안드로이드
와 ios
에서 다르게 보이기 때문에 관리하는데에 어려움이 있다
TouchableOpacity
라는 컴포넌트를 사용하여 커스텀 버튼
을 제작하면된다TouchableOpacity
TouchableOpacity
컴포넌트는 터치 이벤트(onPress 등)를 사용할 수 있는 VIew
라고 한다// button.jsx => styled component
import styled from 'styled-components/native';
export const BorderButtonStyle = styled.Text`
margin-top: 20px;
padding: 15px;
color: #2f80ed;
background: #fff;
border: 1px solid #2f80ed;
border-radius: 5px;
text-align: center;
`;
// buttonComponent.tsx => button component
import React from 'react';
import { TouchableOpacity } from 'react-native';
import { BorderButtonStyle } from '../styles/button';
export const BorderButton = ({ text, onPress }) => {
// activeOpacity => 버튼을 눌렀을 때에 투명도가 0.7이 되었다 다시 1로 돌아오게해줌
return (
<TouchableOpacity onPress={onPress} activeOpacity={0.7}>
<BorderButtonStyle>{text}</BorderButtonStyle>
</TouchableOpacity>
);
};
// CreateProject.tsx => page!
<FormBox>
<InputTitle>포지션 및 멤버수</InputTitle>
<InputText placeholder="포지션을 입력하세요" onFocus={focusInputEvent} />
<BorderButton text="포지션 추가" onPress={() => console.log('포지션 추가 버튼 클릭')} />
</FormBox>
react native에는 flex
가 많이 사용되는거 같다 아래의 사이트에 설명이 너무 잘되있어서 가져왔다.
flexbox로 만들 수 있는 10가지 레이아웃