0


超详细的 | vue3组件之间的通信方式(一)(父传子、子传父)一篇文章让你彻底搞懂如何传值

一、父组件向子组件传值(props)

1.废话不多说直接上代码

父组件:FatherTest.vue

  1. <template>
  2. <div class="box">
  3. <h1>props:我是父组件曹操</h1>
  4. <Child info="我是曹操" :money="money"></Child>
  5. </div>
  6. </template>
  7. <script setup lang="ts">
  8. //导入子组件 props:可以实现父子组件通信,props数据还是只读的
  9. import Child from "./Child.vue";
  10. import { ref } from "vue";
  11. //定义数据
  12. let money = ref(8888);
  13. </script>

子组件:Child.vue

  1. <template>
  2. <div class="son">
  3. <h1>我是子组件:曹丕</h1>
  4. <p>{{props.info}}</p>
  5. <p>{{props.money}}</p>
  6. </div>
  7. </template>
  8. <script setup lang="ts">
  9. //注意:
  10. //1.需要使用到defineProps方法去接受父组件传递过来的数据
  11. //2.defineProps是Vue3提供方法,不需要引入直接使用
  12. let props = defineProps(['info','money']); //数组|对象写法都可以
  13. </script>

在 Vue 3 中,我们使用

  1. <script setup>

语法糖,这让组件定义更加简洁。

  1. ref

用于定义响应式数据。

  1. defineProps

是 Vue 3 中的一个函数,用于定义组件的 props,使用

  1. defineProps

函数定义的 props 是只读的响应式对象,它们的值由父组件传递而来,不能被子组件修改。

二、子组件向父组件传值(自定义事件)

子组件通过

  1. emit

函数可以实现了子组件向父组件传值的功能

父组件:FatherTest.vue

  1. <template>
  2. <div>
  3. <!--
  4. vue2框架当中:@click这种写法自定义事件,可以通过.native修饰符变为原生DOM事件
  5. vue3框架下面写法其实即为原生DOM事件
  6. vue3:原生的DOM事件不管是放在标签身上、组件标签身上都是原生DOM事件
  7. -->
  8. <!-- 绑定自定义事件child-event:实现子组件给父组件传递数据 -->
  9. <Child @child-event="handler3" @click="handler4"></Child>
  10. </div>
  11. </template>
  12. <script setup lang="ts">
  13. //引入子组件
  14. import Child from './Child.vue';
  15. //事件回调---4
  16. const handler3 = (param1,param2)=>{
  17. console.log(param1,param2);
  18. }
  19. //事件回调--5
  20. const handler4 = (param1,param2)=>{
  21. console.log(param1,param2);
  22. }
  23. </script>

子组件:Child.vue

  1. <template>
  2. <div class="child">
  3. <p>我是子组件2</p>
  4. <button @click="handler">点击我触发自定义事件child-event</button>
  5. <button @click="emitClick">点击我触发自定义事件click</button>
  6. </div>
  7. </template>
  8. <script setup>
  9. // 使用 defineEmits 声明可以触发的自定义事件
  10. const emit = defineEmits(['child-event', 'click']);
  11. // 按钮点击回调,触发 child-event
  12. const handler = () => {
  13. emit('child-event', '参数1', '参数2');
  14. };
  15. // 另一个按钮点击回调,触发 click 事件
  16. const emitClick = () => {
  17. emit('click', '小猫', '小狗');
  18. };
  19. </script>
  1. defineEmits

是 Vue 3 Composition API 中的一个函数,用于在组件中明确地声明该组件可以触发的自定义事件。父组件通过

  1. @child-event

监听子组件发出的事件,并在事件发生时执行

  1. handler3

方法。

子传父 补充说明:defineExpose也可以实现子组件向父组件传递数据

defineExpose 是 Vue 3 的 Composition API 中一个新的实用函数,用于在 <script setup> 语法下显式暴露组件的公共属性和方法

这在处理子组件时特别有用,允许父组件访问子组件的特定属性或方法

在 Vue 3 中,当我们使用 <script setup> 语法糖时,组件默认不会自动暴露内部的任何状态或方法给外部使用,为了显式暴露某些属性或方法,可以使用 defineExpose

子组件

  1. <template>
  2. <div>
  3. <p>Count: {{ count }}</p>
  4. <button @click="childEvent">childEvent</button>
  5. </div>
  6. </template>
  7. <script setup>
  8. import { ref } from 'vue';
  9. const count = ref(0);
  10. const childEvent=()=> {
  11. count.value++;
  12. }
  13. // 使用 defineExpose 来暴露 count的值 和 childEvent方法
  14. defineExpose({
  15. count,
  16. childEvent,
  17. });
  18. </script>

父组件

  1. <template>
  2. <div>
  3. <Child ref="childRef" />
  4. <button @click="accessChild">Child</button>
  5. </div>
  6. </template>
  7. <script setup>
  8. import { ref, onMounted } from 'vue';
  9. import Child from './Child.vue';
  10. const childRef = ref(null);
  11. const accessChild =()=> {
  12. if (childRef.value) {
  13. console.log('Current count:', childRef.value.count); /// 打印出来为子组件count的值0
  14. childRef.value.childEvent(); 可以触发子组件childEvent方法 实现子组件count++
  15. }
  16. }
  17. </script>
  • defineExpose 用于在 <script setup> 中显式暴露组件内部状态、属性和方法;
  • 父组件可以通过 ref 访问子组件实例并调用暴露的属性和方法

本文转载自: https://blog.csdn.net/weixin_48642777/article/details/141677544
版权归原作者 前端阿帅 所有, 如有侵权,请联系我们删除。

“超详细的 | vue3组件之间的通信方式(一)(父传子、子传父)一篇文章让你彻底搞懂如何传值”的评论:

还没有评论