首页 > 其他分享 >React.FC中父组件调用子组件方法

React.FC中父组件调用子组件方法

时间:2023-05-17 17:23:58浏览次数:48  
标签:const useImperativeHandle Child React 中父 import 组件 return

https://blog.csdn.net/qq_36990322/article/details/109858890

1. 函数式和hooks写法

其实下面的缺点基本不算缺点了,因为函数式写法,下面算是简单的了。使用forwardRef只会让你的组件定义的更复杂

优点:
1、写法简单易懂
2、假如子组件嵌套了HOC,也可以指向真实子组件
缺点:
1、需要自定义props属性
2、需要自定义暴露的方法

父组件

 1 import React from 'react';
 2 import Child from './Child';
 3 
 4 const Parent = () => {
 5   let ChildRef = React.createRef();
 6 
 7   function handleOnClick() {
 8     ChildRef.current.func();
 9   }
10 
11   return (
12     <div>
13       <button onClick={handleOnClick}>click</button>
14       <Child onRef={ChildRef} />
15     </div>
16   );
17 };
18 
19 export default Parent;

子组件

 1 import React, { useImperativeHandle } from 'react';
 2 import { withRouter } from 'react-router-dom';
 3 
 4 const Child = props => {
 5   //用useImperativeHandle暴露一些外部ref能访问的属性
 6   useImperativeHandle(props.onRef, () => {
 7     return {
 8       func: func,
 9     };
10   });
11   function func() {
12     console.log('执行我');
13   }
14   return <div>子组件</div>;
15 };
16 
17 export default withRouter(Child);

2、函数式编程使用forwardRef抛出子组件的ref

 1 import {
 2   forwardRef,
 3   useState,
 4   useCallback,
 5   useImperativeHandle,
 6   createRef
 7 } from "react";
 8 
 9 export default function App() {
10   let c = createRef(null);
11   const handleChick = useCallback(() => {
12     console.log("父组件点击了");
13     c.current.add();
14   }, [c]);
15   return (
16     <div className="App">
17       <button onClick={handleChick}>点我运行子组件方法</button>
18       <Child ref={c} />
19     </div>
20   );
21 }
22 
23 const Child =  forwardRef((props, ref)=> {
24   const [num, setNum] = useState(0);
25   useImperativeHandle(
26     ref,
27     () => ({ add })
28   );
29   const add = () => {
30     setNum((num) => ++num);
31   };
32   return (
33     <div>
34       <button onClick={add}>这是子组件自己调用</button>
35       子组件的值:{num}
36     </div>
37   );
38 });

 

标签:const,useImperativeHandle,Child,React,中父,import,组件,return
From: https://www.cnblogs.com/shun1015/p/17409405.html

相关文章

  • nvidia显卡驱动和nvidia-cuda-toolkit组件的区别
    nvidia-cuda-toolkit和NVIDIA显卡驱动是两个不同的组件,它们在使用NVIDIAGPU进行计算和图形处理时发挥不同的作用。NVIDIA显卡驱动:NVIDIA显卡驱动是安装在计算机上的软件,它与NVIDIA的图形处理器(GPU)通信,控制GPU的功能和性能,并将计算机的图形输出显示在显示器上。驱动程序允许操......
  • 部署带路由的React SPA 项目
    使用Nginx将/phone/*请求反向代理为/*启动项目serve-s./build-l3000项目内路由仍然是/phone/xxx不用改动,但需要在package.json中,指定静态资源根目录{..."homepage":"/phone/",...}......
  • 【React+Antd】 多选下拉框禁止输入
    <Selectoptions={}onChange={provinceChange}allowClearmode="multiple"//showSearch={false}maxTagTextLength={4}/>mode设置为多选,multiple配合showSearch可以实现禁止选择,mode设置为tags配合showSerach不能实现禁止输入......
  • 【React】react-json-view用法
    react-json-view:前端json可视化插件安装:npminstall--savereact-json-view 使用:importReactJsonfrom'react-json-view'<ReactJson/>配置:<ReactJsoncollapsed={false}//是否收起,true为收起indentWidth={10}//缩进iconStyle='cir......
  • 【React】格式化中国标准时间
    //定义格式化函数:handleTime(time,format){if(time==null||time==undefined||time==""){return"";}vart=newDate(time);vartf=function(i){return(i<10?'0':'')......
  • 画原型,你可以使用这些组件库
    原型项目中的组件(亦称元件、控件),是指通过基础图层拼装而成,可供用户进行交互或用于展示复杂内容的元素。而在原型设计工作中,组件的使用是非常重要的部分,其不仅关乎项目内容的呈现,更会影响编辑操作效率。对于一款原型设计工具来说,为用户提供丰富可用的预设组件是最必须的,而摹客RP深知......
  • 【React】视频播放器,ReactPlayer的使用
    importReactfrom'react';importReactPlayerfrom'react-player'//引入constLiveBroadcast=()=>{return<ReactPlayerclassName='react-player'url='....flv'//地址wi......
  • 【React】自定义水印方法
    创建水印方法:constsetWaterwark=({//使用ES6的函数默认值方式设置参数的默认取值container=document.body,width='250px',height='160px',textAlign='left',textBaseline='bottom',font='15pxM......
  • vue自定义组件——search-box
    github地址:https://github.com/lxmghct/my-vue-components组件介绍props:value/v-model:检索框的值,default:''boxStyle:检索框的样式,default:'position:fixed;top:0px;right:100px;'highlightColor:高亮颜色,default:'rgb(246,186,130)'......
  • 【React+Antd】可编辑表格
    importReact,{useContext,useState,useEffect,useRef}from"react";import{Table,Input,Button,Popconfirm,Form}from"antd";constEditableContext=React.createContext(null);constEditableRow=(props)=>{//编辑表格行let[f......