리액트(React), 레코드 폼과 레코드 리스트로 컴포넌트 분리
를 fork 해서
- NumberRecordListItem 분리 [O] // 값들 나눠주는거
- 수정 버튼 넣기 [O]
>{editModeStatus ? editView : readView}
- 수정 버튼 누르면 다시 일반모드로 변경 [O]
> 수정모드랑 일반모드
> editModeStatus 가 t이면 editView, f이면 readView (useState(false)기본)
- 수정모드에서 input 만들기 [O]
> <input type="number" placeholder="숫자입력해줘!!!!!"/>
- 수정모드에서 input 값 변경 가능하도록 [ ]
> const [inputNumberValue, setInputNumberValue] = useState(number);
> input에 들어갈 값을 지정하려고! 기본을 number로 넣어줘!
> 수정된 값을 바꾸기 위해서 input값이 바뀌는 이벤트를 넣어줘
> onChange={(e) => setInputNumberValue(e.target.value)}
- 수정 완료 누르면 원래 보이던 값이 변경되도록 [ ]
- 수정시 음수 금지 [O]
> 수정 input에 min을 0으로 줘(화살표로)
> if (modifiedNumber < 0 ) { // 0보다 작으면
setInputNumberValue("0"); // input값 0으로 만들어~
} else { setRecordNums(recordNums.map((_number,_index) => _index == index ? inputNumberValue : _number));
setEditModeStatus(false);}
- 수정 취소시 input 값을 초기화 [O]
> setInputNumberValue(number);
> 원래 값으로 돌려줘!
↓
console.clear();
import React, { useState } from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
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);
}
const modifiedNumber = parseInt(inputNumberValue);
if (modifiedNumber < 0 ) {
setInputNumberValue("0");
} else { setRecordNums(recordNums.map((_number,_index) => _index == index ? inputNumberValue : _number));
setEditModeStatus(false);
}
};
const modifycancelNumber = () => {
setInputNumberValue(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={modifycancelNumber}>수정 취소</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}
/>
</>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
'JavaScript > React' 카테고리의 다른 글
React - 할 일 폼 만들기(1)_배열, 컴포넌트 분리 (1) | 2024.03.26 |
---|---|
React - 자동 입력 (0) | 2024.03.26 |
React - 일반모드, 토글모드 (1) | 2024.03.23 |
React - 함수 분리, 매개변수 (0) | 2024.03.23 |
React - 함수 호출, 컴포넌트 분리 (0) | 2024.03.21 |