vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景

vue3组合式API实现父组件触发子组件中的方法 | vue3中ref的用法 | defineExpose的使用场景

一、问题背景

代码环境:vue3 (组合式API setup)+ vite

碰到的问题:代码为父组件中的一个按钮,触发一个填写表单的Dialog弹出框,在填写信息发送请求添加一条信息后,再次点击触发按钮,发现封装Dialog的子组件中,表单中的值没有没有重置。

解决思路:在点击父组件中的触发按钮时,触发子组件中的重置方法,对表单项进行重置。

二、解决方法

在 Vue 3 的组合式 API 中,您可以使用 ref 和 value 来获取子组件实例,并调用子组件中的方法。

官网详解

网址组件上的ref

三、示例

  1. 父组件中,您需要为子组件添加一个 ref:
<template>
  <div>
    <child-component ref="childRef"></child-component>
    <button @click="triggerChildMethod">触发子组件方法</button>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const childRef = ref(null);

    const triggerChildMethod = () => {
      childRef.value.methodName(/* 参数 */);
    };

    return {
      childRef,
      triggerChildMethod
    };
  }
}
</script>

  1. 子组件中,您需要在 setup 函数中定义一个需要调用的方法:
<template>
  <div>
    <!-- 子组件内容 -->
  </div>
</template>

<script setup>
import { ref } from 'vue';

const methodName = () => {
    // 方法的代码
};

// !!!!!用了<script setup>的不要忘记写这个
defineExpose({
  methodName
});
</script>

:使用了 <script setup> 的组件是默认私有的:一个父组件无法访问到一个使用了 <script setup> 的子组件中的任何东西,除非子组件在其中通过 defineExpose 宏显式暴露。如果没有暴露的话,则会报错childRef.value.methodName is not definded

该注释的官网详解:(地址:组件上的ref,该网页滑到最后可看到下图内容)

image-20231012153627598

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3,可以使用组合式API实现组件组件传递数据。下面是一种常见的方法: 1. 在组件使用`emits`选项声明一个自定义事件。例如,可以将一个名为`update-parent`的事件声明为组件通知组件更新的事件。 ```javascript // ChildComponent.vue <template> <button @click="updateParent">Update Parent</button> </template> <script> import { defineComponent, useContext } from 'vue' export default defineComponent({ emits: ['update-parent'], methods: { updateParent() { this.$emit('update-parent', 'Data from child') } } }) </script> ``` 2. 在组件使用组件声明的事件来监听并更新数据。例如,可以在组件使用`@update-parent`来捕获组件触发事件,并更新组件的数据。 ```javascript // ParentComponent.vue <template> <div> <p>{{ childData }}</p> <ChildComponent @update-parent="handleUpdate" /> </div> </template> <script> import { defineComponent, ref } from 'vue' export default defineComponent({ setup() { const childData = ref('') const handleUpdate = (data) => { childData.value = data } return { childData, handleUpdate } } }) </script> ``` 在上述示例,当组件的按钮被点击时,会触发`update-parent`事件,并将数据传递给组件的`handleUpdate`方法组件会更新`childData`的值,并将其显示在页面上。 这样,通过自定义事件和监听,就可以实现组件组件传递数据。请注意,这只是一种实现方式,根据具体的需求和场景,可能会有其他的方法来解决的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值