const NumberRecorderForm = ({ num, setNum, saveNumber, clearNumbers }) => {
return (
<>
<div>
<span>숫자 : {num}</span>
<button onClick={() => setNum(0)}>취소</button>
</div>
<div>
<button onClick={() => setNum(num + 1)}>증가</button>
<button
onClick={() => {
num == 0 ? setNum(0) : setNum(num - 1);
}}
>
감소
</button>
<button onClick={saveNumber}>기록</button>
<button onClick={clearNumbers}>전체기록삭제</button>
</div>
</>
);
};
const NumberRecorderList = ({ recordNums, setRecordNums, removeNumber }) => {
return (
<>
<div>
{recordNums.length == 0 ? (
<span>기록 없음</span>
) : (
<>
<h5>기록</h5>
<ul>
{recordNums.map((number, index) => (
<NumberRecorderListItem
key={index}
number={number}
recordNums={recordNums}
setRecordNums={setRecordNums}
index={index}
removeNumber={removeNumber}
/>
))}
</ul>
</>
)}
</div>
</>
);
};
const NumberRecorderListItem = ({
index,
number,
recordNums,
setRecordNums,
removeNumber
}) => {
const [inputNumberValue, setInputNumberValue] = useState(number);
const [editModeStatus, setEditModeStatus] = useState(false);
const modifyNumber = () => {
if (number == inputNumberValue) return;
if (inputNumberValue == ''){
setInputNumberValue(number);
}
setRecordNums(recordNums.map((_number,_index) => _index == index ? inputNumberValue : _number));
setEditModeStatus(false);
};
const readView = (
<>
<button onClick={() => setEditModeStatus(true)}>수정</button>
</>
);
const editView = (
<>
<input
type="number"
placeholder="숫자 써"
min="0"
value={inputNumberValue}
onChange={(e) => setInputNumberValue(e.target.value)}
/>
<button onClick={modifyNumber}>수정 완료</button>
<button onClick={() => setEditModeStatus(false)}>수정 취소</button>
</>
);
return (
<>
<li>
<span>
{index + 1}번 : {number}
</span>
<button onClick={() => removeNumber(index)}>삭제</button>
{editModeStatus ? editView : readView}
</li>
</>
);
};
const App = () => {
const [num, setNum] = useState(0);
const [recordNums, setRecordNums] = useState([10, 20, 30]);
const saveNumber = () => {
setNum(0);
setRecordNums([...recordNums, num]);
};
const removeNumber = (index) => {
setRecordNums(recordNums.filter((_, _index) => _index != index));
};
const clearNumbers = () => {
setRecordNums([]);
};
return (
<>
<NumberRecorderForm
num={num}
setNum={setNum}
saveNumber={saveNumber}
clearNumbers={clearNumbers}
/>
<NumberRecorderList
recordNums={recordNums}
setRecordNums={setRecordNums}
removeNumber={removeNumber}
/>
</>
);
};
const App = () => {
const [inputValue, setInputValue] = useState(0);
const handleInputChange = (e) => {
setInputValue(parseInt(e.target.value));
};
return (
<>
<form className="h-full flex items-center justify-center gap-x-[10px]" onSubmit={(e) => e.preventDefault()}>
<input
type="number"
min="1"
onChange={handleInputChange}
value={inputValue}
placeholder="Type here"
className="input input-bordered w-full max-w-xs"
/>
<button
type="submit"
onClick={() => setInputValue(inputValue + 1)}
className="btn btn-outline btn-primary"
>
증가
</button>
</form>
</>
);
};
const TodoWriteForm = ({ setNewTodoTitle, newTodoTitle, addTodo }) => {
return (
<div className="flex gap-x-3">
<input
className="input input-bordered"
type="text"
placeholder="할 일 적어"
value={newTodoTitle}
onChange={(e) => setNewTodoTitle(e.target.value)}
/>
<button className="btn btn-primary" onClick={addTodo}>
할 일 추가
</button>
</div>
);
};
const App = () => {
const [todos, setTodos] = useState([]);
const [newTodoTitle, setNewTodoTitle] = useState("");
const addTodo = () => {
if(newTodoTitle.trim().length == 0) return;
setTodos([...todos, newTodoTitle]);
setNewTodoTitle("");
};
return (
<>
<TodoWriteForm
newTodoTitle={newTodoTitle}
setNewTodoTitle={setNewTodoTitle}
addTodo={addTodo}
/>
<hr />
<div>{JSON.stringify(todos)}</div>
</>
);
};
리액트(React), 레코드 폼과 레코드 리스트로 컴포넌트 분리
를 fork 해서
- NumberRecordListItem 분리 [o ]
- 수정 버튼 넣기 [ o]
- 수정 버튼 누르면 다시 일반모드로 변경 [ o]
- 수정모드에서 input 만들기 [o ]
- 수정모드에서 input 값 변경 가능하도록 [o ]
- 수정 완료 누르면 원래 보이던 값이 변경되도록 [ o]
- 수정시 음수 금지 [ ]
- 수정 취소시 input 값을 초기화 [ ]
gpt를 맛본 당신.
이젠 gpt없이 살아갈 수 없다.