当前位置: 首页 > 知识库问答 >
问题:

javascript - 子组件一般不仅仅有1个元素,这里的子组件代码内有多个input元素,是否是在fowardRef传输时候需要传输多个ref进行使用?还是说这里一个ref就足够使用了呢?

田嘉澍
2024-08-07

父组件可以通过子组件的forwardRef,进行控制子组件内的一个元素:如以下代码

import React, { forwardRef, LegacyRef, useRef } from 'react';
import logo from './logo.svg';
import './App.css';

//#region 子组件定义
const ChildComp = forwardRef(( props, ref: LegacyRef<HTMLInputElement> ) => {

  return <>
<input value="我是子组件的input1" ref={ref} />
<input value="我是子组件的input2" />
<input value="我是子组件的input3" />
</>
})
//#endregion

function App() {

  const inpRef = useRef(null)

  const focusFn = () => {
    console.log(inpRef.current)
  }

  return (
    <div className="App">
      <ChildComp ref={inpRef} />

      <button onClick={focusFn}>点击打印当前inpuRef</button>
    </div>
  );
}

export default App;

但是我们知道子组件一般不仅仅有1个元素,这里的代码内有多个input元素,是否是在传输时候需要传输多个ref进行使用?还是说这里一个ref就足够使用了呢?比如要操作input2的value。

共有2个答案

仲涵亮
2024-08-07

先说结论:ref 只需要一个。

开发要遵循迪米特原则,尽量保持功能的高内聚低耦合。

  1. 对于 App 组件来说,ChildComp 对他来说是黑盒的,不应该感知 ChildComp 用没用 input 或者用了几个 input。
  2. 对于 ChildComp 来说,也不希望外部感知到自己内部的实现,应该面向功能对外暴露方法。

ref 就是连接 App 和 ChildComp 的一个通道。

韦高格
2024-08-07

可以将 ref 传递成一个对象

父组件:

const F = () => {
  const oneRef = useRef()
  const twoRef = useRef()
  return <S ref={{ oneRef, twoRef}} />
}

子组件:

const S = forwardRef((props, ref) => {
  return (
<>
    <button ref={ref.oneRef}>submit</button>
    <button ref={ref.twoRef}>submit</button>
</>
)
})

一个ref的话,可以使用 https://zh-hans.react.dev/reference/react/useImperativeHandle

 类似资料:
  • 根据 [执行子 #1] 表达式E1[E2](根据定义)与*((E1)(E2))相同,但对于数组操作数,如果该操作数是左值,则结果是左值;否则结果是xvalue。 其中 由 [expr.add#4.2] 确定 将具有整数类型的表达式 J 添加到指针类型的表达式 P 中或从中减去该表达式 J 时,结果的类型为 P。 […] 否则,如果P指向具有n个元素的数组对象x的数组元素i([dcl.array])

  • 问题内容: 是否可以在CSS中选择多个具有某个特定类,id等父的元素?例如: 如果不是,是否有办法选择该元素的所有子元素? 问题答案: 是否可以在CSS中选择多个具有某个特定类,id等父的元素? 当前,不幸的是,并非没有复制整个父选择器并指定所有后代,而是1: 直到选择器3最终确定后,他们才提出了伪类表示法来进行此操作,直到最近,基本实现才开始出现。 简而言之,现在已成为标准的伪类称为。在遥远的将

  • 问题内容: 我有一些副作用要应用,并且想知道如何组织它们: 一次性使用 或几个useEffects 在性能和体系结构上有什么更好的选择? 问题答案: 您需要遵循的模式取决于您的useCase。 首先 ,您可能遇到以下情况:在初始安装期间需要添加事件侦听器,并在卸载时对其进行清理,而在另一种情况下,则需要清理特定的侦听器并在prop更改时将其重新添加。在这种情况下,使用两个不同的useEffect更

  • 本文向大家介绍写出一个函数,输入是两个数组,输出是将两个数组中所有元素排序以后用一个数组输出。相关面试题,主要包含被问及写出一个函数,输入是两个数组,输出是将两个数组中所有元素排序以后用一个数组输出。时的应答技巧和注意事项,需要的朋友参考一下 参考回答: //快速排序 //两路归并 cerr << "内存分配失败" << endl;  

  • 我是最新的办公室编程人员。我找不到任何描述运行中可能放置多少文本元素的文档。例如,我生成了这个xml,并将其直接放到“document.xml”中: 文档打开时没有错误。但在MS Word中保存文档后,此xml将替换为: 我的问题:用户有没有办法生成几个

  • 问题内容: 我对CSS选择器有疑问。仅当在具有类名的a中时,如何选择具有特定类名的a ?这个CSS类在其他地方使用,我不想在任何地方更改样式。 问题答案: 只需在父元素和后代元素之间使用CSS后代选择器(空格)即可: 在这种情况下,仅适用于Class的规则,前提是其祖先是该Class的规则。相反,您可以使用直接子组合器,但是您必须指定与每个父/祖先的关系,直到需要其类的父子/祖先,这可能很难维护C

  • 我正在学习自己的反应。在我的渲染循环中,我尝试在其中添加元素,以便为每个数据创建超链接。但我有一个问题:反应。儿童仅应接收单个React元素子元素。有人知道为什么会这样吗?这是我的部分代码。希望能让我的问题更容易理解。我跳过了编码的一些部分,因为问题似乎发生在渲染部分。 应用程序。js ### 编码乐趣。js ps:posts是json数据,我没有在这里添加太多数据。 列表age.js } 如果我

  • 问题内容: 我有一个在HashMap上使用的迭代器,并且保存并加载了该迭代器。有没有办法用迭代器在HashMap中获取上一个密钥?(java.util.Iterator) 更新资料 我将其另存为Red5连接中的属性,然后将其重新加载以在我停止的地方继续工作。 另一个更新 我正在遍历HashMap的键集 问题答案: 正如其他人指出的那样,它并不直接,但是例如,如果您需要访问一个先前的元素,则可以轻松