
props는 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달해줄 때 필요한 옵션props: ["dataName", "dataName2"]
props: {
dataName: Number
}
- 데이터 타입 설정
props: {
dataName: {
type: Number
},
dataName2: {
type: [Number, String]
}
}
Number, String ... 다수의 타입 지정도 가능
- 필수 값 여부 설정
props: {
data: {
type: Number,
required: true
}
}
true 또는 false로 지정 가능
- 기본 값 설정
props: {
data: {
type: Number,
default: 1
}
}
props: {
data: {
type: Array,
default: () => {
return [1, 2, 3]
}
}
}
- 벨리데이터 설정
props: {
data: {
type: Number,
required: true,
defalut: 1,
validator: (value) => {
return value > 0
}
}
}
props 옵션 사용 시 장점?
- props의 추가 속성을 지정해주면 더 정확한 데이터 전달과 타입 추론이 가능해짐 -> 추후 데이터 때문에 문제가 생길 확률이 줄어듦
watch란 특정 데이터 변경을 감지해서 로직을 자동으로 수행해주는 속성
- deep 속성 사용하기
<script>
data() {
return {
accountInfo: {
name: "홍길동",
age: 25,
}
}
},
watch: {
accountInfo: {
handler() {
console.log("watched accountInfo");
},
deep: true,
}
}
</script>
deep 옵션을 true로 지정해주면 watch가 동작함<script>
watch: {
accountInfo: {
handler() {
console.log("watched accountInfo");
},
deep: true,
immediate: true,
}
}
</script>
immediate 옵션을 true로 지정해주면 컴포넌트가 생성되는 즉시 실행됨
- 쿼테이션안에 특정 값 지정하기
<script>
watch: {
"accountInfo.age"() {
console.log("watched accountInfo");
}
}
</script>
deep을 사용하지 않고 따옴표 안에 객체의 특정 키 값을 정의해주면 watch가 동작함차이점?
deep옵션 사용 시에는 객체 안 모든 하위 값의 변경을 감지하고, 따옴표 표현식은 오브젝트 특정 키 값을 지정해서 특정 데이터 변경을 감지해줄 수 있다.
getElementById나 querySelector 함수와 같은 역할을 한다.$emit 대신 사용 가능ref로 속성 명을 지정this.refs로 접근 가능// Parent.vue
<template>
<Child ref="child" />
</template>
<script>
import Child from "@/components/child.vue"
name: "Parent",
components: {
Child,
},
mounted() {
// 자식 컴포넌트에 접근
this.$refs.child;
}
</script>
// Child.vue
<template>
<!-- 자식 컴포넌트의 button 태그에 ref 속성 지정 -->
<button ref="btn" @click="clickEvent()">버튼</button>
</template>
<script>
name: "Child",
methods: {
clickEvent() {
console.log("클릭 이벤트 발생");
}
}
</script>
// Parent.vue
<template>
<Child ref="child" />
</template>
<script>
import Child from "@/components/child.vue"
name: "Parent",
components: {
Child,
},
mounted() {
this.$refs.child.clickEvent();
// 클릭 이벤트 발생
this.$refs.child.$refs.btn.click();
// 클릭 이벤트 발생
}
</script>
$refs로 자식 컴포넌트의 ref 속성을 가진 엘리먼트에 접근 가능this.$parent로 부모 컴포넌트에 접근 가능ref 속성 사용 시 장점?
$emit의 사용없이 자식 컴포넌트 요소에 쉽게 접근이 가능하다.
유의사항
- DOM에 직접 접근을 지양한다는 Vue의 목적에 위배
- 컴포넌트가 랜더링된 이후에 접근이 가능(
mounted후에 접근 가능)- 직접 접근하는 방식이라 상태를 추적하기 어렵기 때문에 정말 필요할 때 사용하기를 권장