无法访问父组件 React 打字稿中的转发 Ref 值
Can't access forwareded Ref value in parent component React typescript
我有一种情况,我创建了一个输入组件。这是一个自定义组件,我想在父组件(我正在使用它的地方)中访问用户在此输入中输入的值。
我正在转发来自该输入组件的 ref,但父组件正在接收完整的输入而不是值。我如何使用该值。
下面是我的代码。
Input.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;
不确定如何使用此参考值。
你很接近。
让我们来看看 useRef
return 类型:
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>
作为点击处理程序。看我的例子
我有一种情况,我创建了一个输入组件。这是一个自定义组件,我想在父组件(我正在使用它的地方)中访问用户在此输入中输入的值。
我正在转发来自该输入组件的 ref,但父组件正在接收完整的输入而不是值。我如何使用该值。 下面是我的代码。
Input.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;
不确定如何使用此参考值。
你很接近。
让我们来看看 useRef
return 类型:
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>
作为点击处理程序。看我的例子