rn에서 styled-component 사용하기
Updated:
설치
npm i styled-components
1. 스타일 적용하기 - Tagged Template Literals
import styled from 'styled-components/native';
const 컴포넌트이름 = styled.컴포넌트`
스타일 코드
`
// 실제 코드
const Container = styled.View`
flex: 1;
background-color: red;
align-items: center;
justify-content: center;
`;
2. 스타일 적용하기 - 스타일 재사용(CSS)
import {css} from 'styled-components/native';
const 스타일이름 = css`
스타일코드
`
const 컴포넌트이름 = styled.컴포넌트`
${스타일이름}
스타일 코드
`
//실제 코드
import styled, {css} from 'styled-components/native';
const cssText = css`
font-size: 20px;
font-weight: bold;
`;
const StyledText = styled.Text`
${cssText}
color: blue;
`;
3. 스타일 적용하기 - 스타일 재사용(일반적인 상속)
import styled from 'styled-components/native';
const StyledText = styled.Text`
font-size: 20px;
font-weight: bold;
color: blue;
`;
*괄호안에 동일하게 사용될 스타일 컴포넌트를 넣어줍니다.*
const ErrorText = styled(StyledText)`
color: yellow;
`;
활용하기
1. props
styled-components
를 사용하면props
를 이용하여 style을 변경할 수 있습니다.
const StyledText = styled.Text`
font-size: 20px;
font-weight: bold;
color: ${props => (props.name === 'red' ? 'black' : 'yellow')};
`;
const App = () => {
const name = 'red';
<StyledText name={name}>{name}</StyledText>
}
2.attrs
- 컴포넌트 스타일 외에도 다양한 스타일을 변경할 수 있습니다.(예 :
해당 컴포넌트의 속성
) styld.컴포넌트.attrs({ 속성 설정 })
스타일 코드``
*일반적인 예시*
const App = () => {
const name = 'red';
<StyledInput placeholder='입력해주세요' placeholderTextColor='#fff' />
}
*styled-component를 사용한 예시*
const StyledInput = styled.TextInput.attrs({
placeholder:'입력해주세요',
placeholderTextColor:'#fff'
})`
border-width: 200px;
`
const App = () => {
const name = 'red';
<StyledInput/>
}
3.ThemeProvider
- “미리 정의된 값들을 지정해서 해당 값을 사용할 수 있게 해줍니다.”
import styled,{ThemeProvider} from 'styled-components/native';
*ThemeProvier를 사용한 예시*
const StyledText = styled.Text`
font-size: 100px;
color: ${props => props.theme.textColor};
background0color: ${({theme}) => theme.bg}
`
const App = () => {
const theme = {textColor: '#009600',bg: '#e3e3e3'};
<ThemeProvider>
<StyledText/>
</<ThemeProvider>
}
실제로 사용해보기
-
App.js
import styled, {css, ThemeProvider} from 'styled-components/native'; import Input from './src/components/Input'; const Container = styled.View` flex: 1; background-color: ${({theme}) => theme.bgColor}; align-items: center; justify-content: center; `; const lightTheme = { inputColor: '#111111', inputBorder: '#111111', bgColor: '#e3e3e3', }; const darkTheme = { inputColor: '#e3e3e3', inputBorder: '#e3e3e3', bgColor: '#111111', }; const App = () => { const [toggle, setToggle] = useState(true); return ( <ThemeProvider theme={toggle ? lightTheme : darkTheme}> <Container> <StatusBar style="auto" /> <Switch value={toggle} onValueChange={prev => setToggle(prev)} /> <Input placeholder="zza" /> </Container> </ThemeProvider> ); };
-
Input.js
// prop를 전달받기에 축약형으로 text로 전달 const StyledInput = styled.TextInput.attrs(({placeholder}) => ({ placeholder: placeholder || '입력해주세요', placeholderColor: '#111111', }))` padding: 20px; font-size: 20px; border: 1px solid ${({text}) => (text ? 'blue' : 'red')}; `; const Input = ({placeholder}) => { const [text, setText] = useState(''); return ( <StyledInput onChangeText={e => setText(e)} text={text} placeholder={placeholder} /> ); };