728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ค๋ ๊ณต๋ถํ Composition API ๋ฅผ ์ฌ์ฉํด์ MyPage ์ ํ๋ก์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํด์ฃผ์๋ค.
๐ ๋ค์ด๊ฐ๊ธฐ ์ ์
- vue ํ์ผ์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด ํน์ ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ฐพ๊ธฐ ์ํด ์ฌ๊ธฐ์ ๊ธฐ ํ์ธ์ ํด์ผํ๋ค๋ ๋จ์ ์ด ์๋ค.
- ์ด๊ฒ ์ซ๋ค๋ฉด, Vue 3 ๋ฒ์ ๋ถํฐ ์ ๊ณตํ๋ Composition API ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- Composition API ๋ฅผ ์ฌ์ฉํ๋ฉด computed, methods, watch, data() ์ด๋ฐ ๊ฑธ๋ก ํ์ผ์ ์ชผ๊ฐ์ง ์๊ณ ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ํ ๊ณณ์ ๋ชจ์ ์ญ ์ฝ๋๋ฅผ ์งค ์ ์๋ค.
- ๋ค๋ง, Composition API ๋ฐฉ์์ ๊ธฐ์กด์ Options API ๋ฐฉ์๋ณด๋ค๋ ๋ฌธ๋ฒ์ด ๊ท์ฐฎ์ ์ ์๋ค.
๐ ํ๋ก์ ํ์ด์ง ๋ง๋ค๊ธฐ
๐ค MyPage.vue ๋ง๋ค๊ธฐ
<template>
<div class="mypage">
<h4 class="followers">ํ๋ก์</h4>
<input class="search" placeholder="๐" />
<div class="post-header">
<div class="profile"></div>
<span class="profile-name">์ฌ์ฉ์๋ช
</span>
</div>
</div>
</template>
<script>
export default {
name: "MyPage",
data() {
return {};
},
};
</script>
<style>
.followers,
.mypage {
text-align: center;
padding: 0 10px;
}
.search {
width: 80%;
margin-bottom: 20px;
padding: 10px;
font-size: 16px;
font-weight: bold;
}
</style>
- ์ผ๋จ ํ๋ก์๋ฅผ ๋ณด์ฌ์ค MyPage ๋ ์์ ๊ฐ์ด ๋ ์ด์์์ ๋ง๋ค์ด์ฃผ์๋ค.
<div v-if="step === 3">
<MyPage />
</div>
- ๊ทธ๋ฆฌ๊ณ Container.vue ํ์ผ์ MyPage Component ๋ฅผ import ๋ฐ ๋ฑ๋กํ ํ์ step ์ด 3 ์ผ ๋ ๋ณด์ด๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
<ul class="header-button-right">
<li @click="step = 3" v-if="step === 0">My Page</li>
<li @click="step++" v-if="step === 1">Next</li>
<li @click="publish" v-if="step === 2">๋ฐํ</li>
</ul>
- App.vue ์์๋ ๋ฉ์ธ ํ์ด์ง, ์ฆ step ์ด 0 ์ผ ๋ ์ฐ์ธก ์๋จ์ MyPage ๋ก ์ด๋ํ ์ ์๋ ๋ฒํผ์ ๋ง๋ค์ด์ฃผ์๋ค.
- step state ์ ์ซ์์ ๋ฐ๋ผ ๋ณด์ฌ์ง๋ ํ์ด์ง๊ฐ ๋ฐ๋๊ณ ๊ทธ์ ๋ง๋ ๋ฒํผ๋ค์ด ๊ฐ ํ์ด์ง์ ์ฐ์ธก ์๋จ์ ์๊ธฐ๋๋ก ํด์ฃผ์๋ค.
๐ค followers.json ํ์ผ ๋ง๋ค๊ธฐ
[
{ "id" : 0, "name" : "_Limvely", "image" : "https://placeimg.com/200/200/animals/grayscale" },
{ "id" : 1, "name" : "salmon_X", "image" : "https://placeimg.com/200/250/people" },
{ "id" : 2, "name" : "360noscope", "image" : "https://placeimg.com/200/250/animals" },
{ "id" : 3, "name" : "Jeony_1", "image" : "https://placeimg.com/200/200/people/sepia" },
{ "id" : 4, "name" : "mihyeon", "image" : "https://placeimg.com/200/200/tech" }
]
- ajax ์์ฒญ์ผ๋ก ๋ถ๋ฌ์ฌ ํ๋ก์ ํ๋กํ ๋ฐ์ดํฐ๋ค์ ๋ด์ followers.json ํ์ผ์ public ํด๋์ ๋ง๋ค์ด์ฃผ์๋ค.
๐ค Composition API ์์ผ๋ก ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
import { ref } from 'vue'
export default {
name : 'MyPage',
setup(){
let followers = ref([]);
return { followers }
},
}
- ์ด์ follower.json ์ผ๋ก๋ถํฐ ๋ถ๋ฌ์ฌ ๋ฐ์ดํฐ๋ค์ ์ด๋ฆ์ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ๋ค.
- ์ด์ (Options API)์๋ data ๋ณด๊ดํจ์ ํญ๋ชฉ์ ๋ง๋ค์ด ์ ์ฅํ์ง๋ง, Composition API ์์๋ setup() ์ด๋ผ๋ hook ๊ฐ์ ๊ฑธ ๋ง๋ค์ด ๊ทธ ์์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
- ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด followers: [] ์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ ๊ฒ๊ณผ ๋์ผํ๋ค๊ณ ๋ณผ ์ ์๋ค.
- ref() ๋ผ๋ ํจ์๋ฅผ import ํด์จ ํ์, let ๋ฐ์ดํฐ์ด๋ฆ = ref(๋ฐ์ดํฐ) ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ฃผ์ด์ผ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ค์๊ฐ์ผ๋ก ์ฌ๋ ๋๋ง์ด ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์๋ ํญ์ return { } ์์ ๋ฐ์ดํฐ์ด๋ฆ์ ์์ฑํด์ฃผ์ด์ผ <template></template> ์์ {{ ๋ฐ์ดํฐ์ด๋ฆ }} ์ ํํ๋ก ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๋ค.
๐ค Ajax ์์ฒญํ๊ธฐ ๋ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝํ๊ธฐ
import { ref } from 'vue'
import axios from 'axios'
export default {
name : 'MyPage',
setup(){
let followers = ref([]);
axios.get('/followers.json').then((result)=>{
followers.value = result.data
})
return { followers }
},
}
- Composition API ๋ ajax ๋ฅผ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ๋์ผํ๋ฐ, ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ ์ด์ ๊ณผ ์ข ๋ค๋ฅด๋ค.
- ๋จผ์ axios ๋ฅผ import ํด์ค ๋ค์์ GET ์์ฒญ์ผ๋ก ์ด์ ์ ์ ์ฅํ followers.json ํ์ผ์ ๊ฐ์ ธ์จ๋ค.
- followers.json ํ์ผ๋ก๋ถํฐ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ result ์ ์ ์ฅ์ด ๋๊ณ , ์ด๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด result.data ์์ [{ }, { }, { }...] ์ ๊ฐ์ array ์๋ฃํ์ด ์ ์ฅ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ๊ทธ๋์ result.data ๋ฅผ followers ์ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด, followers = result.data ๊ฐ ์๋๋ผ followers.value = result.data ๋ผ๊ณ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํ๋ค.
๐ค Lifecycle hook ์ฌ์ฉํ๊ธฐ
import { onMounted, ref } from "vue";
import axios from "axios";
export default {
name: "MyPage",
setup() {
let followers = ref([]);
onMounted(() => {
axios.get("/followers.json").then((result) => {
followers.value = result.data;
});
});
return { followers };
},
};
- Component ๊ฐ ๋ถ์ฐฉ๋ ๋๋ ์ ๋ฐ์ดํธ๋ ๋ ๋ฌด์ธ๊ฐ๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด created(), mounted(), beforeUpdate() ์ด๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋ค๋ง Composition API ์์๋ ํจ์๋ช
์ด ์ฝ๊ฐ ๋ค๋ฅด๋ค.
- onMounted() ์ด๋ฐ hook ์ import ํ๋ค.
(์ด์ ์ Lifecycle hook ์ผ๋ก ์ฌ์ฉํ๋ ํจ์๋ช ์์ on ์ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค. ๋ค๋ง, created() ๋ on ์ ๋ถ์ด์ง๋ ์๊ฑฐ๋์ setup() ์์ฒด๊ฐ created() ์ ๋งค์ฐ ์ ์ฌํ๋ฏ๋ก ์ฌ์ฉํ ์ผ๋ ๊ฑฐ์ ์๋ค.) - onMounted(()=>{ Mount ์ดํ์ ์คํํ ์ฝ๋ }) ์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
(์ ์ฝ๋๋ mount ํ์ ajax ์์ฒญ์ ์คํํ๊ฒ ๋๋ค.)
- onMounted() ์ด๋ฐ hook ์ import ํ๋ค.
๐ค followers.json ํ์ผ ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ
<div class="mypage">
<h4 class="followers">ํ๋ก์</h4>
<input
class="search"
placeholder="๐"
/>
<div class="post-header" v-for="(follower, i) in followers" :key="i">
<div
class="profile"
:style="`background-image: url(${follower.image})`"
></div>
<span class="profile-name">{{ follower.name }}</span>
</div>
</div>
- ajax ์์ฒญ์ ํตํด followers.json ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์, ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] Composition API ์ฌ์ฉํด๋ณด๊ธฐ_2 (0) | 2022.04.09 |
---|---|
[Vue.js] Vuex4: mapState ์ฌ์ฉํ๊ธฐ (0) | 2022.04.08 |
[Vue.js] Vuex3: actions ํญ๋ชฉ ์ฌ์ฉํ๊ธฐ (0) | 2022.04.08 |
[Vue.js] Vuex2: ์ข์์ & ์ข์์ ์ทจ์ & ์ข์์ ์ฌ๋ถ ํ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (0) | 2022.04.08 |
[Vue.js] Vuex1: Vuex ์ ํ ํ๊ธฐ (0) | 2022.04.07 |