개요
라벨스티커 특성상 작성해야할 문자열이 많기에, 피치못하게 새로고침 되는 상황에서 문자열들이 세션에 저장될 수 있도록 만들었다.
스티커를 만들 때, 한번에 만들 것이라고 짐작하고, 로컬이 아닌 세션에 만드는 것으로 결정했다.
값 세션에 저장 & 불러오기
const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
window.sessionStorage.setItem("inputValue", JSON.stringify(inputValue));
};
onSubmit버튼을 만들고, 버튼을 누르면 세션이 저장될 수 있게 만들었다.
const [inputValue, setInputValue] = useState(
JSON.parse(sessionStorage.getItem("inputValue") || "{}"),
);
useEffect(() => {
window.sessionStorage.setItem("inputValue", JSON.stringify(inputValue));
}, [inputValue]);
value의 초기값을 세션의 저장된 값이거나, 빈 객체를 반환하도록 만들고,
useEffect를 사용해 inputValue가 변경될때마다 세션에 목록이 다시 저장되도록 만들었다.
JSX
<input type="text" name={name} value={inputValue[`${name}`]} />
input의 value에서 값을 불러온다
참조
const onchange = (e: React.FormEvent<HTMLFormElement>) => {
const { name, value } = e.target as HTMLInputElement;
setInputValue({ ...inputValue, [name]: value });
};
onChange이벤트에서 값을 저장할 때 { key : 값 }의 형태로 저장했기 때문에, 불러올 때에는 해당 키를 입력하기만 하면 값을 불러올 수 있다.
ERROR
input 태그 사용시 value속성이 고정값이 아니라 나는 에러. 나의 경우엔 sessionStorage가 비워지자 나옴
해결책
<input type="text" name={name} value={inputValue[`${name}`]} />
<input type="text" name={name} defaultValue={inputValue[`${name}`]} />
에러에서 언급하는데로, value를 defaultValue로 변경하면 된다.