웹개발/Vue.js

[Vue.js] props, 사용자 정의 event

chuseok 2024. 5. 29. 09:18

속성을 이용한 정보 전달

자식 컴포넌트에서 props 옵션으로 속성을 정의하고 부모 컴포넌트에서는 v-on 디렉티브를 이용해 자식 컴포넌트의 속성에 정보를 전달한다.

또한 속성을 이용해 객체 전달을 할 수 있다.

속성은 자식 컴포넌트가 필요한 데이터를 속성으로 전달받아 UI를 렌더링하는 읽기 전용의 값이므로 변경하지 않는 것을 권장한다.

//App.vue
<CheckboxItem v-for="idol in idols" :key="idol.id" :idol="idol"/>
//CheckItem.vue
<template>
    <li><input type="checkbox" :key="idol.id" :checked="idol.checked"/>{{idol.name}}</li>
</template>
    
<script>
export default {
    name: 'CheckboxItem',
    props: ['idol']
}
</script>

 

이벤트 에미터 사용

컴포넌트 간에 이벤트를 공유하기 위해 사용한다.

//자식 컴포넌트
export default {
    name: 'DealUpdate',
    components: {
        Datepicker
    },
    props: {
        // title: String,
        // user: { type: String },
        // accountLog: Object,
        accountLog: {
        type: Object,
            required: true,
        default: () => ({})
        },
    },
    emits: ['closeToParent'],
    setup(props, context) {
    	console.log(props.accountLog)
    	context.emit('closeToParent')	//부모의 이벤트 실행
    }
}

속성의 유효성 검증

속성을 정의할 때 속성에 대한 유효성 검증이 필요하다면 객체 형태로 속성을 정의할 수 있다.

export default {
    props: {
        속성명: 타입명,
        속성명2: [타입명1, 타입명2],
        속성명3: {
            type: 타입명,
            required: [true/false, 기본값: false],
            default: [가본값 또는 기본값 리턴 함수, 기본값: undefined]
        }
    }
}
export default {
	name: "CheckItem",
    props: {
        name: String,
    	id: [Number, String],
        ids: Array,
        checked: {
            type: Boolean,
            required: false,
            default: false
        }
    }
}

 

사용자 정의 이벤트

자식컴포넌트에서 click event가 발생하는 위치에 $emit('이벤트명', event argument)

<template>
    <div>이름: <input type="text" v-model="name">
    <button @click="$emit('nameChanged', {name})">이벤트 발신</button></div>
</template>

<script setup lang='ts'>
let name = ''
</script>

<style>

</style>

부모 컴포넌트에서 @전달받은 이벤트명="event handler"

<template>
    <div>
        <InputName @nameChanged="nameChangedHandler"/>
        <br>
        <h3>App 데이터: {{parentName}}</h3>
    </div>
</template>
    
<script setup lang='ts'>
import InputName from './components/InputName.vue'
import { ref } from 'vue'
let parentName = ref('')
function nameChangedHandler(e) {
    parentName.value = e.name
}
    
</script>
    
<style>
    
</style>

 

'웹개발 > Vue.js' 카테고리의 다른 글

[Vue.js] 기초  (0) 2024.05.24