반응형
Connect Typescript with styled-components
1. 설치
npm install @types/styled-components
2. 선언파일 만들기 (Create a declarations file)
src폴더 안에 styled.d.ts 생성 후 styled-components의 공식문서에서 선언파일 만드는 방법을 찾아 붙이기
//styled.d.ts
// import original module declarations
import "styled-components";
// and extend them!
declare module "styled-components" {
export interface DefaultTheme {
textColor: string;
bgColor: string;
btnColor: string;
}
}
//theme.ts
import {DefaultTheme} from "styled-components/dist/types";
export const lightTheme: DefaultTheme = {
bgColor: "white",
textColor: "black",
btnColor: "teal",
};
export const darkTheme: DefaultTheme = {
bgColor: "black",
textColor: "white",
btnColor: "tomato",
};
//App.tsx
import React, {useState} from "react";
import styled from "styled-components";
const Btn = styled.button`
background-color: ${(props) => props.theme.btnColor};
`;
function App() {
const [val, setVal] = useState("");
const onChange = (event: React.FormEvent<HTMLInputElement>) => {
/** event의 타입을 주기위해서는 위와 같이 작성해야하는데 저것을 찾기 위해서는 어떤곳에서 이벤트가 이루어졌는지 생각해보면 쉽게 다가갈수 있음 혹은
* 공식문서나 구글링을 통해 찾는 걸 추천함 */
// console.log(event.currentTarget.value);
/** 또한 보통 자바스크립트 같은 경우엔 target이라고 작성하는데 타입스크립트와 리액트를 같이 사용하는데 있어서 currentTarget으로 작성해야한다.*/
const {
currentTarget: {value},
} = event;
setVal(value);
};
const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
console.log(val);
};
return (
<div>
<form onSubmit={onSubmit}>
<input
value={val}
onChange={onChange}
type="text"
placeholder="UserName"
/>
<button>Log In</button>
</form>
<Btn>눌러뽕</Btn>
</div>
);
}
export default App;
Styled-Components 의 Style - Reset 하기
- npm i styled-reset
- 아니면 styled-reset의 깃에 들어가 src/index.ts를 복붙하면됨
import React from "react";
import styled, {createGlobalStyle} from "styled-components";
import Mainpage from "./views/Mainpage";
const GlobalStyle = createGlobalStyle`
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+KR:wght@100;200;300;400;500;600;700&display=swap');
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, menu, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
main, menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, main, menu, nav, section {
display: block;
}
/* HTML5 hidden-attribute fix for newer browsers */
*[hidden] {
display: none;
}
body {
line-height: 1;
font-family: 'IBM Plex Sans KR', sans-serif;
color: ${(props) => props.theme.textColor};
background-color: ${(props) => props.theme.bgColor};
}
menu, ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
*{
box-sizing:border-box;
}
a{
text-decoration:none;
}
`;
const Wrapper = styled.div`
display: flex;
`;
function App() {
return (
// Fragment - ghost component
<>
<GlobalStyle />
<Wrapper>
<Mainpage />
</Wrapper>
</>
);
}
export default App;
728x90
'React > Styled-Components' 카테고리의 다른 글
2023/08/24__Styled-Components(2) (0) | 2023.08.24 |
---|---|
2023/08/23__Styled-Components(1) (0) | 2023.08.23 |