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
후에 접근 가능)- 직접 접근하는 방식이라 상태를 추적하기 어렵기 때문에 정말 필요할 때 사용하기를 권장