지출 항목을 수정하는 기능을 구현하던 중에 inputValue를 미리 설정해두고 추가적인 input이 있으면 수정되도록 구현하고 있었는데, 이상하게 styled-component로 제작한 Input은 추가적인 입력이 안 되는 반면, input 태그는 추가적인 입력이 너무나도 잘되었다.
코드
//PostDetailPage.jsx
<InputWrapper>
<Label>날짜</Label>
<Input
type="text"
value={modifiedExpenditure.date}
className="date"
onChange={handleModifiedExpenditure}
/>
</InputWrapper>
<InputWrapper>
<Label>항목</Label>
<input
type="text"
value={modifiedExpenditure.item}
className="item"
onChange={handleModifiedExpenditure}
/>
</InputWrapper>
input에 사용할 custom hook을 만들었는데 객체의 업데이트를 target의 className으로 value값을 업데이트 했다.
커스텀 훅(useInput) 코드
//useInput.js
function useInput(initialState) {
const [value, setValue] = useState(initialState);
const handler = ({target}) => {
setValue((prev)=>{
return {...prev, [target.className]: target.value}
})
}
return [value, handler];
}
그런데 styled-component는 className이 임의로 지정되기 때문에 setValue가 내 의도대로 되지 않은 것이였다!
className 대신 태그의 다른 속성 중 하나인 dataSet를 활용하여 데이터를 전달하였다.
코드
//PostDetailPage.jsx
<InputWrapper>
<Label>날짜</Label>
<Input
type="text"
value={modifiedExpenditure.date}
data-type="date"
onChange={handleModifiedExpenditure}
/>
</InputWrapper>
<InputWrapper>
<Label>항목</Label>
<Input
type="text"
value={modifiedExpenditure.item}
data-type="item"
onChange={handleModifiedExpenditure}
/>
</InputWrapper>
//useInput.js
function useInput(initialState) {
const [value, setValue] = useState(initialState);
const handler = ({target}) => {
setValue((prev)=>{
return {...prev, [target.dataset.type]: target.value}
})
}
return [value, handler];
}
className의 용도가 이렇게 사용하는 게 아닌 걸 알면서도 다른 방법이 생각 안 난다는 이유로 코드를 작성하다가 결국 문제가 터졌다...
태그의 속성도 사용하는 목적에 맞게 사용하자!