๋ฆฌ์กํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๐Sass์ ๐React Router๋ฅผ ์จ๋ณด์
- ๋ฆฌ์กํธ์์ ์จ๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ์ง๋ ์๋ฏธ์ ๋ํด์
- ๋ฆฌ์กํธ์์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ด ๋ญ๊ณ ์ ํ์ํ์ง
- css ํ์ผ์์ ์์ฑํ ์คํ์ผ ์ฝ๋๊ฐ ๋ฆฌ์กํธ์์๋ ์ด๋์์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ์ดํด
- sass๊ฐ css์ ์ด๋ค ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์ดํดํ๊ณ sass๊ฐ css์ ์ด๋ค ๋จ์ ์ ํด๊ฒฐํด์ฃผ๋์ง
- sass์์ nesting, extend, ๋ณ์ ๋ฑ์ ํ์ฉํ์ฌ ์คํ์ผ๋งํ๋ ๋ฒ๊น์ง ์๊ณ ๋ด์ผ ๋๋ตํด๋ณด๊ธฐ!
- Third, ์ 3์๋ก์ ๋ค๋ฆฌ์ ์ญํ ์ ํ๋ฉฐ ๋ณด๋ค ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ์ํด, ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฐ์ ์์ด ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๋ ํ๋ฌ๊ทธ์ธ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ๋ฑ Third-party library๋ผ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฅธ๋ค.
- React๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ด์ฅ๋ ๊ธฐ๋ฅ๋ค์ด ํ๋ ์์ํฌ์ ๋นํด ๋ถ์กฑํ์ง๋ง ๋ค์ํ Third-party library๋ฅผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ฐํ ๋ฉด์ ๊ฐ๊ณ ์๋ค.
Sass
๋ css์ ๋ค์ํ ํธ๋ฆฌํจ๊ณผ ๊ธฐ๋ฅ์ ๋ํด์ฃผ๋ CSS์ ํ์ฅ์ด๋ค.์ ์ฒ๋ฆฌ๊ธฐ
๋ผ๊ณ ๋ ๋ถ๋ฅด๋๋ฐ ์ด๋ CSS ๋ฌธ๋ฒ๊ณผ ๊ต์ฅํ ์ ์ฌํ์ง๋ง 1>์ ํ์์ ์ค์ฒฉ(Nesting)์ด๋ 2>์กฐ๊ฑด๋ฌธ, 3>๋ฐ๋ณต๋ฌธ, 4>๋ค์ํ ๋จ์์ ์ฐ์ฐ ๋ฑ์ CSS๋ณด๋ค ํจ์ฌ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํธ๋ฆฌํ๊ฒ ์์ฑ ํ ์ ์๊ฒ ๋์์ค๋ค.- ์ฆ,
SCSS
๋ CSS ๊ตฌ๋ฌธ๊ณผ ์์ ํ ํธํ๋๋๋ก ์๋ก์ด ๊ตฌ๋ฌธ์ ๋์ ํด ๋ง๋ Sass์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ CSS์ ์์์งํฉ์ ๋ปํ๊ธฐ๋ ํ๋ค.
<style> nav { @extend %flex-row-space-between; align-items: center; position: sticky; #title { @extend %webucks-logo-style; } #navMenus { display: flex; justify-content: space-evenly; </style>
<style> $input-font-color:#9b9696; #loginUserId, #loginUserPsw { @include input-IdAndPsw-FontSize-Color($input-font-color); &::placeholder { @include input-IdAndPsw-FontSize-Color($input-font-color); } } </style>
- Sass๋ ์ค์ฒฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ ์ ํ์์ ๋ฐ๋ณต์ ํผํ๊ณ ์ข ๋ ํธ๋ฆฌํ๊ฒ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ค.
<style> .Login { .loginWindow { @extend %flex-column; background-color: $default-white; border: 5px solid $windowAndInput-border-color; @include border-radius(10px); &Title { @extend %logo-style; } &InputBox { @extend %flex-column; } &FindUserPsw { @extend %flex-column; } } } </style>
- ์ค์ฒฉ ์์์ & ํค์๋๋ฅผ ์ฐ๋ฉด ์์(๋ถ๋ชจ) ์ ํ์๋ฅผ ์ฐธ์กฐํ์ฌ ์นํ๊ฐ๋ฅํ๋ค.
<style> #loginWindow { @extend %flex-column; @include border-radius(10px); .title { @extend %logo-style; } .userInputBox { @extend %flex-column; #userLoginPsw, #userLoginId { @include input-IdAndPsw-backGround-border-Color($windowAndInput-border-color); @include border-radius(5px); @include input-IdAndPsw-FontSize-Color($input-font-color); &::placeholder { @include input-IdAndPsw-FontSize-Color($input-font-color); } } </style>
- & ํค์๋๋ฅผ ์ฐธ์กฐํ๋ฉด ์์ ์ ํ์๋ก ์นํ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ์์ฒ๋ผ ์์ฉํ ์๋ ์๋ ์๋ค.
<style> .fs { &-small { font-size: 12px; } &-medium { font-size: 14px; } &-large { font-size: 16px; } } </style>
- CSS์ ๋ค๋ฅธ์ ์ ๋ถ๋ชจ๋ก ๋ชจ์์ง๋ scssํ์ผ์ ํ๋๋ก ๋ชจ์์ง ํ ํ๋์ CSS๋ก ๋ง๋ค์ด์ง๋ค.
<style> import './TopNav.scss' </style>
- SCSS๋ @mixin๊ณผ @include๋ก ๊ธฐ๋ฅ์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- ์์ฃผ ์ฐ์ด๋ ์คํ์ผ์ ๋ฏน์ค์ธ ๊ธฐ๋ฅ์ผ๋ก ํ๋ฒ ์ง์ ํด์ค ์คํ์ผ์ ์ฌ๋ฌ๋ฒ ๋ถ๋ฌ์ฌ ์ ์๋ค.
<style> @mixin border-radius($radius) { -webkit-border-radius: $radius; -moz-border-radius: $radius; -ms-border-radius: $radius; border-radius: $radius; } #loginWindow { @extend %flex-column; @include border-radius(10px); #userLoginPsw, #userLoginId { @include border-radius(5px); &::placeholder { font-weight: $input-bolder; } </style>
<style>
@mixin btn-background-border-Color($Color: lightsteelblue) {
border: 3px solid $Color;
background-color: $Color;
}
#loginUserBtn {
@include btn-background-border-Color($Color:lightsteelblue);
@include border-radius(10px);
&.changeBtnColor {
@include btn-background-border-Color($Color:steelblue);
}
}
</style>
- extend ์ฌ์ฉํ ํด๋์ค๋ค์ ์ฝค๋ง๋ก ๋ฌถ์ด์ ํ๋์ ์คํ์ผ๋ก ์ถ๋ ฅํด์ค๋ค.
<style> .input{font-size:10px} .input2 { @extend .input font-size: 20px } .input3 { @extend .input2 font-size: 30px } </style>
<style> %size{font-size:10px} .input2 { @extend $size } </style>
- ๊ณตํต๋ ์คํ์ผ์ ํด๋์ค๋ง๋ค ๋ฃ์ด์ ์ ์ฉํ ๋ mixin
- ํด๋์ค๋ฅผ ํ๋๋ก ๋ฌถ์ด ํ๋ฒ์ ์คํ์ผ์ ์ ์ธํ์ฌ ์ ์ฉํ ๋ extend
Routers
๋ ๋ค๋ฅธ ๊ฒฝ๋ก์๋ฐ๋ผ ๋ค๋ฅธ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ๋ผ์ฐํ ์ด๋ค- ๊ฐ๋ฐ์๊ฐ ์์ ๋ค์ด๊ฐ ์์ผ๋ฉด ํ๋ ์์ํฌ์ด๊ณ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฌ์ฉํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฆฌ์กํ ์ ๋ผ์ฐํฐ ๊ธฐ๋ฅ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ๋ก
Routers
๋ค- ๋ผ์ฐํธ๋ ์์์๋ถํฐ ํ๋์ฉ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ค
- ๋ง์ฝ ๋ชจ๋ ๊ฑธ ๋ค ํ์ํ์ฌ ๋ฐ๊ฒฌํ์ง ๋ชปํ ๋ ๋ณด์ฌ์ง ํ์ด์ง 404๋ฅผ ๋ฆฌํดํ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ฅ ๋ฐ์ ๋ฃ์ด์ฃผ๋ฉด๋๋ค.
<script> import React from 'react'; import { BrowserRouter as Router, Switch, Route, } from 'react-router-dom'; import Login from './pages/Login/Login'; import List from './pages/List/List'; import Detail from './pages/Detail/Detail'; class Routes extends React.Component { render() { return ( <Router> <Switch> <Route exact path="/login" component={Login}/> <Route exact path="/list" component={List} /> <Route exact path="/detail" component={Detail} /> </Switch> </Router> ) } } export default Routes; </script>
-routes.jsํ์ผ
- exact path์ ๋ด๊ฐ ๊ฐ๊ณ ์ํ๋ ํ์ด์ง์ ๊ฒฝ๋ก๋ฅผ ๋ค์๊ณผ ๊ฐ์ด "/login" ์ง์ ํด์ค๋ค.
- component={Login}์๋ ๋ด๊ฐ import(import Login from './pages/Login/Login')ํ์ฌ ๊ฐ์ ธ์จ ์ปดํฌ๋ํธ๋ก ๋๋ ํ์ด์ง js๋ฅผ ๋ฃ์ด์ค๋ค.
<script> import React from 'react'; import ReactDOM from 'react-dom'; import './styles/reset.scss' import './styles/common.scss' import Routes from "./Routes" ReactDOM.render( <Routes />, document.getElementById('root') ); </script>
- index.jsํ์ผ์ ๋ผ์ฐํธํฐ ์ปดํฌ๋ํธ๋ก ๋ฌถ์ด์ค Routes ํ์ผ์ importํด์ฃผ๋ฉด ๋!!
<script> import React from 'react'; import { withRouter } from 'react-router-dom'; class Login extends React.Component { goToMain = () => { this.props.history.push('/main'); } ** // ์ค์ ํ์ฉ ์์ // goToMain = () => { // if(response.message === "valid user"){ // this.props.history.push('/main'); // } else { // alert("๋ ์ฐ๋ฆฌ ํ์ ์๋. ๊ฐ์ ๋จผ์ ํด์ฃผ์ธ์") // this.props.history.push('/signup'); // } // } render() { return ( <div> <button className="loginBtn" onClick={this.goToMain} ๋ก๊ทธ์ธ </button> </div> ) } } export default withRouter(Login); </script>
<Link />
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์์ onClick ์ด๋ฒคํธ๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์ด๋ํ ์ ์๋ค.goToMain
event handler์์ ๊ตฌํํ ๊ฒ์ฒ๋ผ props ๊ฐ์ฒด์ history (this.props.history
) ์ ์ ๊ทผํด์ ์ด๋ํ ์ ์๋ค.- ๋ฐ์
history
์push
๋ฉ์๋์ ์ธ์๋กRoutes.js
์์ ์ค์ ํ path๋ฅผ ๋๊ฒจ์ฃผ๋ฉด, ํด๋น ๋ผ์ฐํธ๋ก ์ด๋ํ๋ค.- ์ด ์ปดํฌ๋ํธ(Login ์ปดํฌ๋ํธ)์์ props์ route ์ ๋ณด(
history
)๋ฅผ ๋ฐ์ผ๋ ค๋ฉด exportํ๋ ์ปดํฌ๋ํธ์ยwithRouter
๋ก ๊ฐ์ธ์ค์ผํ๊ณ ์ด๋ฅผ Higher Order Component (์ดํ HOC)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ ๋ฆฌํด๋ณด๋ ๊ฒ๋ณด๋ค ์ง์ ์ฐ๋ฉด์ ์ต์ํด์ง์์!
์ฅํ ๋ฉํ ๋์ ๊น๋ ๊ฐ์ ์ค:)