React에서 단일 진실 공급원
React 애플리케이션의 모든 변경 가능한 데이터에는 하나의 진실 공급원이 있어야 합니다. 이 말은, 두 개의 상태가 있고 하나의 상태가 다른 하나를 통해 계산될 수 있다면, 그중 하나는 불필요하므로 제거해야 한다는 의미입니다.
예를 들어 이를 논의해 봅시다. 예를 들어, 두 개의 입력 필드가 있다고 가정합니다: 첫 번째에는 화씨 온도를 입력하고, 두 번째에는 섭씨 온도를 입력합니다. 우리는 두 입력 필드가 동기화되기를 원합니다: 한 입력 필드에 온도를 입력하면 두 번째 입력 필드도 그에 따라 변경되어야 합니다.
잘못된 접근 방식은 두 개의 상태를 도입하는 것입니다: 하나는 화씨 온도를 위한 상태, 다른 하나는 섭씨 온도를 위한 상태입니다. 왜 잘못되었나요: 왜냐하면 하나의 온도는 다른 하나로부터 계산되므로, 데이터 저장소는 하나의 상태여야 하기 때문입니다.
설명된 과제를 구현하세요.
어떤 프로그래머가 배열 요소의 합계를 출력하는 다음 코드를 작성했습니다:
function getSum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
function Calculator() {
const [value, setValue] = useState('');
const [nums, setNums] = useState([1, 2, 3]);
const [sum, setSum] = useState(6); // 배열 nums 요소의 합계
function handleChange(event) {
setValue(event.target.value);
}
function handleBlur(event) {
setNums([...nums, event.target.value]); // 배열에 요소 추가
setSum(getSum([...nums, event.target.value])); // 합계 재계산
}
return <div>
<p>{sum}</p>
<input value={value} onChange={handleChange} onBlur={handleBlur} />
</div>;
}
이 코드의 문제점은 무엇인가요? 수정하세요.
어떤 프로그래머가 배열 요소 편집을 위해 다음 코드를 작성했습니다:
function App() {
const [notes, setNotes] = useState([1, 2, 3, 4, 5]);
const [editNum, setEditNum] = useState(null);
const [value, setValue] = useState('');
const result = notes.map((note, index) => {
return <p key={index} onClick={() => startEdit(index)}>
{note}
</p>;
});
function startEdit(index) {
setEditNum(index);
setValue(notes[index]); // 편집 중인 요소의 텍스트를 별도 상태에 기록
}
function changeItem(event) {
setValue(event.target.value);
setNotes([...notes.slice(0, editNum), event.target.value,...notes.slice(editNum + 1)]);
}
return <div>
{result}
<input value={value} onChange={changeItem} />
</div>;
}
이 코드의 문제점은 무엇인가요? 수정하세요.