【发布时间】:2021-01-22 05:54:45
【问题描述】:
我正在尝试遵循原子设计原则,但我不确定我是否做得正确。 我创建了三个组件:Form、ExpandableInput 和 Input。输入是 HTML 输入包装器,可扩展输入是带下拉列表的输入,而表单只是表单。我想从 Form 组件访问当前输入值,所以我正在通过多个级别进行 ref 转发。在 Form 组件中一切正常,但问题是我必须在 ExpandableInput 组件中使用 ref.current.value,但出现以下错误。
类型“((实例: HTML输入元素 |空)=> 无效)|可变引用对象
'。类型“(实例: HTML输入元素 | null) => 无效'。
我不知道如何告诉 typescript ExpandableInput 中的 ref 变量的类型为 Ref 并且不为空。不知道多级ref转发是不是好习惯,也许有更好的方法来获取输入值。
示例代码: 添加表单
const Form = () => {
// Refs
const caRef = useRef<HTMLInputElement>(null);
return (
<FormTemplate >
<ExpandableInput
option={CompetenceAreaOption}
ref={caRef}
/>
</FormTemplate>
);
}
export default AddForm;
可扩展输入
const ExpandableInput = React.forwardRef<HTMLInputElement, IProps>((
props,
ref
): JSX.Element => {
const pickInputValue = (value: string): void => {
console.log(ref.current) // Error
console.log(ref) // Input reference
}
}
return (
<div>
<div>
<Input
ref={ref}
/>
</div>
</div>
);
})
export default ExpandableInput;
输入
const Input = React.forwardRef<HTMLInputElement, IProps>(({
props,
ref
): JSX.Element => {
return (
<input
ref={ref}
/>
);
})
export default Input;
【问题讨论】:
-
我认为你应该使用上下文而不是使用引用转发
-
"我不知道如何告诉 typescript ExpandableInput 中的 ref 变量的类型为 Ref 并且不为空",所以不要将
null传递给useRef,你也应该这样做一个沙盒你的问题 -
如果你想访问输入值,不要使用 refs,使用状态,使你的输入受控组件
标签: javascript reactjs typescript