我正在尝试导出反应,但遇到无法解决的TS错误。
以下是组件:
import React, {
useEffect,
MutableRefObject,
forwardRef,
RefObject
} from 'react';
import styled from 'styled-components';
export interface TextareaInputProps
extends React.HTMLAttributes<HTMLTextAreaElement> {
text?: string;
onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;
onApprove?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;
}
export interface StyledTextareaInputProps {
ref: MutableRefObject<HTMLTextAreaElement | null>;
}
const StyledTextArea = styled.textarea<StyledTextareaInputProps>`
display: flex;
align-items: stretch;
resize: none;
flex: 1;
padding: ${({ theme }) => theme.padding.md}px;
color: ${({ theme }) => theme.colors.grey700};
line-height: ${({ theme }) => theme.lineHeights.nm};
font-family: ${({ theme }) => theme.fontFamilies.regular};
font-size: ${({ theme }) => theme.fontSizes.nm}px;
font-weight: ${({ theme }) => theme.fontWeights.regular};
text-overflow: ellipsis;
border-style: none;
border-color: transparent;
overflow: auto;
`;
const TextareaInput = (
{ text, onChange, onBlur, onKeyDown, ...otherProps }: TextareaInputProps,
ref: RefObject<HTMLTextAreaElement>
) => {
useEffect(() => {
if (ref && ref.current) {
ref.current.focus();
}
}, [ref]);
return (
<StyledTextArea
ref={ref}
{...otherProps}
onChange={onChange}
value={text}
onBlur={onBlur}
onKeyDown={onKeyDown}
/>
);
};
export default forwardRef(TextareaInput);
这是我得到的错误:
类型'({text,onChange,onBlur,onKeyDown,... otherProps}:TextareaInputProps,ref:React.RefObject)=> JSX.Element'不能分配给'ForwardRefRenderFunction
我还有其他具有相似模式的组件都可以工作。
答案 0 :(得分:0)
如果您阅读有关forwardRef
的React文档:
仅当您使用React.forwardRef调用定义组件时,第二个ref参数才存在。 常规函数或类组件不接收ref参数,并且ref在props中也不可用。
您需要执行以下操作:
const TextareaInput = (
{ text, onChange, onBlur, onKeyDown, ...otherProps }: TextareaInputProps,
ref: RefObject<HTMLTextAreaElement>
) => {
useEffect(() => {
if (ref && ref.current) {
ref.current.focus();
}
}, [ref]);
return (
<StyledTextArea
ref={ref}
{...otherProps}
onChange={onChange}
value={text}
onBlur={onBlur}
onKeyDown={onKeyDown}
/>
);
};
首先创建参考:
const ref = React.createRef();
使用forwardRef
的第二遍裁判:
const ModifiedTextareaInput = React.forwardRef((props, ref) => <TextareaInput {...props} ref={ref}/>);
export default ModifiedTextareaInput;
注意:我还没有为它们添加类型定义。假设您可以添加这些