Vue3使用 provid,inject,defineExpose ,defineProps ,defineEmits,bus总线中的mitt 进行传参

Vue3使用 provid,inject,defineExpose ,defineProps ,defineEmits,bus总线中的mitt 进行传参1 provide 依赖 和 inject 注入 祖传后代 作用 祖先组件将属性或方法传递给子后代组件使用 省去多层传值的繁琐 1 祖先组件 使用 provide 导出 import provide from

大家好,我是讯享网,很高兴认识大家。

1.provide(依赖)和  inject(注入) (祖传后代)

作用:祖先组件将属性或方法传递给子后代组件使用,省去多层传值的繁琐

1)祖先组件:使用provide导出

import { provide } from "vue";

provide ( "传递名","传递值" )

 2)后代组件:使用inject接收

import { inject } from "vue";

const xxx = injiect("传递名")

概念:将祖先组件的属性和方法直接传递给后代组件中,在使用祖先函数时:后代元素调用祖先组件的函数时,可以传递自身的数据给函数,然后在祖先组件中执行,从而直接改变祖先组件的数据,无需经过复杂的传参。

注意: xxx为自定义变量,传递名需要一致,传递值类型不限,仅限后代,数据是响应式的

适用范围:祖先传递后代方法

2. defineExpose (子传父)

作用:父组件调用子组件中的数据或方法

1)子组件:使用defineExpose暴露

const child= reactive({}) 

defineExpose({

    child

})

2)父组件:在子组件的标签上使用 ref = xxx  , 这个xxx变量需要声明为ref(null),使用这个声明的变量.value.传递的值或方法就可以直接进行调用。

<shopcar ref="callChild"></shopcar>

const callChild= ref(null)

function change(){//change自定义函数

        onsle.log(callChild.value.child)

}

 概念:在子组件中使用defineExpose函数将属性或方法进行暴露给父组件,父组件使用ref属性可以直接调用子组件的方法,多用于父组件调用其他组件的方法或值给子组件,从而改变子组件的数据,可同时传递多个数据。

注意:父组件必须要在子组件的标签上定义ref属性等于一个值,并将该值当作变量声明为ref(null),使用时也必须.value.去使用所需的方法或属性,同时这个defineExpose方法是异步的,所以只能在其他函数的内部使用,仅限父子,传递值类型不限,数据是响应式的

适用范围:仅限父传子

3.defineProps (父传子)

作用:使用属性绑定的方式传值给子组件

1)父组件中:将子组件的标签上绑定xxx所传递的值

<about  :pro="xxx"></about>

2)子组件中: 使用defineProps函数用数组包裹起来对应父组件的绑定名

const pro = defineProps(["pro"])

概念:将父组件的值以属性的方式传递给子组件, 子组件使用defineProps函数查找到就可以使用,这种方法是父子传值最好的方式

注意:只能传递值

适用范围:仅限父传子

4.defineEmits(子传父)

作用:在子组件中使用自定义事件的方式触发父组件的自定义事件,自定义事件无参时默认传递子组件传递的参数

1)子组件中:创建自定义事件,使用自定义 emits 回调函数进行传值 

const emits = defineEmits(['change'])  //使用defineEmits创建自定义事件

function del(){//一般在自定义函数内进行事件的触发传值


讯享网

        emits ('change' xxx) //参数1:自定义事件 参数2:xxx自定义事件执行时的默认传参

}

2)父组件中: 在子组件标签上绑定自定义事件,然后自定义一个函数默认传参接收

<about  @change="add"></about >

 function change( item ){

         console.log( item )

        //item为子组件调用defineEmits实例的参数2 xxx

 }

概念:在子组件中使用 defineEmits方法定义一个自定义事件,同时该方法执行后会返回一个回调函数,也就是emits 这个变量,当我们使用这个回调函数时就可以触发自定义事件,并传值给父组件,传递的值不限

注意:自定义的事件必须经过defineEmits方法注册,然后使用回调的函数进行触发自定义事件,传递的值可以是任意数据类型,也可以是方法

适用范围:仅限子传父

5.Bus总线中的mitt(任意组件传递)

作用:在已调用过的组件和路由中任意传递属性和方法

1)安装模块

npm install mitt   //安装模块

2)在stores文件夹中创建一个bus.js文件(自定义名称),进行引入模块和导出实例化对象

import mitt from 'mitt'   //两行就可以了

export const bus=mitt()

3)定义接收方的函数:

import { bus } from '../stores/bus.js'  //导入js文件,解构bus实例对象

bus.on('xxx', (res) => {

  console.log(res)

//使用on方法

//参数1:定义回调函数的名称 , 参数2:定义回调函数接收emit传递过来的参数

})

4) 定义传递方:

bus.emit('xxx', transfer) //transfer是传递的值可以为任意值和方法

概念:通过mitt函数的实例化,让导入的该实例化的对象可以对它定义事件和对应的函数,通过事件名调用其他文件在里面定义的函数

注意:使用mitt传递的值只有ref类型的是响应式的,reactive不是响应式,必须安装模块,只有被调用过的组件或路由内定义的事件监听器才会加入到该all中

适用范围:所有组件和路由

扩展辅助理解:

mitt实例化对象后拥有的四个对象属性

on:用于添加事件监听器,接受事件名称和事件处理函数作为参数。
off:用于移除事件监听器,接受事件名称和事件处理函数作为参数。
emit:用于触发事件,接受事件名称和可选的数据作为参数。
all:一个对象,存储了所有事件监听器。

6.总结

1)将函数给其他组件使用的目的大多数是为了,在其他组件中拿到所需要的值,然后再本身的函数进行操作数据。

2)传递的参数是否具备响应式,需要注意

3)组件之间的传值目的是为了区分好组件之间的关联,实现高内聚低耦合,每个组件都有各自的功能且相互独立

4) 我认为组件内部的内容,应该只能由组件本身进行改变,一旦数据发生在其他页面直接改变,那么数据的变化不再可控(非常不利于维护),违背了组件的原意

小讯
上一篇 2025-02-24 19:36
下一篇 2025-04-04 21:51

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127923.html