728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
๐ Ajax ์์๋ณด๊ธฐ
- ajax ์ ๋ํ ์ค๋ช
๋ฐ axios ์ค์น ๋ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ด์ ์ React ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ์ ๋ฆฌํด๋ ๊ฒ ์๋๋ฐ, ๊ฑฐ์ ๋์ผํด์ ์ค๋ช
์ ์๋ตํ๋ค.
(ํน์ ajax ์ ๋ํด ๊ถ๊ธํ๊ฑฐ๋ axios ์ค์น ๋ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๊ถ๊ธํ๋ค๋ฉด ํด๋ฆญ!)
๐ axios ๋ฅผ ์ด์ฉํ์ฌ GET ์์ฒญํ๊ธฐ
import axios from 'axios';
axios.get('URL').then( result => {
// GET ์์ฒญ ์ฑ๊ณตํ ๊ฒฝ์ฐ ์คํํ ์ฝ๋ ์์ฑํ๊ธฐ
console.log(result);
}).catch(()=>{
// GET ์์ฒญ ์คํจํ ๊ฒฝ์ฐ ์คํํ ์ฝ๋ ์์ฑํ๊ธฐ
})
- ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ํ๋ ์๋ฒ์ URL ๋ก GET ์์ฒญ์ ํ ์ ์๋ค.
- .then() ์์๋ function(){ } ๊ณผ ๊ฐ์ด ์ฝ๋ฐฑํจ์๋ฅผ ์ถ๊ฐํด์ค ๋ค์, GET ์์ฒญ์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ์ ์คํํ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- GET ์์ฒญ์ ํตํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ result ๋ผ๋ ํ๋ผ๋ฏธํฐ์ ๋ด๊ฒจ์์ผ๋ฏ๋ก, ๊ถ๊ธํ๋ค๋ฉด console.log()๋ก ์ถ๋ ฅํด๋ณด๋ฉด ๋๋ค.
- ajax ์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ์ ํน์ ์ฝ๋๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด .catch() ์์ ์ฝ๋ฐฑํจ์๋ฅผ ์ถ๊ฐํด์ค ๋ค์ ์คํํ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- ๋ณดํต ajax ์์ฒญ์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ URL ์ ์๋ชป ์ฐ๊ฑฐ๋, ์๋ฒ๊ฐ ๋ค์ด๋๋ ๊ฒฝ์ฐ ๋ฑ์ด ์๋ค.
๐ axios ๋ฅผ ์ด์ฉํ์ฌ POST ์์ฒญํ๊ธฐ
import axios from 'axios';
axios.post('URL', '๋ณด๋ผ_๋ฐ์ดํฐ').then( result => {
// POST ์์ฒญ ์ฑ๊ณตํ ๊ฒฝ์ฐ ์คํํ ์ฝ๋ ์์ฑํ๊ธฐ
console.log(result);
}).catch(()=>{
// POST ์์ฒญ ์คํจํ ๊ฒฝ์ฐ ์คํํ ์ฝ๋ ์์ฑํ๊ธฐ
})
- ajax ์ POST ์์ฒญ๋ ํ ์ ์๋๋ฐ, POST ์์ฒญ์ด๋ ์๋ฒ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ด๋ค.
- ์ด ๋, ์ ์กํ ์ ์๋ ๋ฐ์ดํฐ๋ก๋ ๋ฌธ์์ด์ด๋ object ์๋ฃํ์ด๋ ๋ชจ๋ ๊ฐ๋ฅํ๋ค.
๐ "๋๋ณด๊ธฐ" ๋ฒํผ์ผ๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ Post.vue ๋ก ๋ณด์ฌ์ฃผ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋์ ๋ด์ฉ์ด ๊ธธ์ด css ๋ถ๋ถ์ ์ ์ธํ๋ค.
<template>
<div class="header">
<ul class="header-button-left">
<li>Cancel</li>
</ul>
<ul class="header-button-right">
<li>Next</li>
</ul>
<img src="./assets/logo.png" class="logo" />
</div>
<Container :posts="posts" />
<button class="btn" @click="more">๋๋ณด๊ธฐ</button>
<div class="footer">
<ul class="footer-button-plus">
<input type="file" id="file" class="inputfile" />
<label for="file" class="input-plus">+</label>
</ul>
</div>
</template>
<script>
import Container from "./components/Container.vue";
import posts from "./assets/posts";
import axios from "axios";
export default {
name: "App",
data() {
return {
posts: posts,
moreCnt: 0,
};
},
methods: {
more() {
axios
.get(`https://codingapple1.github.io/vue/more${this.moreCnt}.json`)
.then((result) => {
this.posts.push(result.data);
this.moreCnt++;
})
.catch(() => {
console.log("GET ์์ฒญ์ ์คํจํ์ต๋๋ค.");
});
},
},
components: {
Container: Container,
},
};
</script>
<style>
</style>
- "๋๋ณด๊ธฐ" ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ์ฌ๋์ด ์ค๋นํด์ค์ URL ๋ก GET ์์ฒญ์ ํ ํ, Post.vue ๋ก ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ค.
- ๋จผ์ , "๋๋ณด๊ธฐ" ๋ฒํผ์ ๋ง๋ ๋ค์, ํด๋น ๋ฒํผ์ ํด๋ฆญํ๋ฉด more ์ด๋ผ๋ method ๊ฐ ์คํ๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์๋ค.
- ๊ทธ๋ฌ๊ณ ๋์, methods ์ more() ํจ์๋ฅผ ์ถ๊ฐํด์ฃผ์๋๋ฐ ์ฝ๋๋ฅผ ํด์ํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- https://codingapple1.github.io/vue/more0.json ์ GET ์์ฒญ์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
- ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ result ์ ์ ์ฅํ ๋ค์ ๋ด๊ฐ ํ์๋ก ํ๋ ๊ฐ์ฒด ํ์ฒด์ ๋ฐ์ดํฐ์ธ result.data ๋ฅผ ํ์ฌ data ๋ณด๊ดํจ์ posts ์ push ํ๋ค.
(ํ์ฌ posts ๋ผ๋ ๋ฐ์ดํฐ์ ์๋ถ๋ถ์ ์ถ๊ฐํ ๊ฒฝ์ฐ unshift(), ๋ท๋ถ๋ถ์ ์ถ๊ฐํ ๊ฒฝ์ฐ push() ๋ฅผ ์ฌ์ฉํ๋ค.)
- ์ ์ฝ๋๋ "๋๋ณด๊ธฐ" ๋ฒํผ์ ํตํด GET ์์ฒญ์ ํ URL ์ด ํ๋์ธ ๊ฒฝ์ฐ์ด๊ณ , ๋ณดํต์ "๋๋ณด๊ธฐ" ๋ฒํผ์ ๊ณ์ํด์ ๋๋ฅด๋ฉด ์๋ฒ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ ๋ถ๋ฌ์์ผํ๋ค.
- ๊ฐ์ฌ๋์ ๊ฒฝ์ฐ ๋๋ฒ์งธ ์๋ฒURL ์ https://codingapple1.github.io/vue/more1.json ๋ก ์๋ ค์ฃผ์ จ๋๋ฐ, ์ฒซ๋ฒ์งธ ์๋ฒURL ๊ณผ ๋น๊ตํ์ ๋ more ๋ค์ ์ซ์๋ง ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
- ๋ฐ๋ผ์, "๋๋ณด๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค 0์์๋ถํฐ ์ซ์๊ฐ 1์ฉ ์ฆ๊ฐํ๋๋ก ํ ๋ค์, ํด๋น ์ซ์๋ฅผ ์๋ฒURL ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํด์ค์ผ๋ก์, ๋งค๋ฒ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋์๋ค.
728x90
๋ฐ์ํ