728x90
λ°μν
π‘ μ€μ΅ ν¬μΈνΈ!
- μ΄λ²μλ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯κ³Ό μ’μμ μ¬λΆλ₯Ό νμνλ κΈ°λ₯μ λ§λ€μ΄λ³΄μλ€.
- νλμ ν¬μ€νΈμλ§ λ°μ΄ν°λ°μΈλ©μ νλ κ²μ μ¬μ λλ° κΈ°μ‘΄ λ°μ΄ν°λ‘ λ§λ ν¬μ€νΈλ€μμ λ
립μ μΌλ‘ λμνλλ‘ λ§λλ κ³Όμ μμ νλ², "λ보기" λ²νΌμ ν΅ν΄ μΆκ°λ‘ κ°μ Έμ¨ ν¬μ€νΈμμλ λμνλλ‘ λ§λλ κ³Όμ μμ λ νλ², μ¬μ©μκ° μλ‘ μμ±ν ν¬μ€νΈμμλ μ μμ μΌλ‘ λμνλλ‘ λ§λ€κΈ° μν΄ κ³ λ―Όνκ³ μ΄κ²μ κ² μ μ©ν΄λ³΄λλΌ κ½€ μ€λ μκ°μ΄ κ±Έλ Έλ€.
(μ¬μ€ μ½λ©λ³΄λ€ νμ λΈλ‘κ·Έ μμ±μ΄ λ μ€λ κ±Έλ¦°λ€...γ γ ) - μ΅μ’ μ μΌλ‘ κΈ°μ‘΄μ ꡬνν κΈ°λ₯λ€λ λ¬Έμ μλμ§ νμΈκΉμ§ μλ£νκ³ μμΌ κΈ°λ₯ λ§λ€κΈ°λ₯Ό μ’ λ£νλ€.
π λ 립μ μΈ κΈ°λ₯ μλ νμΈνκΈ°
- μΌλΆλ¬ μ ν¬μ€νΈμ LIkes κ° μλ ν¬μ€νΈμ λ 립μ μΌλ‘ μλνλμ§ λ³΄μ¬μ£ΌκΈ° μν΄ κ° ν¬μ€νΈμ Likes κ° λ³΄μ΄λλ‘ GIF μΊ‘μ²λ₯Ό νλ€.
- μ¬μ§μ ν λ² ν΄λ¦μ +1, ν λ² λ ν΄λ¦νλ©΄ -1 μ΄ λλ κ²μ νμΈν μ μλ€.
π "λ보기" λ²νΌμΌλ‘ κ°μ Έμ¨ ν¬μ€νΈμ κΈ°λ₯ μλ νμΈνκΈ°
- μ΄ κ²½μ°μλ, μΌλΆλ¬ μ ν¬μ€νΈμ LIkes κ° μλ ν¬μ€νΈμ λ 립μ μΌλ‘ μλνλμ§ λ³΄μ¬μ£ΌκΈ° μν΄ κ° ν¬μ€νΈμ Likes κ° λ³΄μ΄λλ‘ GIF μΊ‘μ²λ₯Ό νλ€.
π "λ°ν" λ²νΌμΌλ‘ μμ±ν ν¬μ€νΈμ κΈ°λ₯ μλ νμΈνκΈ°
- μλ‘ ν¬μ€νΈλ₯Ό μ λ‘λν κ²½μ°μλ λ€λ₯Έ κΈ°λ₯μ μν₯ μμ΄ μ λλ‘ μ’μμ λ° μ’μμ μ·¨μ κΈ°λ₯μ΄ μ μλνλ κ²μ λ³Ό μ μλ€.
π Vuex μ μλ state λ³κ²½νκΈ°
- Vuex λ₯Ό μ¬μ©ν λμ state λ₯Ό μ§μ μμ ν μλ μμ§λ§, κ·Έλ κ² λλ©΄ μνκ΄λ¦¬κ° μ λλ‘ μ΄λ£¨μ΄μ§μ§ μμΌλ―λ‘ κ΅³μ΄ μνκ΄λ¦¬λ₯Ό μν λΌμ΄λΈλ¬λ¦¬μΈ Vuex λ₯Ό μ¬μ©ν μ΄μ κ° μλ€.
- λ°λΌμ, state λ₯Ό μμ ν λμλ μ§μ μμ νμ§ λ§κ³ , mutations λΌλ object νλͺ©μ λ§λ€μ΄ κ±°κΈ°μ state μμ λ°©λ²μ ν¨μμ ννλ‘ μ μν΄λκ³ ν¨μλ₯Ό λΆλ₯΄λ λ°©μμΌλ‘ μμ ν΄μΌ νλ€.
π μ’μμ & μ’μμ μ·¨μ κΈ°λ₯ λ§λ€κΈ°
π€ κΈ°λ₯μ λ§λ€κΈ° μ μ μκ°ν΄λ³΄κΈ°
- ν¬μ€νΈμ μ¬μ§μ ν΄λ¦νλ©΄ μ’μμ νΉμ μ’μμ μ·¨μκ° λλ κΈ°λ₯μ λ§λ€ κ²μ΄λ€.
- μ’μμ & μ’μμ μ·¨μ κΈ°λ₯μ λ§λ€λ €λ©΄ μΌλ¨ μ’μμλ₯Ό λλ λμ§ μ λλ λμ§λ₯Ό true/false μνλ‘ μ μ₯ν΄λ νμκ° μλ€.
- μ’μμλ₯Ό λλ₯Έ μνλΌλ©΄ μ’μμκ° μ·¨μλμ΄μΌ νλ―λ‘ μ’μμ κ°μμμ -1 μ νλ©΄ λλ€.
- μ’μμλ₯Ό λλ₯΄μ§ μμ μνλΌλ©΄ μ’μμ κ°μκ° +1 μ΄ λμ΄μΌ νλ€.
- κ·Έλ¦¬κ³ true / false μνμ λ°λΌ Likes λ¨μ΄ λ€μ ννΈλ‘ μ’μμ μ¬λΆλ₯Ό νμν΄μ£Όμ΄μΌ νλ€.
- "μ’μμ" μ ν΄λΉνλ state λ₯Ό μμ νκΈ° μν΄μλ, mutations μ ν¨μλ₯Ό λ§λ€μ΄λκ³ λ€λ₯Έ Vue νμΌμμ λ³κ²½μ΄ νμν λ ν¨μλ₯Ό λΆλ₯΄λ λ°©μμ μ¬μ©ν΄μΌ νλ€.
- νλμ ν¬μ€νΈκ° μλλΌ μ 체 ν¬μ€νΈκ° λ 립μ μΌλ‘ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯μ΄ μλν΄μΌ νλ€.
- "λ보기" λ²νΌμ ν΄λ¦νλ κ²½μ°μ λΆλ¬μ¨ ν¬μ€νΈμλ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯μ΄ μλν΄μΌ νλ€.
π€ store.js μμ νκΈ°
// μ 체 μ½λ 미리보기
import { createStore } from 'vuex'
import posts from './assets/posts';
const store = createStore({
state(){
return {
posts: posts,
likes: posts.map(post => post.likes),
liked: posts.map(post => post.liked),
heart: posts.map(post => post.liked ? "π" : ""),
}
},
mutations: {
changeLikes(state, idx){
if(state.liked[idx] === false){
state.likes[idx]++;
state.heart[idx] = "π"
state.liked[idx] = true;
} else if(state.liked[idx] === true){
state.likes[idx]--;
state.heart[idx] = ""
state.liked[idx] = false;
}
},
changePosts(state, posts){
state.posts = posts;
state.likes = posts.map(post => post.likes);
state.liked = posts.map(post => post.liked);
state.heart = posts.map(post => post.liked ? "π" : "");
},
},
})
export default store;
- λ¨Όμ posts μ μ μ₯λμ΄μλ likes μ liked κ°μ μ¬μ©νκΈ° μν΄ posts.js νμΌλ‘λΆν° λ°μ΄ν°λ₯Ό posts λΌλ μ΄λ¦μΌλ‘ import ν΄μ£Όμλ€.
- likes μ liked μ κ²½μ°, posts array μμ κ° object μμ likes νλͺ©κ³Ό liked νλͺ©μ λΉΌλΌ μ μλλ‘ map() μ μ¬μ©νλ€.
- heart λ μ’μμ νμ κΈ°λ₯μ μν state μΈλ°, posts μλ heart νλͺ©μ΄ μμΌλ―λ‘ liked μ true/false μ¬λΆλ₯Ό κ°μ§κ³ map() κ³Ό μΌν μ°μ°μλ₯Ό μ΄μ©νμ¬ array λ‘ λ§λ€μ΄μ£Όμλ€.
- μ΄λ κ² λΉΌλ΄μ΄ array λ‘ λ§λ€μ΄λλ©΄ λμ€μ Post Component μμ idx λ₯Ό μΆμΆνμ¬ changeLikes() μ νμ©μ΄ κ°λ₯νλ€.
(idx λ₯Ό ν΅ν΄ λ 립μ μΌλ‘ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯μ΄ μλνκ² λλ€.) - μ°Έκ³ λ‘ changeLikes() λ₯Ό ν΄μνμλ©΄ λ€μκ³Ό κ°λ€.
- λ§μ½μ νΉμ idx μ ν΄λΉνλ ν¬μ€νΈμ μ’μμ μ¬λΆκ° false λΌλ©΄, μ’μμ κ°μλ₯Ό +1 ν΄μ£Όκ³ μ’μμ μ¬λΆλ₯Ό true λ‘ λ°κΎΈκ³ ννΈ νμλ₯Ό νλ€. -> μ’μμ κΈ°λ₯
- λ§μ½μ νΉμ idx μ ν΄λΉνλ ν¬μ€νΈμ μ’μμ μ¬λΆκ° true λΌλ©΄, μ’μμ κ°μλ₯Ό -1 ν΄μ£Όκ³ μ’μμ μ¬λΆλ₯Ό false λ‘ λ°κΎΈκ³ ννΈ νμλ₯Ό μμ νλ€. -> μ’μμ μ·¨μ κΈ°λ₯
- posts νλͺ©μ κ²½μ° μ΄λ―Έ App.vue μμ import ν λ€ λ°λ³΅λ¬Έμ ν΅ν΄ λ©μΈνλ©΄μ Post Component λ₯Ό λμμ£Όκ³ μκΈ° λλ¬Έμ κ΅³μ΄ posts λ₯Ό μ μ₯νμ§ μκ³ 0 μΌλ‘ μ μ₯ν΄λ μκ΄μ μλ€.
(λ¨, νλͺ© μ체λ λμ€μ "λ보기" λ²νΌμ ν΅ν΄ posts κ° μ λ°μ΄νΈλλ κ²½μ° μ¬μ©ν΄μΌνλ―λ‘ νμνλ€.) - posts κ° "λ보기" λ²νΌμ ν΅ν΄ μ
λ°μ΄νΈλμμ λμλ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯κ³Ό μ’μμ μ¬λΆ νμ κΈ°λ₯μ΄ μ μ©λ μ μλλ‘ changePosts() λ₯Ό λ§λ€μ΄μ£Όμλ€.
(μ μ΄μ Vuex λ₯Ό μ¬μ©νμΌλ©΄ μ΄λ κ² μ λ§λ€μ΄λ λ κ² κ°μλ°, μ€λμ μμ νλ€λ³΄λ λͺ¨λ μ½λλ₯Ό μμ ν μ μμ΄μ μ΄λ κ² changePosts() λΌλ ν¨μλ₯Ό λ§λ€μ΄μ μ§ννλ€. μ¬μ€ μ¬λ°λ₯Έ λ°©λ²μΈμ§λ λͺ¨λ₯΄κ² λ€.) - changePosts() λ₯Ό ν΄μνμλ©΄ λ€μκ³Ό κ°λ€.
- "λ보기" λ²νΌμ λλ μ λ, κΈ°μ‘΄μ posts λ₯Ό μ λ°μ΄νΈλ posts λ‘ κ΅μ²΄νλ€.
- κΈ°μ‘΄μ posts μμ λΉΌλΈ likes λ₯Ό μ λ°μ΄νΈλ posts μμ λΉΌλΈ likes λ‘ κ΅μ²΄νλ€.
- κΈ°μ‘΄μ posts μμ λΉΌλΈ liked λ₯Ό μ λ°μ΄νΈλ posts μμ λΉΌλΈ liked λ‘ κ΅μ²΄νλ€.
- κΈ°μ‘΄μ posts μμ liked μ true/false μ¬λΆλ₯Ό κ°μ§κ³ λ§λ heart λ₯Ό μ λ°μ΄νΈλ posts μ liked μ true/false μ¬λΆλ₯Ό κ°μ§κ³ λ§λ heart λ‘ κ΅μ²΄νλ€.
π€ App.vue μμ νκΈ°
// μ 체 μ½λ 미리보기
// μ 체 μ½λ λ΄μ©μ΄ λ무 κΈΈμ΄ λΆνμν λΆλΆμ μ μΈνλ€.
export default {
methods: {
more() {
axios
.get(`https://codingapple1.github.io/vue/more${this.moreCnt}.json`)
.then((result) => {
this.posts.push(result.data);
this.$store.commit("changePosts", this.posts);
this.moreCnt++;
})
.catch(() => {
console.log("GET μμ²μ μ€ν¨νμ΅λλ€.");
});
},
publish() {
let myPost = {
name: "Bak Seoyun",
userImage: "https://placeimg.com/100/100/arch",
postImage: this.imgUrl,
likes: 0,
date: "Jun 1",
liked: false,
content: this.content,
filter: this.filter,
};
this.posts.unshift(myPost);
this.$store.commit("changePosts", this.posts);
this.step = 0;
this.filter = "";
},
},
};
this.$store.commit("changePosts", this.posts);
- "λ보기" λ²νΌμ ν΄λ¦νλ©΄ more() ν¨μκ° μ€νλλλ°, μ΄ ν¨μλ₯Ό ν΅ν΄ posts κ° μ λ°μ΄νΈλλ―λ‘, μμ κ°μ΄ μ½λλ₯Ό μμ±νμ¬, changePosts ν¨μλ₯Ό μ€νν΄λ¬λΌκ³ store.js μ μμ²νλ©΄μ this.posts λ°μ΄ν°λ₯Ό κ°μ΄ μ€μ΄λ³΄λλ€.
- κ·Έλ¦¬κ³ "λ°ν" λ²νΌμ ν΄λ¦νλ κ²½μ°μλ publish() ν¨μκ° μ€νλλλ°, μ΄ λμλ κΈ°μ‘΄μ posts μ νλμ ν¬μ€νΈκ° λ μΆκ°λμ΄ μ λ°μ΄νΈκ° νμνλ―λ‘ λκ°μ΄ μμ μ½λλ₯Ό μΆκ°ν΄μ£Όμλ€.
- μ΄μ store.js μμλ "λ보기" λ²νΌμ΄λ "λ°ν" λ²νΌμ ν΄λ¦νλ©΄ changePosts() μ this.posts λ₯Ό posts λΌλ νλΌλ―Έν°λ‘ λ°μ posts, likes, liked state λ₯Ό μ λ°μ΄νΈνκ² λλ€.
π€ Container.vue μμ νκΈ°
// μ 체 μ½λ 미리보기
// μ 체 μ½λ λ΄μ©μ΄ λ무 κΈΈμ΄ λΆνμν λΆλΆμ μ μΈνλ€.
<template>
<div>
<div v-if="step === 0">
<Post :post="post" v-for="(post, i) in posts" :key="i" :idx="i" />
</div>
</template>
<script>
export default {
data() {
return {
filters: [
"aden",
"_1977",
"brannan",
"brooklyn",
"clarendon",
"earlybird",
"gingham",
"hudson",
"inkwell",
"kelvin",
"lark",
"lofi",
"maven",
"mayfair",
"moon",
"nashville",
"perpetua",
"reyes",
"rise",
"slumber",
"stinson",
"toaster",
"valencia",
"walden",
"willow",
"xpro2",
],
idx: 0,
};
},
};
</script>
- λͺ¨λ ν¬μ€νΈμ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯μ΄ μλνκΈ° μν΄μλ μ¬μ©μκ° ν΄λ¦ν ν¬μ€νΈμ idx λ₯Ό μ°Ύμμ ν΄λΉ idx μ likes, liked λΌλ state μ λ³κ²½μ ν΄μ£Όμ΄μΌ νλ€.
- κ·Έλμ, Container.vue μ Post Component κ° λ°λ³΅λ¬Έμ λ λ λ°μνλ λ°λ³΅ νμλ₯Ό μλ―Ένλ i λ₯Ό idx μ²λΌ μ¬μ©νλ©΄ μ’μ κ² κ°μλ€.
(μ²μμλ :key λ₯Ό μ¬μ©νλ €κ³ νμΌλ μ΄ λΆλΆμ μμ μ νλ©΄ μλλ λΆλΆμ΄λΌκ³ μλ¬κ° λ°μνλ€.) - data 보κ΄ν¨μ idx λ₯Ό λ§λ λ€μ, props λ¬Έλ²μ μ΄μ©νμ¬ Post Component μ i λ₯Ό idx λΌλ μ΄λ¦μΌλ‘ μ μ‘ν΄μ£Όμλ€.
π€ Post.vue μμ νκΈ°
// μ 체 μ½λ 미리보기
// μ 체 μ½λ λ΄μ©μ΄ λ무 κΈΈμ΄ λΆνμν λΆλΆμ μ μΈνλ€.
<template>
<div class="post">
<div class="post-header">
<div
class="profile"
:style="{ backgroundImage: `url(${post.userImage})` }"
></div>
<span class="profile-name">{{ post.name }}</span>
</div>
<div
class="post-body"
@click="$store.commit('changeLikes', idx)"
:class="post.filter"
:style="{
backgroundImage: `url(${post.postImage})`,
}"
></div>
<div class="post-content">
<p>{{ $store.state.likes[idx] }} Likes {{ $store.state.heart[idx] }}</p>
<p>
<strong>{{ post.name }}</strong> {{ post.content }}
</p>
<p class="date">{{ post.date }}</p>
</div>
</div>
</template>
<script>
export default {
data() {
return {};
},
props: {
post: Object,
idx: Number,
},
components: {},
};
</script>
- μ°μ , Container.vue μμ props λ¬Έλ²μΌλ‘ λ°μμ¨ idx λ₯Ό props μ λ±λ‘ν΄μ£Όμλ€.
- ν¬μ€νΈ μ¬μ§μ ν΄λ¦νμ λ, ν΄λΉ ν¬μ€νΈλ§ μ’μμ & μ’μμ μ·¨μ κΈ°λ₯μ΄ λμν΄μΌνμΌλ―λ‘, post-body λΌλ μ΄λ¦μ κ°μ§ class μ @click μμ±μ μΆκ°νμ¬ μ¬μ§μ ν΄λ¦νλ κ²½μ° changeLikes() κ° μ€νλλλ‘ store.js μ μμ²νλ©΄μ ν΄λ¦ν ν¬μ€νΈμ idx λ₯Ό κ°μ΄ μ μ‘ν΄μ£Όμλ€.
- κ·Έλ¦¬κ³ changeLikes() λ₯Ό ν΅ν΄ λ³κ²½λ likes μ κ°μ {{ $store.state.likes[idx] }} λΌλ μ½λλ₯Ό μ΄μ©ν΄μ post-content λΌλ class λ‘ κ°μ Έμλ€.
- changeLikes() λ₯Ό ν΅ν΄ λ³κ²½λ heart μ κ°μ {{ $store.state.heart[idx] }} λΌλ μ½λλ₯Ό μ΄μ©ν΄μ post-content λΌλ class λ‘ κ°μ Έμλ€.
728x90
λ°μν
'[κ°λ°] Practice > Vue.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Vue.js] Vuex4: mapState μ¬μ©νκΈ° (0) | 2022.04.08 |
---|---|
[Vue.js] Vuex3: actions νλͺ© μ¬μ©νκΈ° (0) | 2022.04.08 |
[Vue.js] Vuex1: Vuex μ ν νκΈ° (0) | 2022.04.07 |
[Vue.js] mitt μ μ¬μ©νμ¬ λ©λ¦¬ λ¨μ΄μ§ Component κ° λ°μ΄ν° μ μ‘νκΈ° (0) | 2022.04.07 |
[Vue.js] props λμ slot μ¬μ©ν΄λ³΄κΈ° (0) | 2022.04.07 |