728x90
λ°μν
π‘ μ€μ΅ ν¬μΈνΈ!
- κ°μ¬λμ localStorage μμ μ λ€μ νμ, "μ΅κ·Ό λ³Έ μν" κΈ°λ₯μ λ§λλ κ°μ΄λλ₯Ό νμ©νμ¬ λ΄κ° μκ°ν λλ‘ "μ΅κ·Ό λ³Έ μν" UI λ₯Ό λ§λ€κ³ κΈ°λ₯μ ꡬνν΄λ³΄μλ€.
- μ²μ μ΄ κΈ°λ₯μ λ§λ€ λλ§ ν΄λ λ§λ§νλλ°, μλ¬μ½λλ₯Ό μ½μ΄κ°λ©° μμ¬μ΄ λΆλΆμ νλνλ μΆκ°, μμ ν΄λκ°λ€λ³΄λ μ΄λλ§ κ½€ κ·Έλ΄μΈν ννλ‘ λ§λ€μ΄μ‘λ€.
π localStorage μ¬μ©λ² μμ보기
- μλ‘κ³ μΉ¨μ νλ©΄ JS νμΌλ€μ λͺ¨λ μ²μλΆν° λ€μ μ½μ΄λ€μ΄κΈ° λλ¬Έμ λΉμ°νκ²λ λͺ¨λ state μ λ°μ΄ν°λ μ΄κΈ°νλλ€.
- μ΄λ κ² state μ μ μ₯λ λ°μ΄ν°κ° μ΄κΈ°νλλ κ²μ΄ μ«λ€λ©΄ λͺ¨λ DB μ μ μ₯νλ©΄ λλλ°, λ§μ½ λ³λμ μλ²λ DB μ§μμ΄ μλ€λ©΄ localStorage μ μ μ₯νλ λ°©λ²μ΄ μλ€.
- localStorage λ λΈλΌμ°μ μ λͺ°λ μ 보λ₯Ό μ μ₯ν λ μ¬μ©ν μ μλ 곡κ°μ΄λ€.
π€ localStorage μ°Ύμ보기
- Chrome κ°λ°μλꡬμμ Application νμ λ€μ΄κ°λ©΄ μ’μΈ‘ Storage νμ λͺ©λ‘μΈ Local Storage λ₯Ό νμΈν μ μλ€.
- κ° μ¬μ΄νΈλ§λ€ 5MB μ λμ ν μ€νΈ, μ«μ λ°μ΄ν°λ₯Ό μ μ₯ν μ μμΌλ©° μ¬μ©μκ° λΈλΌμ°μ μ²μλ₯Ό νμ§ μλ μ΄μμ μꡬμ μΌλ‘ λ¨μμλ€.
π€ localStorage λ¬Έλ² μμ보기
// λ°μ΄ν° μΆκ°
localStorage.setItem('λ°μ΄ν°μ΄λ¦', 'λ°μ΄ν°');
// λ°μ΄ν° μ‘°ν
localStorage.getItem('λ°μ΄ν°μ΄λ¦');
// λ°μ΄ν° μμ
localStorage.removeItem('λ°μ΄ν°μ΄λ¦');
- JavaScript νμΌ μ΄λμλ μμ κ°μ λ¬Έλ²μ μ¬μ©νλ©΄ λ°μ΄ν° μ μΆλ ₯μ΄ κ°λ₯νλ€.
- λ°μ΄ν°λ₯Ό μΆκ°ν λμλ object μλ£νμ²λΌ key:value μ ννλ‘ λ°μ΄ν°κ° μ μ₯λλ€.
- μ λλ‘ μ μ₯μ΄ λμλμ§ νμΈνκ³ μΆλ€λ©΄ Application νμ localStorage μμ νμΈνλ©΄ λλ€.
π€ localStorage μ object / array μ μ₯νκΈ°
localStorage.setItem('obj', JSON.stringify({name:'Seoyun'}) );
- localStorage λ μμ ν ν μ€νΈ μλ£νλ§ μ μ₯μ΄ κ°λ₯νκΈ° λλ¬Έμ, object μλ£νμ΄λ array μλ£νμ λ°λ‘ μ μ₯νλ κ²μ΄ λΆκ°λ₯νλ€.
- νμ§λ§ κΌ object μλ£ν νΉμ array μλ£νμ μ μ₯ν΄μΌ νλ€λ©΄, ν μ€νΈ μλ£λ‘ μΈμν μ μλλ‘ λ°μ΄νλ₯Ό μ³μ JSON μ ννλ‘ λ°κΏμ€ λ€μ μ μ₯νλ©΄ λλ€.
- λ§€λ² λ°μ΄νλ₯Ό λΆμ¬μ£Όλ κ²μ λ²κ±°λ‘κΈ° λλ¬Έμ JSON.stringify() λΌλ ν¨μ μμ object μλ£νμ΄λ array μλ£νμ λ£μ΄μ£Όλ©΄ μ½κ² JSON ννλ‘ λ³νμ΄ κ°λ₯νλ€.
- μ΄μ μμ κ°μ΄ localStorage μ { "name" : "Seoyun" } μ΄λΌλ ννλ‘ μ μ₯λ κ²μ λ³Ό μ μλ€.
π€ localStorage μ μ μ₯λ object / array κΊΌλ΄μ΄ μ¬μ©νκΈ°
- μ΄λ κ² localStorage μ μ μ₯λ λ°μ΄ν°λ λ€μ κΊΌλμ λ JSON μ νν κ·Έλλ‘ λμ€κΈ° λλ¬Έμ object μλ£νμ΄λ array μλ£νμ²λΌ λ°μ΄ν°λ₯Ό μ‘°μνλ κ²μ΄ λΆκ°λ₯νλ€.
- λ°λΌμ, μ΄λ° JSON ννμ λ°μ΄ν°λ₯Ό λ€μ object μλ£ν νΉμ array μλ£νμΌλ‘ λ³νν΄μ£Όλ κ³Όμ μ΄ νμνλ° μ΄ λ JSON.parse() ν¨μλ₯Ό μ¬μ©νλ©΄ λλ€.
π μ΅κ·Ό λ³Έ μν UI λ° κΈ°λ₯ λ§λ€κΈ°
- μΌνλͺ° κ°μ κ³³μ 보면 μ΅κ·Ό λ³Έ μνμ΄λΌκ³ ν΄μ νΉμ μμΉμ μ¬μ©μκ° μ΄μ κ» λ³Έ μνλ€μ λμμ£Όλ κ²½μ°κ° μλ€.
- μ΄λ² μμ μμ λ°°μ΄ localStorage λ₯Ό νμ©ν΄μ μ΄λ° μ΅κ·Ό λ³Έ μν UI μ κΈ°λ₯μ λ§λ€μ΄λ³΄μλ€.
π€ μ΅κ·Ό λ³Έ μνλ€μ μμλλ‘ localStorage μ μ μ₯νκΈ°
- κ°μ¬λμ μ½λλ μ’μμ§λ§ λ΄κ° μκ°νλ λ°©μκ³Όλ μ‘°κΈ λ¬λΌμ λλ λ€λ₯Έ λ°©μμΌλ‘ μ½λλ₯Ό μμ±νλ€.
- λ΄κ° μκ°ν λ°©μμ λ€μκ³Ό κ°λ€.
- μΌλ¨ μ΅κ·Ό λ³Έ μνμ μ€λ³΅λλ μν μμ΄ μΈλ‘ μ λ ¬νμ¬ λ± 3κ°λ§ 보μ¬μ€λ€.
- μ΅κ·Ό λ³Έ μνμ μμλ 맨 μμ μ μΌ μ΅κ·Όμ λ³Έ μνμ΄ μ€κ² νλ€.
- λ§μ½ 보μλ μνμ λ€μ λ³΄κ² λλ€λ©΄ μ μΌ μ΅κ·Όμ λ³Έ κΈ°λ‘ κΈ°μ€μΌλ‘ μ€λ³΅ 체ν¬νμ¬, ν λ²λ§ μ΅κ·Ό λ³Έ μνμ νμνλ€.
(Set ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ μ μΌ νΈνλ°, μ΄ ν¨μλ μ€λ³΅μΈ κ²½μ° μ μμμ κΈ°λ‘μ λ¨κΈ°κ³ λ· μμ κΈ°λ‘μ μμ ν΄λ²λ¦¬λ―λ‘ μ½λλ₯Ό μμ±νλ λ°μ κ³ λ―Όμ μ’ λ§μ΄ νλ€.)
// μ 체 μ½λ 미리보기
useEffect(()=>{
if (localStorage.watched === undefined ) {
localStorage.setItem('watched', JSON.stringify([]));
}
let watched = JSON.parse(localStorage.getItem('watched'));
watched.unshift(id);
watched = [...new Set(watched)].slice(0,3);
localStorage.setItem('watched', JSON.stringify(watched));
}, [])
- μ¬μ©μκ° νΉμ μνμ ν΄λ¦νμ¬ μμΈ νμ΄μ§λ‘ μ μνλ©΄, κ·Έ μμΈ νμ΄μ§ λ΄μ μνμ΄ localStorage μ μ μ₯λμ΄μΌ νλ€.
- λ°λΌμ Detail Component κ° μμ±λμλ§μ κΈ°λ‘ν μ μκ² useEffect() μ μ½λλ₯Ό μμ±ν΄μ£Όμλ€.
- λ¨Όμ , μ΅κ·Ό λ³Έ μνλ€μ΄ 무μμΈμ§ κΈ°λ‘νλ κΈ°λ₯μ΄ νμνλ°, λλ watched λΌλ λ³μλͺ μΌλ‘ localStorage μ array νμμΌλ‘ κΈ°λ‘ν΄μ£ΌκΈ°λ‘ νλ€.
if (localStorage.watched === undefined ) {
localStorage.setItem('watched', JSON.stringify([]));
}
- μ΄ λ, μκ°ν΄μΌ ν κ²μ μ²μ μνμ ν΄λ¦νμ¬ μμΈ νμ΄μ§μ μ μνλ κ²½μ°μλ localStorage μ watched λΌλ array κ° μ‘΄μ¬νμ§ μμΌλ―λ‘(undefined μνμ ν΄λΉ) μ°μ λΉμ΄μλ watched λΌλ array λ₯Ό λ§λ€μ΄μ£Όμ΄μΌ νλ€λ κ²μ΄λ€.
let watched = JSON.parse(localStorage.getItem('watched'));
watched.unshift(id);
watched = [...new Set(watched)].slice(0,3);
localStorage.setItem('watched', JSON.stringify(watched));
- κ·Έλ λ€λ©΄ μ΄μ μ μνμ ν΄λ¦νμ¬ μμΈ νμ΄μ§μ μ μν μ μ΄ μλ€λ©΄?
- κ·Έλ¬λ©΄ μ§κΈ μμΈ νμ΄μ§μ url μ id νλΌλ―Έν°λ₯Ό watched λΌλ array μ μΆκ°ν΄μ£Όλ©΄ λλ€.
- λλ μ΅μ μμΌλ‘ μ λ ¬ν νμ μ€λ³΅μ μ κ±°νκ³ μΈ κ°λ₯Ό λ½μ μμμλΆν° μ΅μ μμΌλ‘ μ λ ¬ν κ±°λΌ μμ κ°μ΄ μ½λλ₯Ό μμ±ν΄μ£Όμλ€.
( push() ν¨μμ κ½νμ array λ₯Ό λ€μ§μ΄μΌ νλ Set() ν¨μ λ§κ³ λ€λ₯Έ λ°©λ²μ μ°Ύμμ μ€λ³΅μ ν΄μΌνλ κ³ λ―Όμ΄ κΈΈμ΄μ‘λ€....unshift() μ¨μ κ·Έλ₯ μ΅κ·Όμ λ³Έ μνμ watched 맨 μλΆλΆμ λΌμμ£Όλ©΄ λλ κ²μ...) - id λ μ΄μ μ usePrams() λ₯Ό μ¬μ©ν μ μ΄ μμΌλ―λ‘ κ·Έλλ‘ μ¬νμ©νλ€.
- μ μ½λλ₯Ό ν΄μνμλ©΄ λ€μκ³Ό κ°λ€.
- localStorage μ μ μ₯λ watched λ₯Ό λ€λ£¨κΈ° μν΄ JSON.parse() λ₯Ό μ¬μ©νμ¬ array ννλ‘ λ§λ ν watched λΌλ λ³μλͺ μΌλ‘ μ μ₯νλ€.
- μνμ ν΄λ¦ν΄μ μμΈ νμ΄μ§μ μ μν λλ§λ€, μ΅μ μμΌλ‘ μ μ₯λ μ μλλ‘ ν΄λΉ νμ΄μ§μ μν id λ₯Ό watched array μ 맨 μμΌλ‘ λ£λλ€.
- μ€λ³΅μ μ κ±°νκΈ° μν΄ new Set() μ λ΄κ³ spread λ¬Έλ²μΌλ‘ κ΄νΈλ₯Ό λ²κ²¨μ€ λ€μ, slice() λ₯Ό μ¬μ©νμ¬ 3κ°λ§ watched μ μ μ₯νλ€.
- μ μ₯ν watched λ₯Ό JSON.stringify() νμ¬ JSON μνλ‘ λ§λ λ€μ localStorage μ μ μ₯ν΄μ€λ€.
π€ μ΅κ·Ό λ³Έ μν UI λ§λ€κΈ°
- μ΅κ·Ό λ³Έ μν UI κ° λ©μΈ νμ΄μ§, μμΈ νμ΄μ§, μ₯λ°κ΅¬λ νμ΄μ§μμ λͺ¨λ 보μμΌλ©΄ ν΄μ, μμ Watched λΌλ μ΄λ¦μ Component λ‘ λ§λ€μ΄μ£Όμλ€.
- κ·Έλ¦¬κ³ UI λμμΈμ μ΄λ²μλ styled-components λΌμ΄λΈλ¬λ¦¬λ₯Ό μ΄μ©νμ§ μκ³ , scss νμΌμ λ§λ€μ΄μ μ§ννλ€.
- λλ΅μ μΌλ‘ λμμΈνλ κ³Όμ μ 미리 보면μ μ§ννκ³ μΆμ΄μ Watched.js, Watched.scss νμΌμ λ§λ νμ App.js μ import ν ν λΌμ°ν μ νμ¬ ν΄λΉ url μμ νλμ½λ©λΆν° μ§νν΄λ³΄μλ€.
π€ Watched Component λ₯Ό λ©μΈ νμ΄μ§μ import νκΈ°
- μ΄ κ³Όμ μμ νλνλ€...
- κΈ°μ‘΄μλ Data.js μ 3κ°μ λ°μ΄ν°λ§ μκ³ axios λ₯Ό μ΄μ©νμ¬ λΆλ¬μμλλ°, μμΈμ§ μ무리 λΆλ¬μλ 무νλ‘λ©μ²λΌ μλμ μ’ μ΄μνκ² νκΈ°μ κ·Έλ₯ λ°μ΄ν° μ 체λ₯Ό Data.js νμΌμ λ£μ΄μ£Όμλ€.
let [shoes, setShoes] = useState(Data.slice(0,3));
- μ΄λ‘ μΈν΄ κΈ°μ‘΄μ κΈ°λ₯μ λ¬Έμ κ° λ°μνμ§ μλλ‘ shoes λΌλ state κ° Data.js νμΌμμ λ°μ΄ν°λ₯Ό 3κ°λ§ κ°μ Έμ€λλ‘ μμ μ ν΄μ£Όμλ€.
// shoesAll state μμ±
let [shoesAll, setShoesAll] = useState(Data);
// Main Component λ‘ shoesAll, setShoesAll state μ μ‘
<Route exact path='/'>
<Main shoes={shoes} setShoes={setShoes} shoesAll={shoesAll} setShoesAll={setShoesAll}/>
</Route>
- κ·Έλ¦¬κ³ shoesAll μ΄λΌλ state λ₯Ό App.js νμΌμ λ§λ€μ΄μ shoesAll, setShoesAll λͺ¨λ Main Component λ‘ μ μ‘ν΄μ£Όμλ€.
<Watched shoesAll={props.shoesAll} setShoesAll={props.setShoesAll}/>
- μ΄μ Main.js νμΌμ μ λΉν μμΉμ Watched Component λ₯Ό λ£μ΄μ£Όλ©΄ λλ€.
- μ΄ λ, props λ‘ λ°μμ¨ shoesAll κ³Ό setShoesAll μ Watched.js μ μλ Watched Component μμ μ¬μ©ν μ μλλ‘ λ€μ μ μ‘μ ν΄μ£Όμλ€.
π€ Watched Component μ λ°μ΄ν°λ°μΈλ©νκΈ°
// μ 체 μ½λ 미리보기
function Watched (props) {
let watchedAll = JSON.parse(localStorage.getItem('watched'));
let findWatched = [];
if (watchedAll !== null){
for(let i = 0; i < watchedAll.length; i++) {
findWatched.push(props.shoesAll.find(function(item) {
return item.id === parseInt(watchedAll[i]);
}));
}
}
let history = useHistory();
return (
<div className='watched'>
<p className='item'>μ΅κ·Ό λ³Έ μν</p>
{
findWatched.map((watched, idx)=>{
return (
<div className="watched-item" key={idx} onClick={()=>{ history.push(`/detail/${watched.id}`) }}>
<img src={`https://codingapple1.github.io/shop/shoes${watched.id + 1}.jpg`} alt="item" />
<p className='name'>{watched.title}</p>
</div>
)
})
}
</div>
)
}
- λ€μν λ°λ³΅λ¬Έ μ¬μ©μ μ μμ΄ νμν΄μ, for λ°λ³΅λ¬Έκ³Ό map() ν¨μ λ λ€ μ¬μ©νμ¬ λ°μ΄ν°λ°μΈλ©μ ν΄λ³΄μλ€.
- μ΄μ μ μμΈ νμ΄μ§μμλ κΈ°μ‘΄ λ°μ΄ν°μ id μ url νλΌλ―Έν°μ ν΄λΉνλ id λ₯Ό λΉκ΅νμ¬ νλλ§ λ°μ΄ν°λ₯Ό μ°Ύμμ€λ κ²μ΄μλ€.
- μ΄λ²μλ μ μ¬νμ§λ§ μΌμΉνλ id μ λ°μ΄ν°λ₯Ό μ΅λ 3κ°λ₯Ό μ°ΎμμμΌνκΈ°μ, μ°ΎμλΈ object νμμ λ°μ΄ν°λ€μ findWatched λΌλ λ°°μ΄μ λ§λ€μ΄μ λ£μ΄μ£ΌκΈ°λ‘ νλ€.
- κ·Έλ¦¬κ³ κ·Έ μ°Ύμ λ°μ΄ν°λ₯Ό map() μ ν΅ν΄ λ°μ΄ν°λ°μΈλ©κΉμ§ ν΄μ£Όλ©΄ μλ£!
let watchedAll = JSON.parse(localStorage.getItem('watched'));
let findWatched = [];
if (watchedAll !== null){
for(let i = 0; i < watchedAll.length; i++) {
findWatched.push(props.shoesAll.find(function(item) {
return item.id === parseInt(watchedAll[i]);
}));
}
}
- λ¨Όμ μ μ½λλΆν° ν΄μνμλ©΄ λ€μκ³Ό κ°λ€.
- localStorage μ μ μ₯λ watched λΌλ array λ₯Ό λ°μ΄ν° μ‘°μμ΄ κ°λ₯νλλ‘ JSON.parse() νμ¬ λ°μμ¨ λ€μ watchedAll μ΄λΌλ λ³μλͺ μΌλ‘ μ μ₯νλ€.
- μ΄μ watched μ λ΄κ²¨μλ id λ₯Ό μλ―Ένλ μμλ€κ³Ό κΈ°μ‘΄ λ°μ΄ν°μ id λ₯Ό λΉκ΅νμ¬ μΌμΉνλ κ²λ§ λ΄μ findWatched λΌλ λΉ array λ₯Ό λ§λ λ€.
- watchedAll μ΄ λΉμ΄μλ κ²½μ° μκΈΈ μ€λ₯κ° μκΈ°λ―λ‘ null κ°μ΄ μλ λμλ§ for λ°λ³΅λ¬Έμ λλ €μ€λ€.
- props λ‘ λ°μμ¨ shoesAll μ΄λΌλ state μμμ id μ watchedAll[0], watchedAll[1]... μ λ¬Έμλ₯Ό μ«μλ‘ λ³νν κ°μ λΉκ΅νμ¬ μΌμΉνλ κ²λ§ findWatched μ push() ν¨μλ‘ μΆκ°ν΄μ€λ€.
function Watched (props) {
let history = useHistory();
return (
<div className='watched'>
<p className='item'>μ΅κ·Ό λ³Έ μν</p>
{
findWatched.map((watched, idx)=>{
return (
<div className="watched-item" key={idx} onClick={()=>{ history.push(`/detail/${watched.id}`) }}>
<img src={`https://codingapple1.github.io/shop/shoes${watched.id + 1}.jpg`} alt="item" />
<p className='name'>{watched.title}</p>
</div>
)
})
}
</div>
)
}
- μ΄μ findWatched μ μ μ₯λ λ°μ΄ν°λ₯Ό κ°μ§κ³ map() ν¨μλ‘ λ°λ³΅λ¬Έμ λλ € νμν μμΉμ λ°μ΄ν°λ°μΈλ©μ ν΄μ€λ€.
- μ΄ λ onClick μμ±μ μΆκ°νμ¬ useHistory() κΈ°λ₯μ λ£μ΄μ£Όμλ€.
- κ·Έλμ μ΅κ·Ό λ³Έ μνμ ν΄λΉ μ΄λ―Έμ§ λ° μνλͺ μ ν΄λ¦νλ©΄ μμΈ νμ΄μ§λ‘ λ°λ‘ μ΄λν μ μκ² λμλ€.
728x90
λ°μν
'[κ°λ°] Practice > React' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[React] props λμ redux μ¬μ©ν΄λ³΄κΈ°_5 (0) | 2022.03.29 |
---|---|
[React] props λμ redux μ¬μ©ν΄λ³΄κΈ°_4 (0) | 2022.03.29 |
[React] props λμ redux μ¬μ©ν΄λ³΄κΈ°_3 (0) | 2022.03.29 |
[React] props λμ redux μ¬μ©ν΄λ³΄κΈ°_2 (0) | 2022.03.28 |
[React] props λμ redux μ¬μ©ν΄λ³΄κΈ° (0) | 2022.03.28 |