inflearn logo
강의

講義

知識共有

Vue3完全マスター:基礎から実践まで - 「基本編」

すごい

19:17 emit 관련 질문

568

gkstkdgh096741

投稿した質問数 3

0

강의에서는 export를 쓰셨지만 현재 script setup을 이용해 코딩중인 학생입니다.

※ 부모 컴포넌트에 선언한 이 함수를

const toggleLike = () => {
  /* Emit 자식 컴포넌트에서 다시 상위인 부모 컴포넌트로 값을 보내줄 때 사용 */
  posts.value.isLike = !posts.value.isLike
}

아래 이벤트 핸들러에 넣어 동작시키고 싶었지만

인식하지 못해 아래와 같은 방법으로 동작시켰습니다.

@toggle-like="post.isLike = !post.isLike"

혹시 @toogle-like에 함수명을 넣어 동작 시키려면 어떻게 수정해야할까요?

부모 컴포넌트

<template>
  <div>
    <main>
      <div class="container py-4">
        <div class="row g-3">
          <div v-for="post in posts" :key="post.id" class="col col-4">
            <AppCard
              :title="post.title"
              :contents="post.contents"
              :type="post.type"
              :is-like="post.isLike"
              @toggle-like="post.isLike = !post.isLike"
            ></AppCard>
          </div>
        </div>
      </div>
    </main>
  </div>
</template>

<script setup>
import AppCard from '@/components/AppCard.vue'
import { ref } from 'vue'

const posts = ref([
  { id: 1, title: '제목1', contents: '내용1', isLike: true, type: 'news' },
  { id: 2, title: '제목2', contents: '내용2', isLike: true, type: 'news' },
  { id: 3, title: '제목3', contents: '내용3', isLike: true, type: 'news' },
  { id: 4, title: '제목4', contents: '내용4', isLike: false, type: 'notice' },
  { id: 5, title: '제목5', contents: '내용5', isLike: false, type: 'notice' },
])

const toggleLike = () => {
  /* Emit 자식 컴포넌트에서 다시 상위인 부모 컴포넌트로 값을 보내줄 때 사용 */
  posts.value.isLike = !posts.value.isLike
}
</script>

<style lang="scss" scoped></style>

 

자식 컴포넌트

<template>
  <div>
    <div class="card">
      <div class="card-body">
        <!-- type : news, notice -->
        <span class="badge bg-secondary">{{ typeName }}</span>
        <h5 class="card-title mt-2">{{ title }}</h5>
        <p class="card-text">{{ contents }}</p>
        <a href="#" class="btn" :class="isLikeClass" @click="$emit('toggleLike')">좋아요</a>
      </div>
    </div>
  </div>
</template>

<script setup>
import { computed, defineEmits } from 'vue'
const props = defineProps({
  type: {
    type: String,
    default: 'news',
    validator: value => {
      return ['news', 'notice'].includes(value)
    },
  },
  title: {
    type: String,
    required: true,
  },
  contents: {
    type: String,
    required: true,
  },
  isLike: {
    type: Boolean,
    default: false,
  },
  obj: {
    type: Object,
    default: () => {},
  },
})
console.log('props.title : ', props.title)

const isLikeClass = computed(() => (props.isLike ? 'btn-danger' : 'btn-outline-danger'))

const typeName = computed(() => (props.type === 'news' ? '뉴스' : '공지사항'))

const emit = defineEmits(['toggleLike'])
</script>

<style></style>

vue.js vuejs

回答 1

1

gymcoding

안녕하세요.

우선 강의 후반부에 script setup 문법을 다루며, 실전편에서는 script setup 문법 기반으로 수업을 진행합니다.

그리고

<template>
  <div>
    <main>
      <div class="container py-4">
        <div class="row g-3">
          <div v-for="post in posts" :key="post.id" class="col col-4">
            <AppCard
              :title="post.title"
              :contents="post.contents"
              :type="post.type"
              :is-like="post.isLike"
              @toggle-like="toggleLike(post)"
            ></AppCard>
          </div>
        </div>
      </div>
    </main>
  </div>
</template>

<script setup>
import AppCard from '@/components/AppCard.vue'
import { ref } from 'vue'

const posts = ref([
  { id: 1, title: '제목1', contents: '내용1', isLike: true, type: 'news' },
  { id: 2, title: '제목2', contents: '내용2', isLike: true, type: 'news' },
  { id: 3, title: '제목3', contents: '내용3', isLike: true, type: 'news' },
  { id: 4, title: '제목4', contents: '내용4', isLike: false, type: 'notice' },
  { id: 5, title: '제목5', contents: '내용5', isLike: false, type: 'notice' },
])

const toggleLike = (post) => {
  /* Emit 자식 컴포넌트에서 다시 상위인 부모 컴포넌트로 값을 보내줄 때 사용 */
  post.isLike = !post.isLike
}
</script>

<style lang="scss" scoped></style>

이렇게 파라미터를 사용하여 해결할 수 있습니다.

npm init vue@3.1.9

0

37

2

크롭 웹스토어 vue devtools 설치 관련

0

39

1

snippets 작성하는 부분 설명이 있었나요?

0

47

2

computed 의 set 함수를 통해 const 변수에 값을 담는 부분

0

52

2

소스 공유 어디서 해야하는지 궁금합니다

0

60

2

component 등록과 사용

0

57

2

강의교안

0

56

2

eslint 룰 관련 질문이 있습니다.

0

64

2

npm init -y 명령어 실행에 관한 질문

0

153

2

volar 가 마켓플레이스에 검색되지 않아 vue(official)을 설치했습니다.

0

167

2

깊은 감시자 질문

0

88

2

정리된 내용

0

153

2

화면이 왜 이렇게 뜨는걸까요?

0

184

2

왜 다르게 뜰까요..?ㅠㅠ

0

155

2

npm init vue , npm create vue@latest 명령 오류

0

289

2

강의를 듣다보니 궁금한 점 질문드립니다.

0

141

2

watch강의 질문

0

153

1

강의 듣다가 질문드립니다.

0

119

1

이벤트 처리 부분 강의 실습

0

140

2

v-pre는 설명이 없나요?

0

152

2

AppCard.vue 만들다 말고 오류가 갑자기 엄청 뜹니다

0

146

1

개발자도구 Vue 탭 관련 문의

0

240

2

강의를 인텔리제이로 수업따라가도 되져?

0

177

2

API 사용시 자동으로 import하는 기능은 어떤것을 설치해야 하나요?

3

276

2