返回顶部
首页 > 资讯 > 前端开发 > JavaScript >ReactHook父组件如何获取子组件的数据/函数
  • 481
分享到

ReactHook父组件如何获取子组件的数据/函数

2024-04-02 19:04:59 481人浏览 薄情痞子
摘要

目录React Hook父组件获取子组件数据/函数子组件MyWorldMap父组件MyTripReact Hook父组件提交子组件fORM父组件子组件React Hook父组件获取子

React Hook父组件获取子组件数据/函数

我们知道在react中,常用props实现子组件数据到父组件的传递,但是父组件调用子组件的功能却不常用。

文档上说ref其实不是最佳的选择,但是想着偷懒不学redux,在网上找了很多教程,要不就是hook的讲的太少,要不就是父子组件傻傻分不清,于是只好再啃了一下文档,就学了一下其它hook的api

在这里我们需要用到useImperativeHandle这个api,其函数形式为

useImperativeHandle(ref, createHandle, [deps])

其实这个api也是ref的一种形式,但是相当于做了一定的优化,可以选择让子组件只暴露一定的api给父组件,根据在文档和其他博客上给出的方法

一共有两大步骤:

  • 1.将ref传递到子组件中
  • 2.需要使用forwardRef对子组件进行包装

子组件MyWorldMap

 const mapRef = useRef(null);
    useImperativeHandle(ref, () => {
 
        return {
            //clickSwitch是子组件暴露的函数
            clickSwitch() {
             
                if(type == 1){
                    initChinaMap();
                    setType(2);
                }else{
                    initWordMap();
                    setType(1);
                }
              
            }
        }
    })
 
//你的return内容,注意ref
 
    return(
        <React.Fragment>
 
            <div id={"myWorldMap"} style={{ width: "800px", height: "400px" }}  ref={mapRef}></div>
 
        </React.Fragment>
 
 
    )
}
 
 
//最后要配合forwardRef
MyWorldMap = forwardRef(MyWorldMap);
export default MyWorldMap;

注:ref是子组件声明的时候传进来的,也就是

function MyWorldMap (props,ref){
//..你的代码
}
 
//export...

其实官方文档给出来的例子是:

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

两种方法都是可以的

父组件MyTrip

const myWordMapRef = useRef();
 
return(
  //省略一些代码,注意ref
 <MyWorldMap proData = { myMapData} handleMapClick = {handleMapClick.bind(this)} ref={myWordMapRef}>
 
 </MyWorldMap>
<div className={styles["mapButton-wrap"]}>
       <ButtonGroup>
               <Button onClick={() => myWordMapRef.current.clickSwitch()}>Switch</Button>
               <Button onClick={()=>clickAll() }>All</Button>
        </ButtonGroup>
 </div>
)

现在你就可以在父组件里面通过myWordMapRef.current.clickSwitch()调用函数了

React Hook父组件提交子组件form

父组件

import React, { useState, useEffect, useRef }  from 'react';
import { Button } from 'antd';
import EditClassA from './EditClassA';
export default (): React.Reactnode => {
    const [isEdit,setIsEdit] = useState<boolean>(false);
    const editClassARef = useRef();
    const handleSave = () => {
        // 调用子组件的方法
        editClassARef.current.changeVal();
    }
    return (
        <div>
            {!isEdit?(
                <Button style={{marginRight:20}} onClick={()=>setIsEdit(!isEdit)}>编辑</Button>
            ):(
                <Button style={{marginRight:20}} onClick={handleSave}>保存</Button>
            )}
        </div>
        <EditClassA isEdit={isEdit} setIsEdit={setIsEdit} ref={editClassARef}/>
    )
}

子组件

import React, { useImperativeHandle, forwardRef }  from 'react';
import { Form , Input } from 'antd';
import style from '@/pages/BackEnd/style.less';
const EditClassA = forwardRef((props, ref) => {
    // props 里面有父组件的值和方法
    const [form] = Form.useForm();
    useImperativeHandle(ref, () => ({
        changeVal: () => {
            form
            .validateFields()
            .then( values => {
                // 调用父组件方法,设置父组件的值
                props.setIsEdit(!props.isEdit)
            })
            .catch(errorInfo => {
                return false
            })
        }
    }));
    return (
    <Form form={form} name="basic" colon={false} >
        <Form.Item
            label="总部名称"
            name="name"
            initialValue="总部"
            rules={[{required: true,message: '请输入总部名称',}]}>
            <Input className={props.isEdit?'':style.disabledInput} placeholder="请输入" disabled={!props.isEdit}/>
        </Form.Item>
    </Form>
    );
})
export default EditClassA
.disabledInput[disabled]{
  color: rgba(0, 0, 0, 0.85);
  background-color: transparent;
  cursor: default;
  border: unset;
  border-bottom: 1px solid #333;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

--结束END--

本文标题: ReactHook父组件如何获取子组件的数据/函数

本文链接: https://lsjlt.com/news/167634.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ReactHook父组件如何获取子组件的数据/函数
    目录React Hook父组件获取子组件数据/函数子组件MyWorldMap父组件MyTripReact Hook父组件提交子组件form父组件子组件React Hook父组件获取子...
    99+
    2024-04-02
  • ReactHook父子组件相互调用函数方式
    目录React Hook 父子组件相互调用函数1.子组件调用父组件函数方法2.父组件调用子组件函数方法React Hook 父子组件传值父组件子组件React Hook 父子组件相互...
    99+
    2024-04-02
  • Angular 2父子组件数据传递之@ViewChild获取子组件的示例分析
    这篇文章主要为大家展示了“Angular 2父子组件数据传递之@ViewChild获取子组件的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angula...
    99+
    2024-04-02
  • vue子组件如何获取父组件的内容(props属性)
    目录子组件如何获取父组件的内容props属性vue父→子组件的props传值需求1需求2子组件如何获取父组件的内容 props属性 组件实例的作用域是孤立的。这意味着不能并...
    99+
    2024-04-02
  • vue子组件怎么获取父组件的内容
    本篇内容介绍了“vue子组件怎么获取父组件的内容”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!子组件如何获取父组件的内容props属性组件实...
    99+
    2023-06-30
  • Angular父子组件间如何传数据
    这篇文章主要讲解了“Angular父子组件间如何传数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular父子组件间如何传数据”吧!环境:Angular CLI: ...
    99+
    2023-07-04
  • Vue父组件调用子组件函数实现
    Vue父组件调用子组件的函数 父组件通过事件调用子组件的函数。例如父组件通过 点击事件 让子组件发请求。 文章中的项目已经通过脚手架去创建。 DEMO: Father.js ...
    99+
    2024-04-02
  • vue3子组件如何修改父组件传过来的props数据
    目录前言1. 修改父组件普通数据2. 修改父组件复杂数据(对象)最后前言 最近新项目用vue3搭建的,准备开始使用vue3的语法,从这篇开始记录下vue3遇到的一些问题和一些语法的使...
    99+
    2022-11-13
    vue子组件可以修改父组件传的prop vue父子组件传值propsm vue修改props的值
  • 详解React 父组件和子组件的数据传输
    目录一、父组件向子组件传递数据 1.1、父组件代码1.2、子组件代码二、子组件向父组件传输数据 2.1、父组件代码 2.2、子组件代码 在学习 React 框架组件间数据传输知识点前...
    99+
    2024-04-02
  • vue3.0在子组件中触发的父组件函数方式
    目录方式一子组件父组件方式二子组件父组件 注:本文是基于vue3.0的语法 方式一 在script中引入 defineEmit ,import { defineEmit }...
    99+
    2024-04-02
  • Angular中父子组件间如何传递数据
    这篇文章主要介绍Angular中父子组件间如何传递数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境:Angular CLI: 11.0.6Angular: 11.0.7Node...
    99+
    2024-04-02
  • React父组件如何调用子组件
    本篇内容介绍了“React父组件如何调用子组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!调用方法:1、类组件中的调用可以利用React....
    99+
    2023-07-04
  • Vue中的父子组件通讯以及使用sync同步父子组件数据
    目录前言子组件向父组件中传递数据一. 通过props从父向子组件传递函数,调用函数改变父组件数据二. 通过自定义事件从子组件向父组件中传递数据三. 通过ref属性在父组件中直接取得子...
    99+
    2024-04-02
  • 如何实现angularjs2中父子组件的数据传递
    这篇文章主要介绍如何实现angularjs2中父子组件的数据传递,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!父到子组件之间的数据传递父组件模板中引用子组件 // ...
    99+
    2024-04-02
  • vuejs2.0中怎么通过子组件改变父组件的数据
    这篇文章给大家介绍vuejs2.0中怎么通过子组件改变父组件的数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<!DOCTYPE html> <html&...
    99+
    2024-04-02
  • vue父组件如何向子组件传值
    vue父组件向子组件传值的方法:vue父组件是通过props向子组件传值的,示例如下:父组件调用子组件时,绑定动态属性。<v-header :title='title' :homemsg='...
    99+
    2024-04-02
  • vue父组件监听子组件数据更新方式(hook)
    目录vue父组件监听子组件数据更新this.$on(‘hook : 生命周期钩子’, () => {})@hook:生命周期钩子=“触发的函...
    99+
    2022-11-13
    vue父组件监听子组件 vue数据更新 vue监听子组件
  • Vue中父组件向子组件传递数据的几种方法
    最近在学习vue的源码,总结了几种vue中父子组件传递数据的方法。 1.props & event 父组件向子组件传递props数据,子组件通过触发事件向父组件回传数据,代...
    99+
    2024-04-02
  • Vue中子组件访问父组件数据的方法是什么
    本篇内容主要讲解“Vue中子组件访问父组件数据的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue中子组件访问父组件数据的方法是什么”吧!props官方解释:所有的 prop 都使得...
    99+
    2023-06-27
  • react.js 父子组件数据如何绑定实时通讯
    这篇文章给大家分享的是有关react.js 父子组件数据如何绑定实时通讯的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例:import React,{Componen...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作