eact中 在tsx规范中组件使用 React.forwardRef后,在使用组件时获取ref为null。提示 不能将类型“MutableRefObject<Element>”分配给类型“VNodeRef & Ref<Element>”
时间: 2024-02-29 15:53:33 浏览: 143
这个错误通常是由于 `VNodeRef` 和 `Ref<Element>` 之间的类型不匹配造成的。为了解决这个问题,我们可以使用 `React.ForwardedRef` 类型,它是 `React.Ref` 的一个子类,专门用于在 `React.forwardRef` 中使用。
例如,假设我们有一个 `MyComponent` 组件,它使用了 `React.forwardRef`,但在使用组件时,获取的 `ref` 为 `null`,同时出现了上述的类型错误。我们可以这样来解决:
```tsx
import React from 'react';
interface MyComponentProps {
// ...
}
const MyComponent = React.forwardRef<HTMLDivElement, MyComponentProps>((props, ref) => {
return (
<div ref={ref}>
{/* ... */}
</div>
);
});
export default MyComponent;
```
使用 `React.ForwardedRef` 类型,将 `ref` 的类型设置为 `HTMLDivElement`,表示我们期望 `ref` 引用的是 `div` 元素。这样,我们就可以正确地获取 `ref` 了。
在使用组件时,需要使用 `React.createRef` 来创建一个 `ref` 对象,将其传递给 `MyComponent` 组件的 `ref` 属性。这样,`ref` 就可以正确地绑定到 `div` 元素上了。
```tsx
import React from 'react';
import MyComponent from './MyComponent';
function App() {
const myComponentRef = React.createRef<HTMLDivElement>();
function handleClick() {
myComponentRef.current?.focus();
}
return (
<div>
<MyComponent ref={myComponentRef} />
<button onClick={handleClick}>Focus Div</button>
</div>
);
}
export default App;
```
这样就能正确地获取 `ref` 了,同时也不会出现类型错误。
阅读全文