728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ๊ฐ์ฌ๋์ด ์ด๋ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ๋ผ๊ณ ํ ๋๋ง๋ค ํ๋์ฉ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์๋ค.
- ๋ฐฐ์ด ๋ด์ฉ์ ํ ๋๋ก ํผ์์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ค๋ฅ์์ด ๋ง๋ค์ด ์ถ๊ฐํด์ ๋งค์ฐ ๋ฟ๋ฏํ๋ค.
(์ฌ์ง์ด ์ ๋๋ก ์ ๋์ค๋ ๋ถ๋ถ์ ๊ฐ์ฌ๋์ด ์ ๊ณตํด์ค ๋ฐ์ดํฐ๋ผ์ ์ด์ฉ ์ ์์๋ค...์ ๊ฑฐ๋ ์ง์ ๊ตฌ๊ธ๋งํ๋ฉฐ ๋ง๋ค๊ธฐ์ ๊ณต๋ถํ๊ณ ์๋ ํ์ฌ ์๋ฒฝ 5์...) - ์ง๊ธ ๋ณด๋ "๋ก๋ฉ์ ์คํจํ์ต๋๋ค." ๋ผ๋ ๋ฌธ๊ตฌ๋ณด๋ค "๋์ด์ ์ํ์ด ์์ต๋๋ค." ๋ก ์์ฑํ ๊ฑธ ๊ทธ๋ฌ๋ค. ์์ ํด๋ฌ์ผ์ง..
๐ "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ ๋๋ฅผ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒฝ๋ก์์ ๋ฐ์ดํฐ ๋ฐ์์์ ์ํ ๋ ์ด์์์ ์ถ๊ฐํ๊ธฐ
- ์ด ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ ์ ๊ฐ์ฌ๋์ด count ๊ธฐ๋ฅ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค๋ฉฐ ์ฝ๊ฐ์ ํํธ๋ฅผ ์ฃผ์ จ๋ค.
- ๊ฐ์ฌ๋์ด ์ ๊ณตํ ๋ฐ์ดํฐ ๊ฒฝ๋ก๋ json ํ์ผ๋ช
์ด 1, 2, 3 ๊ณผ ๊ฐ์ด ๋ชจ๋ ์ซ์๋ก ๋๋๋ค๋ ๊ฒ์ด์๋ค.
- https://codingapple1.github.io/shop/data1.json
- https://codingapple1.github.io/shop/data2.json
- https://codingapple1.github.io/shop/data3.json
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import axios from 'axios';
function App(){
let [count, setCount] = useState(2);
return (
<button className="btn btn-primary" onClick={()=>{
axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
.then((result)=>{
setCount(count+1);
let newData = result.data;
props.setShoes([...props.shoes, ...newData]);
})
.catch(()=>{ ์์ฒญ ์คํจ ์ ์คํํ ์ฝ๋ })
}}>์ํ ๋๋ณด๊ธฐ</button>
)
}
- ์ฐ์ data1.json ํ์ผ์ ๋ฐ์ดํฐ๋ ์ด๋ฏธ shoes ๋ผ๋ state ์ ๋ด๊ฒจ์์ด ๋ธ๋ผ์ฐ์ ์ ์ฒซ ์ค์ 3๊ฐ์ ๋ ์ด์์์ผ๋ก ๋์ค๊ณ ์์ผ๋ฏ๋ก, ๋๋ data2.json ํ์ผ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ผ ํ๋ค.
- ์ฆ, ๊ฒฝ๋ก ๋ถ๋ถ์ data ๋ค์ ์ซ์๊ฐ 2, 3 ๊ณผ ๊ฐ์ ์์ผ๋ก ์ซ์๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ฏ๋ก, ๋จผ์ useState() ๋ฅผ ํ์ฉํ์ฌ count ๋ผ๋ state ๋ฅผ ๋ง๋ค์ด์ค ํ ๊ฒฝ๋ก์ data ๋ค์ ${count} ๋ผ๊ณ ์์ฑํด์ฃผ์๋ค.
- ๊ทธ๋ฌ๊ณ ๋์ count ๋ผ๋ state ์ ์ด๊ธฐ๊ฐ์ผ๋ก 2๋ฅผ ๋ฃ์ด์ค ๋ค์, ์์ฒญ์ด ์ฑ๊ณตํ ๋๋ง๋ค setCount() ์ count + 1 ํ ๊ฐ์ ๋ฃ์ด์ฃผ์๋ค.
- ๊ทธ๋ฌ๋ฉด ๋ฒํผ์ 1๋ฒ ๋๋ ์ ๋๋ count ๊ฐ 2์ธ ์ํ์์ ํด๋ฆญํ ๊ฒ์ด๋ฏ๋ก data2.json ์ผ๋ก GET ์์ฒญ์ ํ๊ณ , ์์ฒญ์ด ์ฑ๊ณตํ์ฌ count ๊ฐ 3์ผ๋ก ๋ฐ๋๋ค.
- ๊ทธ ์ํ์์ ๋ฒํผ์ 1๋ฒ ๋ ๋๋ฅด๋ฉด count ๊ฐ 3์ธ ์ํ์์ ํด๋ฆญํ ๊ฒ์ด๋ฏ๋ก data3.json ์ผ๋ก GET ์์ฒญ์ ํ๊ณ , ์์ฒญ์ด ์ฑ๊ณตํ์ฌ count ๊ฐ 4๋ก ๋ฐ๋๋ค.
- ์ด๋ฐ์์ผ๋ก ๋ง์ฝ data4.json, data5.json ... ์ด๋ผ๋ ๊ฒฝ๋ก์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๊ณ์ํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ํ ๋ ์ด์์์ ์ถ๊ฐํ ์ ์๋ ๊ฒ์ด๋ค.
๐ ๋ก๋ฉ์ฐฝ UI ๋์ฐ๊ธฐ ๋ฐ ์จ๊ธฐ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import axios from 'axios';
import styled from 'styled-components';
let Loading = styled.div`
font-size : 20px;
font-weight : bold;
color: #484848;
padding: 15px 20px;
background : #eee;
border-radius : 5px;
margin : 10px 0;
`
function App(){
let [load, setLoad] = useState(false); // ๋ก๋ฉ์ฐฝ UI ๊ธฐ๋ณธ ์ํ๋ ์ ๋ณด์ด๊ฒ!
return (
{
// ๋ก๋ฉ์ค์ผ ๋ ๋ก๋ฉ์ฐฝ UI ๊ฐ ๋ณด์ด๊ณ , ์๋ ๋๋ ๋ก๋ฉ์ฐฝ UI ๊ฐ ๋ณด์ด์ง ์๋๋ค.
load == true ? (<Loading>๋ก๋ฉ์ค์
๋๋ค...</Loading>) : null
}
<button className="btn btn-primary" onClick={()=>{
setLoad(true); // "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ก๋ฉ์ฐฝ UI ๋ณด์ด๊ฒ!
axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
.then((result)=>{
setLoad(false); // GET ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด ๋ก๋ฉ์ฐฝ UI ์ ๋ณด์ด๊ฒ!
})
.catch(()=>{
setLoad(false); // GET ์์ฒญ์ด ์คํจํ๋ฉด ๋ก๋ฉ์ฐฝ UI ์ ๋ณด์ด๊ฒ!
})
}}>์ํ ๋๋ณด๊ธฐ</button>
)
}
- ๋จผ์ ๋ก๋ฉ์ฐฝ UI ๋ฅผ styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค์ด์ฃผ์๋ค.
(styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฐฉ๋ฒ ๋ณด๋ฌ๊ฐ๊ธฐ ํด๋ฆญ!) - ๋ก๋ฉ์ฐฝ UI ์ ์ํ์ ๋ฐ๋ผ ๋ณด์ด๊ฑฐ๋ ์ ๋ณด์ด๋๋ก ํด์ผ ํ๋ฏ๋ก ๋จผ์ useState() ๋ฅผ ์ฌ์ฉํด ์ํ๋ฅผ ์ ์ฅํ ์ ์๋ load ๋ผ๋ state ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ html ํ๊ทธ๋ค ์ฌ์ด์ ์ํ๋ ์์น์ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ๋ก๋ฉ์ค์ผ ๋ ๋ก๋ฉ์ฐฝ UI ๊ฐ ๋ณด์ด๊ณ , ์๋ ๋์๋ ๋ก๋ฉ์ฐฝ์ด ๋ณด์ด์ง ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ๊ทธ ๋ค์์ผ๋ก "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ผ๋จ GET ์์ฒญ์ ํ๋ ๋์์ ๋ก๋ฉ์ค์ธ ๊ฒ์ด๋ฏ๋ก ๋ก๋ฉ์ฐฝ UI ๊ฐ ๋ณด์ด๋๋ก setLoad() ์์ true ๋ก ์์ฑํด์ฃผ์๋ค.
- GET ์์ฒญ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๋ฉด ๋ก๋ฉ์ ๋๋ ๊ฒ์ด๋ฏ๋ก ๋ก๋ฉ์ฐฝ UI ๊ฐ ๋ณด์ด์ง ์๋๋ก setLoad() ์์ false ๋ก ์์ฑํด์ฃผ์๋ค.
๐ ๋์ด์ ๋ณด์ฌ์ค ์ํ์ด ์์ ๋ "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ ์จ๊ธฐ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import axios from 'axios';
function App(){
let [count, setCount] = useState(2);
let [view, setView] = useState(true);
return (
{
view == true
?
(
<button className='btn btn-primary' onClick={()=>{
axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
.then((result)=>{
setCount(count+1);
let newData = result.data;
props.setShoes([...props.shoes, ...newData]);
})
.catch(()=>{
setView(false);
});
}}>์ํ ๋๋ณด๊ธฐ</button>
)
: null
}
)
}
- ๊ฐ์ฌ๋์ด ์ ๊ณตํด์ฃผ์ ๋ฐ์ดํฐ ๊ฒฝ๋ก๋ data3.json ๊น์ง์ด๋ค.
- ๋ฐ๋ผ์ data4.json ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ค๊ณ ํ๋ฉด ํด๋นํ๋ ๊ฒฝ๋ก๊ฐ ์๊ธฐ ๋๋ฌธ์ GET ์์ฒญ์ด ์คํจํ๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก .catch() ์์ "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ ์จ๊ธฐ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ์๋ค.
- ๋ค๋ง ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ๊ณผ๋ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์์๋๋ฐ ์ด ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์์ฑํด๋์ ์ด ๋ฒํผ ์์ฒด๊ฐ ์๋ณด์ด๋๋ก ํ๋ ๊ฑฐ๋ผ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ด๊ฐ ํ๊ณ ์๋ ๊ฒ ๋ง๋ ์ถ์๋ค.
- ์ฌํผ ๋์ด์ ๋ณด์ฌ์ค ์ํ์ด ์์ ๋ "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ ์จ๊ธฐ๋ ๋ฐฉ๋ฒ์ ์๋ฆผ์ฐฝ UI ๋ฅผ ๋ง๋ค๊ณ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๋ค.
- ๋จผ์ view ๋ผ๋ state ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ์ฒ์์๋ "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ด ๋ณด์ฌ์ผ ํ๋ฏ๋ก true ๋ผ๊ณ ์ด๊ธฐ๊ฐ์ ์์ฑํด์ฃผ์๋ค.
- ๊ทธ ๋ค์์ผ๋ก GET ์์ฒญ์ด ์คํจํ๋ฉด "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ด ๋ณด์ด์ง ์์์ผ ํ๋ฏ๋ก catch() ์์ setView(false) ๋ก ์์ฑํด์ฃผ์๋ค.
{
view == true ? (<button>์ํ ๋๋ณด๊ธฐ</button>) : null
}
- ๊ทธ๋ฆฌ๊ณ ์ํ๋ ์์น์ ์์ ๊ฐ์ด ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ view ๋ผ๋ state ๊ฐ true ๋ผ๋ฉด "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ด ๋ณด์ด๊ณ ์๋๋ผ๋ฉด "์ํ ๋๋ณด๊ธฐ" ๋ฒํผ์ด ๋ณด์ด์ง ์์์ผ ํ๋ค๊ณ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํ๋ค.
- ๋ฐ๋ผ์ ๊ธธ๊ฒ ์์ฑํ button ํ๊ทธ๋ฅผ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ ์ฝ๋์ button ํ๊ทธ ์๋ฆฌ์ ๋ฃ์ด์ฃผ์๋ค.
๐ ์์ฒญ์ ์คํจํ ๊ฒฝ์ฐ ๋ก๋ฉ ์คํจ ์๋ฆผ์ฐฝ UI ๋์ฐ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import axios from 'axios';
let Loading = styled.div`
font-size : 20px;
font-weight : bold;
color: #484848;
padding: 15px 20px;
background : #eee;
border-radius : 5px;
margin : 10px 0;
`
function Main(props) {
let [loadFail, setLoadFail] = useState(false);
return (
{
loadFail == true ? (<Loading>๋ก๋ฉ์ ์คํจํ์ต๋๋ค.</Loading>) : null
}
<button className='btn btn-primary' onClick={()=>{
axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
.then((result)=>{
})
.catch(()=>{
setLoadFail(true);
});
}}>์ํ ๋๋ณด๊ธฐ</button>
)
}
- ๋ก๋ฉ ์คํจ์ฐฝ UI ๋ styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค์๋ ๋ก๋ฉ์ฐฝ UI ๋ฅผ ์ฌํ์ฉํ๋ค.
(styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฐฉ๋ฒ ๋ณด๋ฌ๊ฐ๊ธฐ ํด๋ฆญ!) - loadFail ์ด๋ผ๋ state ๋ฅผ ๋ง๋ค์ด์ค ํ ์ด๊ธฐ๊ฐ์ false ๋ก ์ค์ ํด์ฃผ์๋ค.
- html ์ฝ๋๋ค ์ฌ์ด์ ์ํ๋ ์์น์ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ loadFail ์ด๋ผ๋ state ๊ฐ true ๊ฐ ๋๋ฉด ๋ก๋ฉ ์คํจ์ฐฝ UI ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ฆฌ๊ณ GET ์์ฒญ์ด ์คํจํ๋ฉด ๋ก๋ฉ์ด ์คํจํ ๊ฒ์ด๋ฏ๋ก .catch() ์์ setLoadFile(true) ๋ผ๊ณ ์์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ๋ก๋ฉ ์คํจ์ฐฝ์ ํ์ธํ ์ ์๋๋ก ํด์ฃผ์๋ค.
๐ ๋ก๋ฉ ์คํจ ์๋ฆผ์ฐฝ UI ํ์ด๋จธ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import axios from 'axios';
let Loading = styled.div`
font-size : 20px;
font-weight : bold;
color: #484848;
padding: 15px 20px;
background : #eee;
border-radius : 5px;
margin : 10px 0;
`
function Main(props) {
let [loadFail, setLoadFail] = useState(false);
function failTimer(){
setTimeout(()=>{
setLoadFail(false);
},2000)
clearTimeout(failTimer);
};
return (
{
loadFail == true ? (<Loading>๋ก๋ฉ์ ์คํจํ์ต๋๋ค.</Loading>) : null
}
<button className='btn btn-primary' onClick={()=>{
axios.get(`https://codingapple1.github.io/shop/data${count}.json`)
.then((result)=>{
})
.catch(()=>{
setLoadFail(true);
failTimer();
});
}}>์ํ ๋๋ณด๊ธฐ</button>
)
}
- ์ค์ตํ๋ฉด์ ๋ธ๋ผ์ฐ์ ์์ ๋ด๊ฐ ๋ง๋ ๊ธฐ๋ฅ๋ค์ด ์ ๋๋์ง ํ์ธํ๋ ์ฐฐ๋์ ๋ก๋ฉ ์คํจ์ฐฝ UI ๊ฐ ๊ณ์ ๋ ์๋๊ฒ ๊ฑฐ์ฌ๋ ธ๋ค.
- ๋ง์นจ useEffect() ๊ณต๋ถํ ๋ timeout() ํจ์๋ ๋ฐฐ์ ์ผ๋ ์ด๊ฑธ ํ์ฉํด์ ์คํจ์ฐฝ UI ๊ฐ 2์ด ์ ๋ ์๊ฐ์ด ์ง๋ ํ์ setLoadFile() ์ false ๋ก ๋ง๋ค์ด ์ฌ๋ผ์ง๊ฒ ํ ์ ์์ ๊ฑฐ ๊ฐ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์๋ค.
- ๋จผ์ failTimer() ํจ์๋ฅผ ๋ง๋ค์ด์ ์ด ํจ์ ์์ setTimeout() ํจ์๋ฅผ ๋ฃ๊ณ , setTimeout() ํจ์๋ฅผ ํตํด setLoadFile(false) ๊ฐ 2000ms ํ์ ์คํ๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์์น ์๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ง ์๋๋ก setTimeout() ํจ์๊ฐ ์คํ๋ ์ดํ์ failTimer() ๊ฐ ํ์ด๋จธ ๊ธฐ๋ฅ ํด์ ๊ฐ ๋๋๋ก clearTimeout(failTimer) ๋ผ๊ณ ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ์ด๋ ๊ฒ ๋ง๋ ํจ์๋ฅผ . catch() ํจ์ ์์ setLoadFile(true) ๋ผ๋ ์ฝ๋ ํ์ ์คํ๋๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] props ๋์ Context API ์ฌ์ฉํด๋ณด๊ธฐ (1) | 2022.03.27 |
---|---|
[React] ์์ธ ํ์ด์ง์ ์ฌ๊ณ ๋ฐ์ดํฐ ํ์ํ๊ธฐ (0) | 2022.03.26 |
[React] React ์์ Ajax ์์ฒญํ๊ธฐ (0) | 2022.03.26 |
[React] useEffect ๊ณผ์ ํ๊ธฐ (0) | 2022.03.26 |
[React] useEffect ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.25 |