λΈλ‘κ·Έλ₯Ό ꡬμΆνλ κ²½μ° λΈλ‘κ·Έ κ²μκΈμ λνλ΄λ μ»΄ν¬λνΈκ° μλ€κ³ κ°μ ν΄λ³΄μ μ΄λ λͺ¨λ λΈλ‘κ·Έ κ²μκΈμ UIλ λ μ΄μμμ λμΌνμ§λ§ κ²μκΈμ μ λͺ©, λ΄μ©κ³Ό κ°μ λ°μ΄ν°λ κ°κ° λ€λ₯΄λ€. κ·Έλ¬λ©΄ μ»΄ν¬λνΈμ κ°κ° μ λͺ©μ΄λ λ΄μ©κ³Ό κ°μ λ°μ΄ν°λ₯Ό μ λ¬ν΄μΌ νλλ° μ΄λ
props
λ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈλ‘ λ°μ΄ν°(μμ±)μ μ λ¬ν μ μλ€.
Props
λ? μ»΄ν¬λνΈμ λ±λ‘ν μ μλ μ¬μ©μ μ μ μμ±μ
λλ€. λΈλ‘κ·Έ κ²μκΈ μ»΄ν¬λνΈμ μ¬μ©μ μ μ μμ±μ μ μΈνλ©΄ μ΄ μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ λΆλͺ¨ μ»΄ν¬λνΈμμ λ°μ΄ν°(μμ±)μ μ λ¬ ν μ μμ΅λλ€.Props
μ μΈμ΄ νμν©λλ€. μλνλ©΄ μ»΄ν¬λνΈμ μ λ¬λ μΈλΆ propsκ° fallthrough μμ±μΌλ‘ μ²λ¦¬λμ΄μΌ ν¨μ μ μ μμ΅λλ€.π§ fallthrough μμ±
props λλ emitsμ λͺ μμ μΌλ‘ μ μΈλμ§ μμ μμ± λλ μ΄λ²€νΈ
props
μ΅μ
μ μ¬μ©νμ¬ μ μΈν μ μλ€.<script>
export default{
props: [title],
setup(props){
console.log(props.title)
}
}
</script>
props
λ₯Ό μ μΈνλ κ² μΈμλ κ°μ²΄ λ¬Έλ²μ μ¬μ©νμ¬ μμ± νμ
κ³Ό ν¨κ» μ μΈ ν μ μλ€.<script>
export default{
props: {
//key: value
title: String,
likes: Number
},
setup(props){
console.log(props.title)
console.log(props.likes)
}
}
</script>
porps
μ μΈμ key
λ μμ±λͺ
μ΄κ³ value
λ μμ± νμ
μ΄λ€. λ μμΈν μ μΈνκ³ μΆμΌλ©΄ value
μ κ³ κΈ μ΅μ
μΈ κ°μ²΄λ₯Ό μ μΈν μ μλ€. vue μ€νμΌ κ°μ΄λμμλ λ¬Έμμ΄λ‘ κ°λ¨ν μ μΈνλ κ² λ³΄λ€ κ°μ²΄ νμ
μΌλ‘ λν
μΌνκ² μ μΈνλ κ²μ κΆμ₯νκ³ μλ€.
type
:String
,Number
,Boolean
,Array
,Object
,Date
,Function
,Symbol
λͺ¨λ κΈ°λ³Έ μμ±μ λλ λͺ¨λ μ¬μ©μ μ μ νμ μ΄ μ¬ μ μλ€.(μ:Person
,Animal
)
그리κ³[Number, String]
λ°°μ΄μ μ΄μ©νμ¬ μ¬λ¬κ°μ νμ μ μ μΈν μ μλ€.default
: μμ±κ°μ΄ λΉμ΄ μκ±°λundefined
λ₯Ό μ λ¬ λ°λ κ²½μ° κΈ°λ³Έκ°μ μ μΈν μ μλ€. κ·Έλ¦¬κ³ κ°μ²΄ λλ λ°°μ΄ νμ μΈ κ²½μ° κΈ°λ³Έκ°μ ν©ν 리 ν¨μλ₯Ό μ¬μ©νμ¬ λ°νν΄μΌ νλ€.required
: μμ±μ΄ νμκ°μ΄λΌλ©΄true
λ‘ ν΄μ μ€μ ν μ μλ€.validator
: μμ±κ°μ μ ν¨μ± κ²μ¬κ° νμν λ μ¬μ©ν μ μλ€.
β¨ μ»΄ν¬λνΈ μ¬μ© μ type
, required
, validator
λͺ
μλ μ¬νμ μλ°ν λ κ°λ°λͺ¨λμμ μ½μ κ²½κ³ κ° λ°μνλ€.
AppCard.vue
//AppCard.vue
<template>
<div class="card">
<div class="card-body">
<!-- νλͺ©μ λ§κ² λ£μ΄μ€λ€. -->
<h5 class="card-title red">{{ title }}</h5>
<p class="card-text">{{ contents }}</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
</template>
<script>
export default {
//propsλΌλ μμ±μ μ μΈνλ€.
props: ["title", "contents"],
setup() {
return {};
},
};
</script>
<style></style>
TheView.vue
<script>
//TheView.vue
<template>
<main>
<div class="container text-center py-4">
<div class="row g-3">
<div class="col col-4">
//AppCard.vue νμΌμμ props μ μΈν κ²μ κ°μ Έμ μ μ μΈ κ°μ μ€ μ μλ€.
<AppCard title="μ λͺ©1" contents="λ΄μ©1"></AppCard>
</div>
<div class="col col-4">
//λ°μν λ°μ΄ν°λ₯Ό μ μΈνμ¬μλ λ£μ μ μλ€.(λ°μΈλ©νμ¬ μ¬μ©)
<AppCard :title="post.title" :contents="post.contents"></AppCard>
</div>
<div class="col col-4">
<AppCard></AppCard>
</div>
<div class="col col-4">
<AppCard></AppCard>
</div>
<div class="col col-4">
<AppCard></AppCard>
</div>
<div class="col col-4">
<AppCard></AppCard>
</div>
<div class="col col-4">
<AppCard></AppCard>
</div>
</div>
</div>
</main>
</template>
<script>
import AppCard from "@/components/AppCard.vue";
import { reactive } from "vue";
export default {
components: {
AppCard,
},
setup() {
//λ°μΈλ©νμ¬ μ¬μ©ν μ μλ€.
const post = reactive({
title: "μ λͺ©2",
contents: "λ΄μ©2",
});
return { post };
},
};
</script>
<style></style>
v-for
μ μ΄μ©ν΄μ 루νλ₯Ό λ릴 μ μλ€.
TheView.vue
<template>
<main>
<div class="container text-center 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"></AppCard>
</div>
</div>
</div>
</main>
</template>
<script>
import AppCard from "@/components/AppCard.vue";
import { reactive } from "vue";
export default {
components: {
AppCard,
},
setup() {
//v-forμ μ΄μ©ν 루ν
const posts = reactive([
{ id: 1, title: "μ λͺ©1", contents: "λ΄μ©1" },
{ id: 2, title: "μ λͺ©2", contents: "λ΄μ©2" },
{ id: 3, title: "μ λͺ©3", contents: "λ΄μ©3" },
{ id: 4, title: "μ λͺ©4", contents: "λ΄μ©4" },
{ id: 5, title: "μ λͺ©5", contents: "λ΄μ©5" },
]);
return { posts };
},
};
</script>
<style lang="scss" scoped></style>
v-forμ μ΄μ©ν κ²°κ³Όνλ©΄
κ°μ²΄λ¬Έλ²μ μ΄μ©ν λ°©λ²
AppCard.vue
<template>
<div class="card">
<div class="card-body">
<!-- type : new, notice -->
<!-- <span class="badge text-bg-secondary">{{
type == "news" ? "λ΄μ€" : "곡μ§μ¬ν"
}}</span> -->
<span class="badge text-bg-secondary"> {{ typeName }}</span>
<h5 class="card-title red mt-2">{{ title }}</h5>
<p class="card-text">{{ contents }}</p>
<!-- v-ifλ₯Ό ν΅ν΄μ isLikeκ° trueμΌ κ²½μ° μμ μλκ²½μ° λ°μ νκ·Έκ° λ
ΈμΆλλ€.-->
<!-- <a href="#" v-if="isLike" class="btn btn-danger">μ’μμ</a>
<a href="#" v-else class="btn btn-outline-danger">μ’μμ</a> -->
<!-- computedλ₯Ό μ΄μ©ν νκ·Έ λ¬ΆκΈ° -->
<a href="#" class="btn" :class="isLikeClass">μ’μμ</a>
</div>
</div>
</template>
<script>
import { computed } from "vue";
export default {
//κ°μ²΄ νμ
μΌλ‘ μ μΈ
props: {
//μμ±μ μ μ
type: {
type: String,
default: "news",
//νμ
μ΄ λͺ
νν λ€μ΄κ° μλμ§ μ ν¨μ± κ²μ¬λ₯Ό μ§ννλ€. λ§μ½ νμ
μ΄ μλͺ» λ€μ΄κ° μμΌλ©΄ μ½μμ 'Invalid prop'λΌλ μ€λ₯λ₯Ό λ³Ό μ μλ€.
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: () => {
return;
},
},
},
// setup() ν¨μμ 첫 λ²μ§Έ 맀κ°λ³μλ‘ porps κ°μ²΄λ₯Ό λ°μ μ¬μ©ν μ μλ€.
setup(props) {
// computedλ₯Ό μ΄μ©ν΄ μ’μμλ₯Ό νλλ‘ λ¬Άμ΄λ³΄μ
const isLikeClass = computed(() =>
props.isLike ? "btn-danger" : "btn-outline-danger",
);
const typeName = computed(() =>
props.type === "news" ? "λ΄μ€" : "곡μ§μ¬ν",
);
return { isLikeClass, typeName };
},
};
</script>
<style></style>
λͺ¨λ
props
λ μμ μμ±κ³Ό νμ μμ±κ°μ λ¨λ°©ν₯ λ°μΈλ©μΌλ‘ νμ±λμ΄ μλ€. λ§μ½ μμ μμ±μ΄ μ λ°μ΄νΈλλ©΄ νμ μμ±λ μ λ°μ΄νΈλμ§λ§ κ·Έ λ°λλ μλλ€. μ΄λ¬ν μ±μ§μ νμ μμ± λ³κ²½ μ€μλ‘ μμ μμ±μ λ³κ²½νμ¬ μ±μ λ°μ΄ν° νλ¦μ μ΄ν΄νκΈ° μ΄λ ΅κ² λ§λλ κ²μ λ°©μ§ν μ μλ€.
λν μμ μ»΄ν¬λνΈκ° μ λ°μ΄νΈλ λλ§λ€ νμ μ»΄ν¬λνΈμ λͺ¨λprops
λ μ΅μ μνλ μ΅κΈ°ν λλ€. κ·Έλ κΈ° λλ¬Έμ μμ μ»΄ν¬λνΈ λ΄λΆμμ propsλ₯Ό λ³κ²½νμ§ μμμΌ νλ€.
Boolean
νμ μ Propsλ νΉλ³ν μΊμ€ν κ·μΉμ΄ μμ΅λλ€.<MyComponet>
κ° λ€μκ³Ό κ°μ΄ μ μΈλμ΄ μλ€.
<script>
export default{
props: {
disabled: Boolean
}
}
</script>
MyComponent
λ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μλ€.
<!-- :disabled="true" μ λ¬νλ κ²κ³Ό λμΌνλ€. -->
<MyComonent disabled>
<!-- :disabled="false" μ λ¬νλ κ²κ³Ό λμΌνλ€. -->
<MyComonent>