λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/Vue.js

[Vue.js] Vuex2: μ’‹μ•„μš” & μ’‹μ•„μš” μ·¨μ†Œ & μ’‹μ•„μš” μ—¬λΆ€ ν‘œμ‹œ κΈ°λŠ₯ λ§Œλ“€κΈ°

by Connecting-the-dots 2022. 4. 8.
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
λ°˜μ‘ν˜•