react 父子组件通信 子 直接到父, 父 forwardref子

news2025/4/24 6:53:16

React核心概念:单向数据流(Unidirectional Data Flow)

React 中数据的流动像瀑布一样,只能从上层组件(父组件)流向下层组件(子组件)

子组件无法直接反向修改父组件的数据,只能通过父组件传递的回调函数来“通知”父组件修改数据。

(他即使子组件调用了,也只是通知📢没法修改)

【父调子】

useImperativeHandle

这个东西是父组件想要用一下子的,就比较难,因为有门槛不希望你这样做。

分三步:

  1. 子组件用 forwardRef 包裹:允许父组件传递 ref 进来。
  2. 子组件内用 useImperativeHandle:定义要暴露给父组件的内容。
  3. 父组件通过 ref 调用子组件的方法:比如 ref.current.focus()

const ChildInput = forwardRef((props, ref) => {

useImperativeHandle(ref, () => ({
    con: () => {
      console.log('122aaa ');
    },
}

父组件那边 childRef.current

<ChildInput ref={childRef} />

那还有,如果你是用ts,总是报错 ref.current.xxx,那是因为你没有定义好类型。


// 定义子组件暴露给父组件的方法类型
export type ChildInputHandle = {
  focus: () => void;
  clear: () => void;
};

然后也要forwardRef<ChildInputHandle>

父组件里也类型

  const childRef = useRef<ChildInputHandle>(null);

最后if xxx .current再操作

关键点解释:

  1. 为什么用 forwardRef

    React 默认不允许组件直接接收 ref(除非是原生 DOM 元素),所以需要用 forwardRef 包裹子组件,让它能接收父组件传递的 ref

  2. useImperativeHandle 的作用

    它像一个“过滤器”,决定父组件通过 ref 能访问子组件的哪些方法/属性。比如上面的例子中,父组件只能调用 focusclear,而无法直接操作子组件的 DOM(比如改输入框的值)。

  3. 调用时的注意事项

    父组件必须通过 ref.current.方法名() 调用,且要确保子组件已经正确暴露了该方法(否则会报错 xxx is not a function)。

子组件使用父亲的方法

那如果是是子组件去用父组件用的,那么就会简单一点,直接传props就行了

  1. 父组件给子组件一个“对讲机”(回调函数)
  2. 子组件需要传数据时,按对讲机说话(调用回调函数并传数据)
  3. 父组件自动响应:父组件收到数据后,更新自己的状态(比如 setState),触发重新渲染

如果发现父组件频繁调用子组件方法,很可能你的组件结构需要重构(比如状态提升到父组件)useImperativeHandle 应当是最后的选择,而不是首选方案

关键点解释:

  1. 数据流向
    • 父 → 子:父组件通过 props(如 value={count})将数据传递给子组件。
    • 子 → 父:子组件通过调用父组件传递的回调函数(如 onChildClick())触发父组件更新数据。
  2. 为什么说它是单向的?
    • 父组件的数据变化会自动流向子组件(子组件的 value 会更新)。
    • 子组件不能直接修改父组件的 count,只能通过回调函数“请求”父组件自己修改。
  3. “从大到小”的层级
    • 这里的“大”指的是组件层级更高(如父组件),数据从高层级流向低层级(子组件)。

附 父调子的react代码

// 父组件 Parent.tsx
import React, { useRef } from 'react';
import ChildInput, { ChildInputHandle } from './childInput';

export function Parent() {
  // 明确指定 ref 类型为 ChildInputHandle | null
  const childRef = useRef<ChildInputHandle>(null);

  const handleClick = () => {
    if (childRef.current) {
      childRef.current.focus(); // TS 不再报错
    }
  };

  return (
    <div>
      <ChildInput ref={childRef} />
      <button onClick={handleClick}>Focus</button>
    </div>
  );
}
// 子组件 ChildInput.tsx
import React, { forwardRef, useImperativeHandle, useRef } from 'react';

// 定义子组件暴露给父组件的方法类型
export type ChildInputHandle = {
  focus: () => void;
  clear: () => void;
};

const ChildInput = forwardRef<ChildInputHandle>((props, ref) => {
  const inputRef = useRef<HTMLInputElement>(null);

  useImperativeHandle(ref, () => ({
    focus: () => inputRef.current?.focus(),
    clear: () => {
      if (inputRef.current) inputRef.current.value = '';
    },
  }));

  return <input ref={inputRef} />;
});
ChildInput.displayName = 'childInput';
export default ChildInput;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt画一朵花

希望大家的生活都更加美好&#xff0c;画一朵花送给大家 效果图 void FloatingArrowPubshButton::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHints(QPainter::Antialiasing);QPen pen;pen.setColor("green");pen.setWidth(5);QBrush…

服务器上安装maven

1.安装 下载安装包 https://maven.apache.org/download.cgi 解压安装包 cd /opt/software tar -xzvf apache-maven-3.9.9-bin.tar.gz 安装目录(/opt/maven/) mv /opt/software/apache-maven-3.9.9 /opt/ 3.权限设置 把/opt/software/apache-maven-3.9.9 文件夹重命名为ma…

UOS+N 卡 + CUDA 环境下 X86 架构 DeepSeek 基于 vLLM 部署与 Dify 平台搭建指南

一、文档说明 本文档是一份关于 DeepSeek 在X86架构下通vLLM工具部署的操作指南&#xff0c;主要面向需要在UOSN卡CUDA环境中部署DeepSeek的技术人员&#xff0c;旨在指导文档使用者完成从 Python 环境升级、vLLM 库安装、模型部署到 Dify 平台搭建的全流程操作。 二、安装Pyt…

MySQL终章(8)JDBC

目录 1.前言 2.正文 2.1JDBC概念 2.2三种编码方式 2.2.1第一种 2.2.2第二种&#xff08;优化版&#xff09; 2.2.3第三种&#xff08;更优化版&#xff09; 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来给大家带来Java中的JDBC的讲解&#xff0c;之前学习的都是操作…

Python 爬虫如何伪装 Referer?从随机生成到动态匹配

一、Referer 的作用与重要性 Referer 是 HTTP 请求头中的一个字段&#xff0c;用于标识请求的来源页面。它在网站的正常运行中扮演着重要角色&#xff0c;例如用于统计流量来源、防止恶意链接等。然而&#xff0c;对于爬虫来说&#xff0c;Referer 也可能成为被识别为爬虫的关…

【MySQL】表的约束(主键、唯一键、外键等约束类型详解)、表的设计

目录 1.数据库约束 1.1 约束类型 1.2 null约束 — not null 1.3 unique — 唯一约束 1.4 default — 设置默认值 1.5 primary key — 主键约束 自增主键 自增主键的局限性&#xff1a;经典面试问题&#xff08;进阶问题&#xff09; 1.6 foreign key — 外键约束 1.7…

基于STC89C52RC和8X8点阵屏、独立按键的小游戏《打砖块》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板&#xff0c;外设有&#xff1a;8X8LED点阵屏、独立按键。 【单片机】STC89C52RC 【频率】12T11.0592MHz 效…

数字电子技术基础(五十)——硬件描述语言简介

目录 1 硬件描述语言简介 1.1 硬件描述语言简介 1.2 硬件编程语言的发展历史 1.3 两种硬件描述的比较 1.4 硬件描述语言的应用场景 1.5 基本程序结构 1.5.1 基本程序结构 1.5.2 基本语句和描述方法 1.5.3 仿真 1 硬件描述语言简介 1.1 硬件描述语言简介 硬件描述语…

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读前言autopad函数Conv类__init__成员函数forward成员函数forward_fuse成员函数 Bottleneck类__init__成员…

16.Chromium指纹浏览器开发教程之WebGPU指纹定制

WebGPU指纹概述 WebGPU是下一代的Web图形和计算API&#xff0c;旨在提供高性能的图形渲染和计算能力。它是WebGL的后继者&#xff0c;旨在利用现代GPU的强大功能&#xff0c;使得Web应用能够实现接近原生应用的图形和计算性能。而且它是一个低级别的API&#xff0c;可以直接与…

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中&#xff0c;程序本身 未对插入的SQL语句进行过滤&#xff0c;导致SQL语句直接被服务端执行。 拼接的SQL查询例如&#xff0c;通过在id变量后插入or 11这样的条件&#xff0c;来绕过身份验证&#…

运行neo4j.bat console 报错无法识别为脚本,PowerShell 教程:查看语言模式并通过注册表修改受限模式

无法将“D:\neo4j-community-4.4.38-windows\bin\Neo4j-Management\Get-Args.ps1”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 前提配置好环境变量之后依然报上面的错…

【EDA软件】【设计约束和分析操作方法】

1. 设计约束 设计约束主要分为物理约束和时序约束。 物理约束主要包括I/O接口约束&#xff08;如引脚分配、电平标准设定等物理属性的约束&#xff09;、布局约束、布线约束以及配置约束。 时序约束是FPGA内部的各种逻辑或走线的延时&#xff0c;反应系统的频率和速度的约束…

【Lua】Lua 入门知识点总结

Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用&#xff0c;包括全局变量和局部变量的区别&#xff0c;以及nil类型的概念、数值型、字符串和函数的基本操作&#xff0c;包括16进制表示、科学计数法、字符串连接、函数声明…

光谱相机在肤质检测中的应用

光谱相机在肤质检测中具有独特优势&#xff0c;能够通过多波段光谱分析皮肤深层成分及生理状态&#xff0c;实现‌非侵入式、高精度、多维度的皮肤健康评估‌。以下是其核心应用与技术细节&#xff1a; ‌一、工作原理‌ ‌光谱反射与吸收特性‌&#xff1a; ‌血红蛋白‌&a…

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…

CS144 Lab1实战记录:实现TCP重组器

文章目录 1 实验背景与要求1.1 TCP的数据分片与重组问题1.2 实验具体任务 2 重组器的设计架构2.1 整体架构2.2 数据结构设计 3 重组器处理的关键场景分析3.1 按序到达的子串&#xff08;直接写入&#xff09;3.2 乱序到达的子串&#xff08;需要存储&#xff09;3.3 与已处理区…

Linux安装mysql_exporter

mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标&#xff0c;相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…

BeautifulSoup 库的使用——python爬虫

文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找…

HTTP的Header

一、HTTP Header 是什么&#xff1f; HTTP Header 是 HTTP 协议中的头部信息部分&#xff0c;位于请求或响应的起始行之后&#xff0c;用来在客户端&#xff08;浏览器等&#xff09;与服务器之间传递元信息&#xff08;meta-data&#xff09;&#xff08;简单理解为传递信息的…