React、Vue3中父组件如何调用子组件内部的方法

news/2024/11/30 7:53:42/

React

当父组件需要调用子组件的方法时,可以通过useImperativeHandle钩子函数实现。以下例子是ts实现方式。

  • 在子组件中使用 useImperativeHandle 钩子,将指定的方法暴露给父组件,以便父组件可以通过子组件的引用来调用该方法。
    在子组件中使用了 useImperativeHandle 钩子将 someMethod 方法暴露给父组件。注意,为了使用 useImperativeHandle,需要将子组件包裹在 forwardRef 函数中,并在参数列表中添加 ref。
// 子组件
import React, { forwardRef, useImperativeHandle, useRef } from 'react';type ChildProps = {// 子组件的其他 props
};type ChildMethods = {// 子组件暴露给父组件的方法someMethod: () => void;
};const ChildComponent: React.ForwardRefRenderFunction<ChildMethods, ChildProps> = ({}, ref) => {// 子组件的其他代码...const someMethod = () => {// 子组件的方法实现console.log('Child method called!');};// 将子组件的方法暴露给父组件useImperativeHandle(ref, () => ({someMethod,}));return <div>Child Component</div>;
};export default forwardRef(ChildComponent);

上述代码中 React.ForwardRefRenderFunction 是 TypeScript 中的一个泛型类型,用于定义 forwardRef 的 render 函数的类型。
在这个类型参数中,ChildMethods 表示子组件暴露给父组件的方法的类型,ChildProps 表示子组件的 props 类型。
({}) 是 render 函数的参数列表,表示子组件接收的 props,此处为空对象,即没有额外的 props。
refforwardRef 传递的 ref 参数,用于获取对子组件实例的引用。
总而言之,React.ForwardRefRenderFunction<ChildMethods, ChildProps> 定义了一个 forwardRef 的 render 函数类型,接收的 props 类型为 ChildProps,暴露给父组件的方法的类型为 ChildMethods,而在具体的函数实现中,参数列表为空对象,并接收 ref 参数用于获取对子组件实例的引用。
这些是常见的父组件调用子组件内部方法的方式。

有了上面的子组件,在父组件中,可以使用 useRef 钩子来创建一个对子组件的引用,并通过引用调用子组件的方法:

// 父组件
import React, { useRef } from 'react';
import ChildComponent, { ChildMethods } from './ChildComponent';const ParentComponent: React.FC = () => {const childRef = useRef<ChildMethods>(null);const handleClick = () => {// 通过子组件的引用调用子组件的方法if (childRef.current) {childRef.current.someMethod();}};return (<div><ChildComponent ref={childRef} /><button onClick={handleClick}>Call Child Method</button></div>);
};export default ParentComponent;

Vue3

在 Vue 3 中,父组件调用子组件内部的方法可以通过下面的方式实现:

使用 $refs 引用子组件:

  • 在父组件中使用 ref 给子组件添加一个引用,并通过该引用调用子组件的方法。
  • 注意:在 Vue 3 中,$refs 不再自动包含子组件实例,而是返回一个组件实例或 DOM 元素的直接引用。
<!-- 子组件 -->
<template><div><button @click="childMethod">Click Me</button></div>
</template><script>
export default {methods: {childMethod() {console.log('Child method called!');}}
};
</script><!-- 父组件 -->
<template><div><ChildComponent ref="childRef" /><button @click="callChildMethod">Call Child Method</button></div>
</template><script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},setup() {const childRef = ref(null);const callChildMethod = () => {childRef.value.childMethod();};return {childRef,callChildMethod};}
};
</script>

http://www.ppmy.cn/news/882750.html

相关文章

开始单反生涯

一直都想学习摄影&#xff0c;今天终于决定入手佳能550D。通过网络搜索&#xff0c;电话了解&#xff0c;最终决定到摄苑网买&#xff0c;毕竟网上购买风险大了点。 由于是新手&#xff0c;决定先买套机&#xff08;IS18-55镜头&#xff09;&#xff0c;整机&#xffe5;5450&a…

相机的 高清到底是一个什么东西

高清到底是一个什么东西&#xff1f;可能很多人还只能依稀的知道1080P什么的。当你在广告中看到数字电视机时&#xff0c;总会说支持1080i/1080P这样标准&#xff0c;先不提现在市面上销售的电视机有几个能达到这样一个要求。我们来看看1080i和1080P都代表着什么意思——1080i和…

京东内部 Spring Boot 全解笔记,精髓!

在使用传统的 Spring 去做 Java EE&#xff08;Java Enterprise Edition&#xff09;开发中&#xff0c;大量的 XML 文件存在于项目之中&#xff0c;导致 JavaEE 项目变得慢慢笨重起来&#xff0c;&#xff0c;繁琐的配置和整合第三方框架的配置&#xff0c;导致了开发和部署效…

在阿里云linux上安装MySql数据库

我们先远程连接服务器 然后输入 sudo yum update重新运行一下 然后 sudo yum install mysql-server安装 mysql 服务 其中有两次 y n 选择 都选y就好了 然后 运行 sudo service mysqld start启动MySql 然后 我们查看一下MySql sudo service mysqld status

windows无盘启动技术开发之不同网卡使用同一个启动镜像的问题

by fanxiushu 2023-07-13 转载或引用请注明原作者。 这是一个非常烦的问题&#xff0c;也不是实现技术有多难&#xff0c;而是繁琐。 这也更进一步制约了无盘启动技术朝广泛以及更通用的方向发展&#xff0c;只能用在特定场所。 我所知道的&#xff0c;目前用得最多的地方就是网…

国防科大计算机学院卢凯,国防科技大学实行本硕、硕博连读机制

本报讯国防科技大学年仅26岁的卢凯日前顺利通过博士学位论文答辩&#xff0c;成为该校第一位毕业的硕博连读生。整个学习过程仅用4年6个月&#xff0c;比正常读完硕士、博士研究生至少提前了一年半。像卢凯这样进入人才培养“快车道”的优秀人才&#xff0c;该校还有180多名。 …

小米路由器,192.168.31.1连接不上去,或者连接超时

使用小米路由器&#xff0c;连接不上192.168.31.1的问题或者连接超时。 解决的方法&#xff1a;必须连接上路由器上的wifi&#xff08;默认的wifi名字是Xiaomi-XXXX&#xff09;&#xff0c;虽然当前wifi不一定能用但是如果不连接是访问不了192.168.31.1的。

Python快速入门-11-数据容器通用操作

python数据容器的通用操作&#xff0c;前面学习了五种数据容器&#xff0c;这时候我们来说一下某些通用的函数&#xff0c;能够对所有的数据容器都生效。 文章目录 一、len函数二、max函数三、min函数 之前我们就经常使用len函数&#xff0c;我们也说过&#xff0c;len函数并不…