首页 > 其他分享 >react父级组件和子组件方法互相调用

react父级组件和子组件方法互相调用

时间:2024-10-14 11:48:38浏览次数:6  
标签:父级 import react childRef props 组件 ChildComponent ref

1、父组件调用子组件:

(1)方法一:自定义属性+useImpretiveHandle

父组件:

//React是模块引入,useRef和useEffect 是具体引入

import React, { useRef, useEffect } from 'react';

import ChildComponent from './ChildComponent';

function ParentComponent() {

const childRef = useRef(null);

useEffect(() => {

if (childRef.current) {

childRef.current.childMethod();

}

}, []);

return (

//父组件引入子组件,并给子组件添加ref属性childRef,传参使用自定义属性myRef

<ChildComponent myRef={childRef}  refresh={refreshTable}/> 

);

}

子组件:

import {useImperativeHandle} from 'react';

function ChildComponent(props) {

//定义子组件方法

const childMethod = () => {

console.log('Child method called');

};

// 将方法暴露给父组件

useImperativeHandle(props.myRef, () => ({

childMethod

}));

props.refresh

return (

<div>Child Component</div>

);

}

(2)方法二:ref+forwardRef+useImpretiveHandle

父组件:

//React是模块引入,useRef和useEffect 是具体引入

import React, { useRef, useEffect } from 'react';

import ChildComponent from './ChildComponent';

function ParentComponent() {

const childRef = useRef(null);

useEffect(() => {

if (childRef.current) {

childRef.current.childMethod();

}

}, []);

return (

//父组件引入子组件,并给子组件添加ref属性childRef,传参使用ref,而不是自定义属性

<ChildComponent ref={childRef} /> 

);

}

子组件:

import {useImperativeHandle} from 'react';

//定义子组件方法,使用forwardRef进行转发,接收props和ref两个参数

Const ChildComponent =forwardRef((props,ref)=>{

// 将方法暴露给父组件,这里的ref就不再从props中读取,从forwarRef转发拿到

useImperativeHandle(ref, () => ({ 

childMethod

}));

//定义子组件方法

const childMethod = () => {

console.log('Child method called');

};

return (

<div>Child Component</div>

);

})

forwardRef的作用:forwardRef 是 React 提供的一个高阶函数,它可以让你在函数组件中访问子组件的 ref,并把该 ref 传递给子组件,forwardRef的回调函数接收两个参数:props和ref。其中,props是组件的属性对象,ref 是回调函数中定义的 ref 对象。

2、子组件调用父组件:

方法一:使用props

// 父组件
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';

function ParentComponent() {
const [message, setMessage] = useState('');

// 父组件的方法
const parentMethod = () => {
setMessage('父组件的方法被调用了!');
};

return (
<div>
<ChildComponent parentMethod={parentMethod} /> //将父组件的方法传递给子组件
<p>{message}</p>
</div>
);
}

// 子组件
function ChildComponent({ parentMethod }) {   /这里的parentMethod相当于props的解构
return (
<button onClick={parentMethod}>调用父组件的方法</button>
);
}

//或者子组件可以写成:

function ChildComponent(props) {   /这里的parentMethod相当于props的解构
return (
<button onClick={props.parentMethod}>调用父组件的方法</button>
);
}

export default ParentComponent;

标签:父级,import,react,childRef,props,组件,ChildComponent,ref
From: https://www.cnblogs.com/panzai/p/18463717

相关文章

  • 现代化 React UI 库:Material-UI 详解!
    随着React在前端开发中的流行,越来越多的UI框架和库开始涌现,以帮助开发者更高效地构建现代化、响应式的用户界面。其中,Material-UI是基于GoogleMaterialDesign规范设计的一款开源ReactUI库,GithubStar高达94K,凭借其丰富的组件库、灵活的定制化选项以及无缝的开发体验,......
  • MES系统工单管理模块:提升生产效率与质量的关键组件
    MES系统中的工单管理模块是MES系统的关键组成部分,它主要负责生产任务的具体分配、执行情况的监控以及生产流程的优化。以下是对工单管理模块的详细介绍: 一、工单管理的主要功能生产任务分配:工单管理模块根据生产计划,将具体的生产任务分配给特定的工作站或设备。支持任务......
  • Altair组件介绍:PBS Professional
    AltairPBSProfessionalPBS(PortableBatchSystem)Professional是一个分布式工作负载管理系统,用于管理和监控计算工作负载。PBS由守护进程和命令组成,用于管理一台或多台计算机上的作业。您可以使用PBS来完成提交、查询、更改、监控、移动和删除作业等任务。您可以在一个或多......
  • vue3中监视 Reactive对象中的属性
      watch 的第一个参数可以是不同形式的“数据源”:它可以是一个ref(包括计算属性)、一个响应式对象、一个 getter函数、或多个数据源组成的数组一、框架:<template><divclass="divBox"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2>......
  • VUE:子组件的mounted中获取不到props中的值问题
    现象:mounted读取list为空断点放过去,界面却显示数据正常处理:props:{list:{type:Array}},watch:{list:{handler(newVal,oldVal){console.log('initfinish:',newVal)//后续待处理写在这里......
  • Mac下使用VSCode开发react native快捷键与终端命令
    一、快捷键在macOS下使用VSCode开发ReactNative时,掌握常用的快捷键可以提高开发效率。以下是一些常用的VSCode快捷键,特别适用于ReactNative开发:1、基础快捷键打开命令面板:Cmd+Shift+P打开VSCode的所有命令面板,可以快速执行命令。打开终端:Ctrl+~......
  • React之JSX
    JSX并不是标准的JS语法,它是JS的语法扩展,浏览器本身不能识别,需要通过解析工具做解析之后才能在浏览器中使用JSX高频场景-JS表达式在JSX中可以通过大括号语法{}识别JavaScript中的表达式,比如常见的变量、函数调用、方法调用等等使用引号传递字符串使用JS变量函数......
  • 008. vue组件的嵌套
    页面层级#1.main.ts引入App.文件import{createApp}from'vue'import'./style.css'importAppfrom'./简答组件的使用/App.vue'createApp(App).mount('#app')#2.定义Footer.vue<scriptsetuplang="ts"></......
  • 【原创】修复freeepascal自带的tdbf组件使用中文字段时转换为utf8时可能出现文字错的
    修复freeepascal自带的tdbf组件字段名称使用中文时转换为utf8时可能出现文字错:修改方法:打开fpcsrc\packages\fcl-db\src\dbase\dbf_dbffile.pas修改第816/1236/1246/1842/2758行,将AnsiUpperCase改为UpperCase。重新编译fpcsrc源码或将dbase文件夹拷贝到project目录,重新编译proje......
  • 面试官:说下你的vue项目的目录结构,如果是大型项目你该怎么划分结构和划分组件呢?
    一、为什么要划分使用vue构建项目,项目结构清晰会提高开发效率,熟悉项目的各种配置同样会让开发效率更高在划分项目结构的时候,需要遵循一些基本的原则:文件夹和文件夹内部文件的语义一致性单一入口/出口就近原则,紧耦合的文件应该放到一起,且应以相对路径引用公共的文件应该......