๐ ๋ค์๊ณผ ๊ฐ์ CSS ์คํ์ผ์ React Native์ฉ @akalli/components ์ค๋งํธ ๊ตฌ์ฑ ์์๋ฅผ ์๊ฐํฉ๋๋ค.
Enough talk, just an example can make this clear lol :).
import { Text, View } from "@akalli/components";
export const Component = memo((props: IPropsHeader) => {
return (
<View _style={styles.view}>
<Text _style={styles.text}>My text here</Text>
<Text _style="color: blue;">Inline styles support too!</Text>
</View>
);
});
const styles = {
view: `
height: 100px;
background-color: red;
width: 100%;
`,
text: `
color: white;
font-size: 24px;
`,
};
์คํ์ผ
inline
์ ๋ฃ๊ฑฐ๋ const
๋๋ object
์์ ํธ์ถํ ์ ์์ต๋๋ค. ํ๋ ์๋์์ ๋ชจ๋ ์คํ์ผ ๊ตฌ์ฑ ์์๋ก ๋ณํ๋ฉ๋๋ค.์ค์น
npm install @akalli/components styled-components react-native-svg yup
์ฉ๋ฒ
์ด ๊ตฌ์ฑ์์ lib์ ์ฐ๊ด๋
special props
๋ _
๋ก ์๋ณ๋ฉ๋๋ค. prop with _
๊ฐ ํ์๋ ๋๋ง๋ค ์ด๋ ์ฐ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ผ๋ ์๋ฏธ์ด๋ฉฐ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ react-native์ ๋์ผํฉ๋๋ค. ๋ฌผ๋ก TypeScript ๋๋ถ์ ๊ตฌ์ฑ ์์์์ _
๋ฅผ ๋๋ฌ ์ฌ์ฉํ ์์ฝ์ ํ์ธํ ์ ์์ต๋๋ค.๊ตฌ์ฑํ
์คํ์ ๋ทฐ
๋ณด๊ธฐ - RN์ ๋ณด๊ธฐ์ ๋์ผํฉ๋๋ค.
HSection ๋ฐ VSection - ๋ณด๊ธฐ์ด์ง๋ง ๋ฐฉํฅ์ด ์ง์ ๋๊ณ ์๋ฏธ๋ก ์ ์ ๋๋ค.
ScrollView - RN์ ScrollView์ ๋์ผํฉ๋๋ค.
Center, HCenter ๋ฐ VCenter - ์ค์ ์ง์คํ ์คํ์ผ์ด ๋ค๋ฅธ ๋ณด๊ธฐ์ ๋๋ค.
ํ์ - ์กฐ๊ฑด ๋ ผ๋ฆฌ๊ฐ ์๋ ๋ณด๊ธฐ๋ก, ๋ณด๋ค ๋ช ํํ๊ณ ์๋ฏธ๋ก ์ ์ธ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ๋ง๋๋ ๋ฐ ์ข์ต๋๋ค. ์ฌ๊ธฐ์๋ ์๋ชป๋ ๊ฒฝ์ฐ์ ๋ํ ์ํ
_fallback
์ด ํฌํจ๋ฉ๋๋ค. ๊ธฐ์ธ๊ธฐ
FlatList - FlatList์ ๋์ผํฉ๋๋ค.
SectionList - SectionList์ ๋์ผํฉ๋๋ค.
์ ๋ ฅ
TextInput - RN์ TextInput๊ณผ ๋์ผํฉ๋๋ค.
์ ๋ ฅ - ํ์ธ ํํฌ useMyForm(yup๊ณผ ํตํฉ๋จ)๊ณผ ํจ๊ป ์๋ํ๋ ์ ๋ ฅ์ ๋๋ค.
๊ธฐํ
ํค๋ - ์์ด์ฝ์ผ๋ก ํค๋๋ฅผ ๊ตฌํํ๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
ํ ๋ง ๋ฐ ๋ณํ
const initialTheme = {
colors: {},
fontSizes: {},
variants: {
viewBgRed:`
background-color: red;
`
}
}
<MyThemeProvider theme={initialTheme}>
<View _variant='viewBgRed'>
<Text>Hey coders!</Text>
</View>
</MyThemeProvider>
ํํฌ
useMyStyle - ์ด ํํฌ๋ ๋์ ์คํ์ผ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ค์ ๋ ๋๋งํ์ง ์๊ณ ๋์ ์ผ๋ก ์คํ์ผ์ ์ง์ ํ ์ ์์ต๋๋ค.
// This will only be called again when lang changes.
const changeLangButtonStyle = useMyStyle(styles.changeLangButton(lang), [
lang,
]);
MyThemeProvider
๋ฐ ํผ๋theme prop
๋ก ๋ํํด์ผ ํฉ๋๋ค. const schema = yup.object().shape({
name: yup
.string()
.min(5, "put at least 5 letters")
.required("Name is required"),
email: yup.string().email("Not valid email").required("Email is required"),
});
const { register, handleSubmitForm } = useMyForm({ schema });
<Input
_variant="inputForm"
_register={register}
_key="name" // This key must be the same as yup schema
_label="Name"
_placeholder="Seu nome"
_customStyles={styles.inputDataClient}
_colors={{
main: "#7a7a7a",
error: "#f5427b",
}}
/>
...
const styles = {
inputDataClient: {
label: `
font-size: 20px;
text-align: left;
`,
input: `
font-size: 18px;
padding-left: 15px;
height: 40px;
border-radius: 8px;
color: #A7A7A8;
`,
container: `
margin-top: 20px;
align-items: flex-start;
`,
},
}
์ด ํ๋ก์ ํธ๋ ๋ ๋ฆฝ์ ์ด์ง๋ง npx์ ์ฝ๊ฒ ์ค์นํ ์ ์๋ ํจ์ฌ ๋ ํฐ ์์คํฌ ํ ํ๋ฆฟ ํจํค์ง์ ์ผ๋ถ์ด๊ธฐ๋ ํฉ๋๋ค.
๋ง๋๋ค: @akalli/create-akalli-app
GitHub์ ๋ชจ๋ ์คํ ์์ค์ ๋๋ค. ์ฒดํฌ ์์ํ๊ณ ์์ฌ์ด๋ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ด ์ด๋ฉ์ผ[email protected]๋ก ์ฐ๋ฝํ ์ ์์ต๋๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ๋ค์๊ณผ ๊ฐ์ CSS ์คํ์ผ์ React Native์ฉ @akalli/components ์ค๋งํธ ๊ตฌ์ฑ ์์๋ฅผ ์๊ฐํฉ๋๋ค.), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/danilosilvadev/introducing-akallicomponents-smart-components-for-react-native-with-css-style-like-3gd9ํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค