无法访问父组件 React 打字稿中的转发 Ref 值
Posted
技术标签:
【中文标题】无法访问父组件 React 打字稿中的转发 Ref 值【英文标题】:Can't access forwareded Ref value in parent component React typescript 【发布时间】:2021-09-22 17:56:50 【问题描述】:我有一种情况,我创建了一个输入组件。这是一个自定义组件,我想访问用户在父组件(我正在使用它的地方)的此输入中输入的值。
我正在从这个输入组件转发 ref,但父组件接收的是完整的输入而不是值。我如何使用该值。 下面是我的代码。
输入.tsx
interface AuxProps
id :''
const Input = React.forwardRef<htmlInputElement,AuxProps>((props, ref) =>
return (
<input
id=props.id
ref = ref
defaultValue = '1'
type='number'
></input>
);
);
export default Input;
HeaderComponent.tsx
const HeaderComponent= () =>
const inputAmount = useRef<HTMLInputElement>(null);
const addProductHandle = (event: any) =>
event.preventDefault();
console.log(inputAmount.current.value); //<----Error:- object is possibly null
;
return (
<form className=classes["form"]>
<Input id="1s" ref=inputAmount></Input>
<button onClick=addProductHandle> + ADD </button>
</form>
);
;
export default HeaderComponent;
不知道如何使用这个 ref 值。
【问题讨论】:
【参考方案1】:你很亲密。
我们来看看useRef
返回类型:
interface RefObject<T>
readonly current: T | null;
根据这种类型签名,current
属性可能是T
(在我们的例子中是HTMLInputElement
)或null
。
这就是您使用 typescript
的原因 - 以避免在 PROD 上出现错误。
由于current
可能是null
,TS 要求您仔细检查current
是否存在。
您可以添加?
或if condition
:
import React, useRef, MouseEventHandler from 'react'
interface AuxProps
id: string
const Input = React.forwardRef<HTMLInputElement, AuxProps>((props, ref) =>
return (
<input
id=props.id
ref=ref
defaultValue='1'
type='number'
></input>
);
);
const HeaderComponent = () =>
const inputAmount = useRef<HTMLInputElement>(null);
const addProductHandle: MouseEventHandler<HTMLButtonElement> = (event) =>
event.preventDefault();
console.log(inputAmount.current?.value); // ok
if (inputAmount.current)
console.log(inputAmount.current.value); //ok
;
return (
<form >
<Input id="1s" ref=inputAmount></Input>
<button onClick=addProductHandle> + ADD </button>
</form>
);
;
export default HeaderComponent;
顺便说一句,您可以将MouseEventHandler<HTMLButtonElement>
用于点击处理程序。看我的例子
【讨论】:
行得通!感谢您的详细解释。以上是关于无法访问父组件 React 打字稿中的转发 Ref 值的主要内容,如果未能解决你的问题,请参考以下文章
打字稿中的错误:“AngularFireStorageModule”类型上不存在属性 .ref
当扩展与打字稿中的react-final-form FieldRenderProps接口时发生冲突
通用无状态组件 React 的类型?或在打字稿中扩展通用函数接口以具有进一步的通用性?