๊ธฐ์กด์ input์ฐฝ 3๊ฐ์ ๋ฑ๋กํ๊ธฐ ๋ฒํผ์ ๋ง๋ค์๋ค. ์ด๋ฒ์๋ ๋ชจ๋ input์ฐฝ์ ๋ด์ฉ์ ์
๋ ฅํ๋ฉด ๋ฒํผ์ ์๊น
์ด ๋ฐ๋๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์๋ค. ์ฐธ๊ณ ๋ก ์์ค์ฝ๋๋ container, presenter, styles ํ์ผ๋ก ๋๋์ด์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
//BoardWrite.container.js
import { useState } from "react";
import { useMutation } from "@apollo/client";
import BoardWriteUI from "./BoardWrite.presenter";
export default function BoardWrite(props) {
const [isActive, setIsActive] = useState(false);
//presenter ํ์ผ์ ๋๊ฒจ์ค. props drilling.
const [writer, setWriter] = useState("");
const [title, setTitle] = useState("");
const [contents, setContents] = useState("");
function onChangeWriter(event) {
setWriter(event.target.value);
if (writer && title && contents) {
setIsActive(true);
}
}
function onChangeTitle(event) {
setTitle(event.target.value);
if (writer && title && contents) {
setIsActive(true);
}
}
function onChangeContents(event) {
setContents(event.target.value);
if (writer && title && contents) {
setIsActive(true);
}
}
return (
<div>
<BoardWriteUI
onClickSubmit={onClickSubmit}
onChangeWriter={onChangeWriter}
onChangeTitle={onChangeTitle}
onChangeContents={onChangeContents}
isActive={isActive}
// isActive๋ผ๋ state๋ฅผ isActive๋ผ๋ ํค ๊ฐ์ ๋ด์์ค.
/>
</div>
);
//BoardWrite.presenter.js
import { Btn } from "./BoardWrite.styles";
export default function BoardWriteUI(props) {
return (
<div>
<div>
์์ฑ์: <RedInput type="text"
onChange={props.onChangeWriter} />
์ ๋ชฉ: <input type="text"
onChange={props.onChangeTitle} />
๋ด์ฉ: <input type="text"
onChange={props.onChangeContents} />
<Btn isActive={props.isActive}
onClick={props.onClickSubmit}>
๋ฑ๋กํ๊ธฐ
</Btn>
;
</div>
</div>
);
}
//BoardWrite.styles.js
import styled from "@emotion/styled";
export const Btn = styled.button`
background-color: ${(props) => {
//ํ์ดํ ํจ์: BoardWrite.presenter.js์์ props ๋ฐ์์์ค.
return props.isActive ? "yellow" : "";
// ์์์์ ๋น์ด์๋ ๊ฐ -> ํ์
}};
`;
์ด๋ ๊ฒ ์์ฑํด์ค ๊ฒฐ๊ณผ ์์ฑ์, ์ ๋ชฉ, ๋ด์ฉ input ์ฐฝ ์์ ์ฐจ๋ก๋๋ก๊ฐ ์๋๋ผ ๋ฌด์์์ ์์๋ก ์ฑ์๋ฃ์์ ๋์๋ ๋ฒํผ์ ์๊น์ด ๋ฐ๋์ง ์๋ ๋ฌธ์ ์ ์ด ์๊ฒผ๋ค.
์์ธ์ ์๊ธฐ ์ํด์๋ setState
์ ํน์ง์ ์์์ผ ํ๋ค.
setState๋ ๋น๋๊ธฐ๋ก ์๋ํ๋ค. state๊ฐ์ ๋ฐ๊พธ๊ณ ๋ฐ๋ state ๊ฐ์ผ๋ก html์ ๋ค์ ๊ทธ๋ ค์ฃผ๋๋ฐ(๋ฆฌ๋ ๋๋ผ ํจ), ์ด๋ ์์ ์ ์ฅ์๋ผ๋ ๊ณณ์ ์ฝ๋๋ฅผ ๋๊น์ง ์ฝ์ ๋๊น์ง ๋ฐ๋ state ๊ฐ์ ์ ์ฅํด๋์๋ค๊ฐ ํ๋ฒ์ ๋ฐ๊ฟ์ ์ถ๋ ฅํ๋ค. ์๋ ์์๋ฅผ ๋ณด์.
function onClickCount() {
setCount(5)
setCount(7)
setCount(9)
setCount(3)
}
setState(setCount)๊ฐ ๋์ฌ ๋๋ง๋ค ์์์ ์ฅ๊ณต๊ฐ์ state์ธ count๊ฐ 5๋ก ์ ์ฅ๋๋๋ก ํ๋ค. ์์์ ์ฅ๊ณต๊ฐ์ 5, 7, 9, 3 ๋์ ํด๋๋ค๊ฐ 3์ผ๋ก ํจ์๊ฐ ๋๋๋ฉด 1๋ฒ๋ง ๋ฆฌ๋ ๋ํ๋ค. ๋งค๋ฒ ๋นํจ์จ์ ์ผ๋ก ๋ฆฌ๋ ๋ํ์ง ์๋๋ค.
๋ฌธ์ ๋, ์์์ ์ฅ์์ ์ ์ฅํด๋๋ ๋์์๋ ์ฝ๋๊ฐ ๋๋์ง ์๋ ํ ๋น ๊ฐ์ ์ถ๋ ฅํ๋ค๋ ๊ฒ์ด๋ค. ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ฝ๋๋ก ๋์๊ฐ๋ณด์.
function onChangeWriter(event) {
setWriter(event.target.value);
if (writer && title && contents) {
setIsActive(true);
}
}
function onChangeTitle(event) {
setTitle(event.target.value);
if (writer && title && contents) {
setIsActive(true);
}
}
function onChangeContents(event) {
setContents(event.target.value);
if (writer && title && contents) {
setIsActive(true);
}
}
setState(event.target.value)
์์ ์
๋ ฅํ ๊ฐ์ด ์์์ ์ฅ๊ณต๊ฐ์ ์ ์ฅ๋๊ณ , ์ค์ ๊ฐ์ด ๋ฐ๋์ง๋ ์์ ์ํ๋ก if ๋ฌธ์์ ๊ฒ์ฆ์ ํ๋ค. ํ์ง๋ง ํจ์๊ฐ ์์ง ๋๋์ง ์์์ ๋์๋ setState๊ฐ ๋น ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๊ฒ์ฆ ๊ณผ์ ์์ ๋น ๊ฐ์ด ๋ค์ด๊ฐ์ ๊ฒ์ฆ์ ํ๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์กฐ๊ฑด๋ฌธ์ด ์ฑ๋ฆฝํ์ง ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ input ์ฐฝ์ ๊ฐ์ด ๋ค์ด์์ ๋ ์์์ ์ฅ๊ณต๊ฐ์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ฅผ if ๋ฌธ ๊ฒ์ฆ ์ ๋ฐ๋ก ๊บผ๋ด์ ์ฌ์ฉํด์ฃผ๋ฉด ๋น ๊ฐ์ผ๋ก ๊ฒ์ฆ์ ํ์ง ์์ ์ ์๋ค!
function onChangeWriter(event) {
setWriter(event.target.value);
if (event.target.value && title && contents) {
setIsActive(true);
}
}
function onChangeTitle(event) {
setTitle(event.target.value);
if (writer && event.target.value && contents) {
setIsActive(true);
}
}
function onChangeContents(event) {
setContents(event.target.value);
if (writer && title && event.target.value) {
setIsActive(true);
}
}
์ค๋์ ๋๋ ์ : 'ํ์ฑํ ๋ฒํผ ๋ง๋ค๊ธฐ' ์ค์ต์ '๊ฒ์ํ ๋ง๋ค๊ธฐ'์๋ ์ ์ฉํ ์ ์๊ฒ ๋์๋ค. ์ค๋ ๋ฐฐ์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ํ์์ ์ผ๋ก ์ฑ์์ผ ํ๋ ๋ด์ฉ์ ๋ค ์ฑ์ ์ ๋ ๋ฒํผ์ ์์์ ๋ฐ๊พธ์ด์ ์ฌ์ฉ์ ์ ์ฅ์์ ๋ณด๋ค ์ง๊ด์ ์ธ UI๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ setState์ ์๋ฆฌ๋ฅผ ๋ชฐ๋๋ค๋ฉด ํด๊ฒฐํ์ง ๋ชปํ์ ์๋ฌ ์ฌํญ๊น์ง ์์ ํ๋ค. ๋จ์ํ๊ฒ ์์ฑ์, ์ ๋ชฉ, ๋ด์ฉ์ ์ฐจ๋ก๋๋ก ์ ๋ ฅํ๋ฉด ๋ฒํผ์ ์์์ด ๋ฐ๋๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ณ , ๊ทธ๊ฒ๋ค์ ์์๋๋ก ๋ฃ์ง ์์์ ๋์๋ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๊ฐํ์ง ๋ชปํ๋ค. ์ด๋ ๊ฒ ๋ค์ํ ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํด์ ๊ธฐ๋ฅ์ ํ์ (์๋ฌ)์ ์บ์นํ๋ ๊ฒ ๋ํ ๊ฐ๋ฐ์์๊ฒ ๊ผญ ํ์ํ ํ๋๋ผ๋ ๊ฒ์ ๋ฐฐ์ ๋ค. ์ด๋ ํ ๊ฐ๋ ์ ์๋ฆฌ๋ฅผ ๊ณต๋ถํ๋ ๊ฒ์ ์ํํ ํ์ง ๋ง๊ณ , ์ฌ์ํ ์๋ฌ๊น์ง๋ ์บ์นํ์!!