Vue3的组件通信方式有哪些

Vue3的组件通信方式有哪些

本篇内容主要讲解“Vue3的组件通信方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3的组件通信方式有哪些”吧!

    Props

    父组件传值给子组件(简称:父传子)

    Props 文档

    父组件

    //Parent.vueimportChildfrom'./components/Child.vue'//引入子组件letmessage='雷猴'

    子组件

    //Child.vueconstprops=defineProps({msg:{type:String,default:''}})console.log(props.msg)//在js里需要使用props.xxx的方式使用。在html中使用不需要props

    子组件

    //Child.vue//注册一个自定义事件名,向上传递时告诉父组件要触发的事件。constemit=defineEmits(['changeMsg'])functionhandleClick(){//参数1:事件名//参数2:传给父组件的值emit('changeMsg','鲨鱼辣椒')}

    和 props 一样,在

    子组件

    //Child.vueimport{ref}from'vue'constmessage=ref('蟑螂恶霸')functionchangeMessage(data){message.value=data}使用defineExpose向外暴露指定的数据和方法defineExpose({message,changeMessage})

    子组件

    //Child.vue

    打开控制台可以看到,属性被挂到 HTML 元素上了。

    多个元素的情况

    但在 Vue3 中,组件已经没规定只能有一个根元素了。如果子组件是多个元素时,上面的例子就不生效了。

    //Child.vue

    此时可以使用 $attrs 的方式进行绑定。

    //Child.vue

    v-model

    v-model 是 Vue 的一个语法糖。在 Vue3 中的玩法就更多(晕)了。

    单值的情况

    组件上的 v-model 使用 modelValue 作为 prop 和 update:modelValue 作为事件。

    v-model 参数文档

    父组件

    //Parent.vueimport{ref}from'vue'importChildfrom'./components/Child.vue'constmessage=ref('雷猴')

    子组件

    //Child.vueimport{ref}from'vue'//接收constprops=defineProps(['modelValue'//接收父组件使用v-model传进来的值,必须用modelValue这个名字来接收])constemit=defineEmits(['update:modelValue'])//必须用update:modelValue这个名字来通知父组件修改值functionhandleClick(){//参数1:通知父组件修改值的方法名//参数2:要修改的值emit('update:modelValue','喷射河马')}

    你也可以这样写,更加简单

    子组件

    //Child.vueimport{ref}from'vue'//接收constprops=defineProps(['modelValue'//接收父组件使用v-model传进来的值,必须用modelValue这个名字来接收])

    多个 v-model 绑定

    多个 v-model 绑定 文档

    父组件

    //Parent.vueimport{ref}from'vue'importChildfrom'./components/Child.vue'constmessage1=ref('雷猴')constmessage2=ref('蟑螂恶霸')

    子组件

    //Child.vueimport{ref}from'vue'//接收constprops=defineProps({msg1:String,msg2:String})constemit=defineEmits(['update:msg1','update:msg2'])functionchangeMsg1(){emit('update:msg1','鲨鱼辣椒')}functionchangeMsg2(){emit('update:msg2','蝎子莱莱')}

    v-model 修饰符

    v-model 还能通过 . 的方式传入修饰。

    v-model 修饰符 文档

    父组件

    //Parent.vueimport{ref}from'vue'importChildfrom'./components/Child.vue'constmessage=ref('hello')

    子组件

    //Child.vueimport{ref,onMounted}from'vue'constprops=defineProps(['modelValue','modelModifiers'])constemit=defineEmits(['update:modelValue'])onMounted(()=>{//判断有没有uppercase修饰符,有的话就执行toUpperCase()方法if(props.modelModifiers.uppercase){emit('update:modelValue',props.modelValue.toUpperCase())}})

    插槽 slot

    插槽可以理解为传一段 HTML 片段给子组件。子组件将 元素作为承载分发内容的出口。

    插槽 文档

    本文打算讲讲日常用得比较多的3种插槽:默认插槽、具名插槽、作用域插槽。

    默认插槽

    插槽的基础用法非常简单,只需在 子组件 中使用 标签,就会将父组件传进来的 HTML 内容渲染出来。

    默认插槽 文档

    父组件

    //Parent.vue

    子组件

    //Child.vue

    具名插槽

    具名插槽 就是在 默认插槽 的基础上进行分类,可以理解为对号入座。

    具名插槽 文档

    父组件

    //Parent.vue

    子组件

    //Child.vue

    父组件需要使用