自学内容网 自学内容网

vue3中的组件通信方式有哪些?

        在vue3里,组件是一个非常重要的概念,项目中各个组件间的通信也是一个非常常见的需求,接下来我将为大家展示vue3组件有哪几种常见的通信方式。

一、props

适用场景:父子组件之间的通信

父传子:

        父组件在子组件的标签中通过写属性名加属性值的方式,可以直接将数据传递给子组件(要想数据是响应式,必须使用通过v-bind,或其简写形式)

<template>
  <div class="father">
    <h3>父组件</h3>
<h4>汽车:{{ car }}</h4>
<Child :car="car" />
  </div>
</template>

<script setup lang="ts" name="Father">
// @ts-ignore
import Child from './Child.vue'
import {ref} from 'vue'
// 数据
let car = ref('奔驰')
</script>

<style scoped>
.father{
background-color:rgb(165, 164, 164);
padding: 20px;
border-radius: 10px;
}
</style>

   子组件需要通过defineProps接收参数 

<template>
  <div class="child">
    <h3>子组件</h3>
<h4>玩具:{{ toy }}</h4>
<h4>父组件的车:{{ car }}</h4>
  </div>
</template>

<script setup lang="ts" name="Child">
import {ref} from 'vue'
// 数据
let toy = ref('奥特曼')
// 声明接收props
defineProps(['car'])
</script>

<style scoped>
.child{
background-color: skyblue;
padding: 10px;
box-shadow: 0 0 10px black;
border-radius: 10px;
}
</style>

效果:

 

子传父:

        需要父组件先传递一个函数给子组件,子组件调用函数并传递参数

        父组件传递了一个叫做sendToy的数据,其中的值是父组件的getToy函数

<template>
  <div class="father">
    <h3>父组件</h3>
<h4>汽车:{{ car }}</h4>
<h4 v-show="toy">子给的玩具:{{ toy }}</h4>
<Child :car="car" :sendToy="getToy"/>
  </div>
</template>

<script setup lang="ts" name="Father">
// @ts-ignore
import Child from './Child.vue'
import {ref} from 'vue'
// 数据
let car = ref('奔驰')
let toy = ref('')
// 方法
function getToy(value:string){
toy.value = value
}
</script>

<style scoped>
.father{
background-color:rgb(165, 164, 164);
padding: 20px;
border-radius: 10px;
}
</style>

             子组件接收了sendToy数据,并在调用了函数时传递了参数

<template>
  <div class="child">
    <h3>子组件</h3>
<h4>玩具:{{ toy }}</h4>
<h4>父组件的车:{{ car }}</h4>
<button @click="sendToy(toy)">把玩具给父组件</button>
  </div>
</template>

<script setup lang="ts" name="Child">
import {ref} from 'vue'
// 数据
let toy = ref('奥特曼')
// 声明接收props
defineProps(['car','sendToy'])
</script>

<style scoped>
.child{
background-color: skyblue;
padding: 10px;
box-shadow: 0 0 10px black;
border-radius: 10px;
}
</style>

效果:

        点击按钮,子组件将会传递toy给父组件,父组件并会显示出文字 

二、自定义事件 

适用场景:子组件向父组件传递数据

示例:

        父组件需要给子组件绑定自定义事件,并指定事件触发时将要执行的回调函数,send-toy 为子组件Child的事件名 ,saveToy为事件触发时的回调函数,参数为子组件传递的值

<template>
  <div class="father">
    <h3>父组件</h3>
<h4 v-show="toy">子给的玩具:{{ toy }}</h4>
<!-- 给子组件Child绑定事件 -->
 <!-- send-toy 为子组件Child的事件名 ,saveToy为事件触发时的回调函数,参数为子组件传递的值 -->
    <Child @send-toy="saveToy"/>
  </div>
</template>

<script setup lang="ts" name="Father">
// @ts-ignore
  import Child from './Child.vue'
import { ref } from "vue";
// 数据
let toy = ref('')
// 用于保存传递过来的玩具
function saveToy(value:string){
console.log('saveToy',value)
toy.value = value
}
</script>

<style scoped>
.father{
background-color:rgb(165, 164, 164);
padding: 20px;
    border-radius: 10px;
}
.father button{
margin-right: 5px;
}
</style>

         子组件需要声明事件,并选择在合适的时机通过emit触发事件

<template>
  <div class="child">
    <h3>子组件</h3>
<h4>玩具:{{ toy }}</h4>
<button @click="emit('send-toy',toy)">测试</button>
  </div>
</template>

<script setup lang="ts" name="Child">
import { ref } from "vue";
// 数据
let toy = ref('奥特曼')
// 声明事件
const emit =  defineEmits(['send-toy'])
</script>

<style scoped>
.child{
margin-top: 10px;
background-color: rgb(76, 209, 76);
padding: 10px;
box-shadow: 0 0 10px black;
border-radius: 10px;
}
</style>

效果: 

点击按钮将触发自定义事件,父组件接收到子组件传递的数据 

三、mitt

        适用场景:可以实现任意组件之间的通信

需要提前安装好mitt,并配置好mitt

emiter.ts:

// 引入mitt
import mitt from 'mitt'

// 调用mitt得到emitter,emitter能:绑定事件、触发事件
const emitter = mitt()

// 暴露emitter
export default emitter

兄弟组件:

<template>
  <div class="child1">
    <h3>子组件1</h3>
<h4>玩具:{{ toy }}</h4>
<button @click="emitter.emit('send-toy',toy)">玩具给弟弟</button>
  </div>
</template>

<script setup lang="ts" name="Child1">
import {ref} from 'vue'
// @ts-ignore
import emitter from '@/utils/emitter';

// 数据
let toy = ref('奥特曼')
</script>

<style scoped>
.child1{
margin-top: 50px;
background-color: skyblue;
padding: 10px;
box-shadow: 0 0 10px black;
border-radius: 10px;
}
.child1 button{
margin-right: 10px;
}
</style>
<template>
  <div class="child2">
    <h3>子组件2</h3>
<h4>电脑:{{ computer }}</h4>
<h4>哥哥给的玩具:{{ toy }}</h4>
  </div>
</template>

<script setup lang="ts" name="Child2">
import {ref,onUnmounted} from 'vue'
// @ts-ignore
import emitter from '@/utils/emitter';
// 数据
let computer = ref('联想')
let toy = ref('')

// 给emitter绑定send-toy事件
emitter.on('send-toy',(value:any)=>{
toy.value = value
})
// 在组件卸载时解绑send-toy事件
onUnmounted(()=>{
emitter.off('send-toy')
})
</script>

<style scoped>
.child2{
margin-top: 50px;
background-color: orange;
padding: 10px;
box-shadow: 0 0 10px black;
border-radius: 10px;
}
</style>

 emitter使用on来绑定事件、emit来触发事件、off来解绑事件、clear清空绑定的所有事件

效果:

点击之后将传递数据给兄弟组件,并在兄弟组件中显示数据


原文地址:https://blog.csdn.net/wandongle/article/details/143475342

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!