01-vanilla-js.html
02-react-tasting.html
console.log("야옹");
이 있던 곳에 붙여넣어주세요.
const catItem = (
<li>
<img src="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
</li>
);
- body에 있는 고양이 관련 html 코드를 모두 주석처리 해주세요
- body 여는 태그 밑에 엘리먼트를 박아넣을 공간을 마련해주세요
<div id="app"></div>
- 아까 만들었던 catItem을 html의 빈 공간에 ReactDOM.render를 써서 그려주세요
const 여기다가그려 = document.querySelector("#app");
ReactDOM.render(catItem, 여기다가그려);
- 'Live server'를 사용해 브라우저에서 열고, 개발자 도구에서 스크립트
에러
가 나는걸 확인해주세요.
https://ko.reactjs.org/docs/add-react-to-a-website.html
- 리액트 라이브러리와 바벨 script를 고양이코드 script 위에 넣어주세요
<script
src="https://unpkg.com/react@17/umd/react.development.js"
crossorigin
></script>
<script
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
crossorigin
></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
- 고양이코드 script에 type을 넣어주세요
<script type="text/babel">
// 고양이코드
</script>
const favorites = (
<ul class="favorites">
<li>
<img src="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
</li>
<li>
<img src="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
</li>
<li>
<img src="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
</li>
</ul>
);
ReactDOM.render(favorites, 여기다가그려);
const favorites = (
<ul class="favorites">
{catItem}
{catItem}
{catItem}
</ul>
);
const mainCard = (
<div class="main-card">
<img
src="https://cataas.com/cat/60b73094e04e18001194a309/says/react"
alt="고양이"
width="400"
/>
<button>🤍</button>
</div>
);
const app = (
<div>
{mainCard}
{favorites}
</div>
);
const title = <h1>1번째 고양이 가라사대2</h1>;
const form = (
<form>
<input type="text" name="name" placeholder="영어 대사를 입력해주세요" />
<button type="submit">생성</button>
</form>
);
const app = (
<div>
{title}
{form}
{mainCard}
{favorites}
</div>
);
function CatItem(props) {
return (
<li>
<img src={props.img} />
</li>
);
}
utils.js의 CAT1, CAT2 복붙
function Favorites() {
return (
<ul class="favorites">
<CatItem img="https://cataas.com//cat/5e9970351b7a400011744233/says/inflearn" />
<CatItem img="https://cataas.com/cat/595f280b557291a9750ebf65/says/JavaScript" />
</ul>
);
}
examples/06-making-component.html 을 참고해주세요
const Title = (props) => {
return <h1>{props.children}</h1>;
};
07-styling.html 참고해주세요
function CatItem(props) {
return (
<li>
<img src={props.img} style={{ width: "150px" }} />
</li>
);
}
const MainCard = ({ img }) => {
function handleHeartClick() {
console.log("하트 눌렀음");
}
function handleHeartMouseOver() {
console.log("하트 스쳐 지나감");
}
return (
<div className="main-card">
<img src={img} alt="고양이" width="400" />
<button onClick={handleHeartClick} onMouseOver={handleHeartMouseOver}>
🤍
</button>
</div>
);
};
const Form = () => {
function handleFormSubmit(event) {
// 브라우저 리프레시 막기 event.preventDefault()
event.preventDefault();
console.log("폼 전송됨");
}
return (
<form onSubmit={handleFormSubmit}>
<input type="text" name="name" placeholder="영어 대사를 입력해주세요" />
<button type="submit">생성</button>
</form>
);
};
const [counter, setCounter] = React.useState(1);
console.log("카운터", counter);
function handleFormSubmit(event) {
event.preventDefault();
console.log("폼 전송됨");
setCounter(counter + 1);
}
- Form, Title 을 모두 참조할 수 있는 공간(app)으로 상태를 끌어올리기!
- Title에 1 대신 counter를 넣기
- handleFormSubmit도 App으로 끌어올리기
const App = () => {
const [counter, setCounter] = React.useState(1);
console.log("카운터", counter);
function handleFormSubmit(event) {
event.preventDefault();
console.log("폼 전송됨");
setCounter(counter + 1);
}
return (
<div>
<Title>{counter}번째 고양이 가라사대</Title>
<Form handleFormSubmit={handleFormSubmit} />
<MainCard img="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
<Favorites />
</div>
);
};
const App = () => {
const CAT1 = "https://cataas.com/cat/60b73094e04e18001194a309/says/react";
const CAT2 = "https://cataas.com//cat/5e9970351b7a400011744233/says/inflearn";
const CAT3 =
"https://cataas.com/cat/595f280b557291a9750ebf65/says/JavaScript";
const [counter, setCounter] = React.useState(1);
const [mainCat, setMainCat] = React.useState(CAT1);
console.log("카운터", counter);
function handleFormSubmit(event) {
event.preventDefault();
console.log("폼 전송됨");
setCounter(counter + 1);
setMainCat(CAT2);
}
return (
<div>
<Title>{counter}번째 고양이 가라사대</Title>
<Form handleFormSubmit={handleFormSubmit} />
<MainCard img={mainCat} />
<Favorites />
</div>
);
};
function Favorites() {
const CAT1 = "https://cataas.com/cat/60b73094e04e18001194a309/says/react";
const CAT2 = "https://cataas.com//cat/5e9970351b7a400011744233/says/inflearn";
const CAT3 =
"https://cataas.com/cat/595f280b557291a9750ebf65/says/JavaScript";
const cats = [CAT1, CAT2];
return (
<ul className="favorites">
{cats.map((cat) => (
<CatItem img={cat} key={cat} />
))}
</ul>
);
}
const App = () => {
// ...
function handleHeartClick() {
console.log("하트 눌렀음");
}
//...
return (
<div>
// ...
<MainCard img={mainCat} handleHeartClick={handleHeartClick} />
</div>
);
};
- 고양이 좋아요 리스트를 App에 favorites로 상태를 만들어 추가하기 ([cat1, cat2]를 초기값으로)
- 하트를 누르면 cat3를 배열에 추가
const App = () => {
const CAT1 = "https://cataas.com/cat/60b73094e04e18001194a309/says/react";
const CAT2 = "https://cataas.com//cat/5e9970351b7a400011744233/says/inflearn";
const CAT3 =
"https://cataas.com/cat/595f280b557291a9750ebf65/says/JavaScript";
const [counter, setCounter] = React.useState(1);
const [mainCat, setMainCat] = React.useState(CAT1);
const [favorites, setFavorites] = React.useState([CAT1, CAT2]);
console.log("카운터", counter);
// ...
function handleHeartClick() {
console.log("하트 눌렀음");
setFavorites([...favorites, CAT3]);
}
return (
<div>
// ...
<MainCard img={mainCat} handleHeartClick={handleHeartClick} />
<Favorites favorites={favorites} />
</div>
);
};
const Form = ({ handleFormSubmit }) => {
const [value, setValue] = React.useState("");
// ...
};
const Form = ({ handleFormSubmit }) => {
const [value, setValue] = React.useState("");
function handleInputChange(e) {
setValue(e.target.value.toUpperCase());
}
return (
<form onSubmit={handleFormSubmit}>
<input
type="text"
name="name"
placeholder="영어 대사를 입력해주세요"
value={value}
onChange={handleInputChange}
/>
<button type="submit">생성</button>
</form>
);
};
- 한글은 못 적도록
- utils.js의 includesHangul 함수 복붙 후 Form에 넣기
const Form = () => {
const includesHangul = (text) => /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/i.test(text);
- 에러메세지 state 추가하기
const Form = () => {
// ...
const [errorMessage, setErrorMessage] = React.useState("");
한글이 들어오면 에러메세지 보여주기 에러메세지를 input 밑에 넣어주기 (빨간색으로) 한글이 없다면 에러메세지 초기화
const Form = () => {
const includesHangul = (text) => /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/i.test(text);
const [value, setValue] = React.useState("");
const [errorMessage, setErrorMessage] = React.useState("");
function handleInputChange(e) {
const userValue = e.target.value;
setErrorMessage("");
if (includesHangul(userValue)) {
setErrorMessage("한글은 입력할 수 없습니다.");
}
setValue(userValue.toUpperCase());
}
// ...
return (
<form onSubmit={handleFormSubmit}>
<input
type="text"
name="name"
placeholder="영어 대사를 입력해주세요"
value={value}
onChange={handleInputChange}
/>
<button type="submit">생성</button>
<p style={{ color: "red" }}>{errorMessage}</p>
</form>
);
};
빈값을 전송하려고 하면 에러메세지 추가
const Form = () => {
// ...
function handleFormSubmit(e) {
e.preventDefault();
setErrorMessage("");
if (value === "") {
setErrorMessage("빈 값으로 만들 수 없습니다.");
}
}
// ...
};
const App = () => {
// ...
const [counter, setCounter] = React.useState(
Number(localStorage.getItem("counter"))
);
// ...
function updateMainCat() {
setMainCat(CAT2);
const nextCounter = counter + 1;
setCounter(nextCounter);
localStorage.setItem("counter", nextCounter);
}
//...
};
혹시 Git이 처음이라면?
Git 명령어
이름 설정 : git config –global user.name 이름
이메일 설정: git config –global user.email 이메일
포크한 저장소에 코드 올리기
git add .
git commit -m "initial commit"
git push -u origin main
- settings > github pages > source를 none이 아닌 main으로 바꾼다
- 50프로 할인 쿠폰: https://forms.gle/Y7rTP4qKw89NStkP7