JSON.stringify()
함수로 JSON(문자열)
타입으로 변경해주고, 읽기 전에 JSON.parse()
함수로 다시 객체로 변경 해주어야 한다.기본 문법
// 데이터 읽기 localStorage.getItem('key'); // 데이터 추가 localStorage.setItem('key', 'value'); // 데이터 삭제 localStorage.removeItem('key'); // 데이터 전체 삭제 localStorage.clear();
localStorage에 setItem
으로 객체나 배열의 데이터를 추가할 때는 JSON.stringify()
을 이용하여 문자열로 넣어주고, getItem
으로 데이터를 불러올 때는 JSON.parse()
로 다시 객체로 변경시켜서 꺼낸다.
아래의 코드는 useEffect()
를 사용하여 로컬 스토리지에 data
가 저장(추가) 될 때마다 로컬 스토리지에 저장되어 있는 데이터로 업데이트(재렌더링) 된다.
useEffect(() => {
// data(상태)가 변경될 때마다 data를 로컬 스토리지에 저장한다.
// 'localData'는 key 값이다.
window.localStorage.setItem('localData', JSON.stringify(data))
}, [data])
state
의 초기값(data)은 로컬 스토리지에 저장되어 있는 값이다. const [data, setData] = useState(() =>
// localStorage에서 localData를 불러오고 localData가 없다면 dummydata를 불러온다.
JSON.parse(window.localStorage.getItem('localData')) || dummyData
);
import { useState, useEffect } from "react";
function useLocalStorage(key, initialState) {
const [state, setState] = useState(
() => JSON.parse(window.localStorage.getItem(key)) || initialState
);
useEffect(() => {
window.localStorage.setItem(key, JSON.stringify(state));
}, [key, state]);
return [state, setState];
}
export default useLocalStorage;
// App.js
import React, { useState, useEffect } from 'react';
import './App.css'
import dummyData from './dummyData'
function App() {
// localStorage
const [data, setData] = useState(() =>
// localStorage에서 localData를 불러오고 localData가 없다면 dummydata를 불러온다.
JSON.parse(window.localStorage.getItem('localData')) || dummyData
);
useEffect(() => {
// data(상태)가 변경될 때마다 data를 로컬 스토리지에 저장한다.
window.localStorage.setItem('localData', JSON.stringify(data))
}, [data])
const [message, setMessage] = useState('');
// 데이터 추가
const addMessage = () => {
const newMessage = {
id: data.length + 1,
text: message,
};
// 기존의 데이터에 새로 입력한 데이터를 상단에 추가
setData([newMessage, ...data]);
// 데이터를 추가한 후 입력창 비우기
return setMessage('');
};
// 데이터 삭제
const deleteMessage = (id) => {
setData(data.filter((value) => value.id !== id));
}
const handleChangeMessage = (event) => {
setMessage(event.target.value)
};
return (
<div className='inputContainer'>
<input type='text' value={message} onChange={handleChangeMessage} />
<button onClick={addMessage}>추가</button>
<ul>
{data.map((value) =>
<li key={value.id}>
{value.text}
<button onClick={() => deleteMessage(value.id)}>삭제</button>
</li>
)}
</ul>
</div>
);
}
export default App;