Vue3 手把手教你自定义组件——setup版
2023-09-04 10:26:27
前言
Vue3 中的 setup 是一个语法糖,它允许你使用函数来代替选项对象来定义组件。这使得组件的定义更加简洁和易读,同时也不失灵活性。
定义一个自定义组件
要定义一个自定义组件,你需要使用 Vue.defineComponent() 函数。该函数接收一个对象作为参数,该对象包含组件的定义。
const MyComponent = Vue.defineComponent({
setup() {
// 组件的逻辑
}
});
在 setup 函数中,你可以使用 Vue3 的响应式 API 来定义组件的状态和行为。例如,你可以使用 ref() 函数来定义一个响应式变量,或者使用 watch() 函数来监听一个响应式变量的变化。
使用 props
props 是组件用来接收父组件数据的属性。要使用 props,你需要在组件的定义对象中定义一个 props 选项。
const MyComponent = Vue.defineComponent({
setup() {
// 组件的逻辑
},
props: {
message: {
type: String,
required: true
}
}
});
在父组件中,你可以通过使用 v-bind 指令来将数据传递给子组件。
<MyComponent v-bind:message="myMessage"></MyComponent>
使用 events
events 是组件用来向父组件发送数据的属性。要使用 events,你需要在组件的定义对象中定义一个 events 选项。
const MyComponent = Vue.defineComponent({
setup() {
// 组件的逻辑
},
events: {
'update-message'() {
// 当组件发出 'update-message' 事件时触发的回调函数
}
}
});
在子组件中,你可以通过使用 $emit() 方法来触发事件。
this.$emit('update-message');
在父组件中,你可以通过使用 v-on 指令来监听子组件发出的事件。
<MyComponent v-on:'update-message'="handleUpdateMessage"></MyComponent>
使用 slots
slots 是组件用来包含父组件内容的区域。要使用 slots,你需要在组件的定义对象中定义一个 slots 选项。
const MyComponent = Vue.defineComponent({
setup() {
// 组件的逻辑
},
slots: {
default: () => {
// 默认插槽的渲染函数
}
}
});
在父组件中,你可以通过使用 slot 标签来将内容传递给子组件。
<MyComponent>
<template slot="default">
<h1>Hello World</h1>
</template>
</MyComponent>
使用 expose
expose 可以让子组件将数据或方法暴露给父组件。要使用 expose,你需要在组件的定义对象中定义一个 expose 选项。
const MyComponent = Vue.defineComponent({
setup() {
// 组件的逻辑
},
expose: {
message: () => {
return this.message;
}
}
});
在父组件中,你可以通过使用 ref 指令来访问子组件暴露的数据或方法。
<MyComponent ref="myComponent"></MyComponent>
console.log(this.$refs.myComponent.message());
使用 v-model
v-model 是 Vue3 中的一个语法糖,它可以简化表单元素的绑定。要使用 v-model,你需要在组件的定义对象中定义一个 model 选项。
const MyComponent = Vue.defineComponent({
setup() {
// 组件的逻辑
},
model: {
prop: 'message',
event: 'update-message'
}
});
在父组件中,你可以通过使用 v-model 指令来将表单元素与子组件绑定。
<MyComponent v-model="myMessage"></MyComponent>
总结
Vue3 的 setup 语法糖使自定义组件的定义更加简洁和易读。通过使用 props、events、slots、expose 和 v-model 等特性,你可以构建功能强大且可重用的组件。