DraggableFlatList onRef 使用 Typescript 获取错误类型

Posted

技术标签:

【中文标题】DraggableFlatList onRef 使用 Typescript 获取错误类型【英文标题】:DraggableFlatList onRef getting a wrong type with Typescript 【发布时间】:2021-08-30 01:18:00 【问题描述】:

我在 ReactNative 中使用 react-native-draggable-flatlist。我对 FlatList 的引用感兴趣,以便可以对其执行 scrollToIndex 。使用以下代码:

import React, 
    useEffect, createRef, useRef,
 from 'react'
import  ScrollView, FlatList  from 'react-native-gesture-handler'
import DraggableFlatList, 
    RenderItemParams, DragEndParams,
 from "react-native-draggable-flatlist"

export default function TasksList(props: Props) 

    const ref = createRef<DraggableFlatList<ITask>>()
    const flatListRef = useRef<FlatList<ITask> | null>(null)

    return (
        <DraggableFlatList
            ref=ref
            onRef=flatListRef
...
    )

我收到以下 Typescript 错误:

类型 'MutableRefObject & ...; ) | (函数组件<...> & ...; ) | null>' 不可分配给类型 '(ref: RefObject) => void'。类型 'MutableRefObject & ...; ) | (函数组件<...> & ...; ) | null>' 不提供匹配的 签名 '(ref: RefObject): void'。 预期类型来自此处声明的属性“onRef” 在类型'IntrinsicAttributes & IntrinsicClassAttributes & Pick>> & 只读<...>, "ItemSeparatorComponent" | ... 150 更多 ... | "孩子"> & 部分<...> & 部分<...>'

如何修复错误以便我可以使用 ref/onRef?

【问题讨论】:

【参考方案1】:

我相信你没有得到 onRef prop 所期望的。如果您仔细查看错误,它会说类似这样的内容:

'MutableRefObject<FlatList<ITask> | null>' is not 
    assignable to type '(ref: RefObject<FlatList<ITask>>) => void'.

因此,它显然需要一个函数而不是 RefObject。您也可以参考source code 来验证:

    ...
    onRef?: (ref: React.RefObject<FlatList<T>>) => void;
    ...

它期望一个函数将被赋予RefObject&lt;FlatList&lt;T&gt;&gt; 类型的引用。

您可以将代码改写为:

    ....
    const ref = createRef<DraggableFlatList<ITask>>()
    const flatListRef = useRef<React.RefObject<FlatList<ITask>> | null>(null)

    return (
        <DraggableFlatList
            ref=ref
            onRef=(ref) =>  flatListRef.current = ref 

所以在flatListRef ref 中,通过它的current 属性,您将可以访问底层的FlatList ref

【讨论】:

谢谢阿列克斯!毫无疑问,我不知道自己在做什么 ;-) 在你的帮助下,我现在知道了。

以上是关于DraggableFlatList onRef 使用 Typescript 获取错误类型的主要内容,如果未能解决你的问题,请参考以下文章

React开发(139):react中onref

React开发(161):onref绑定

React开发(160):onref使用

react学习(32)----onref

react中父组件调用子组件方法(onRef)

React—Modal 的确认按钮在 Form 之外,且用到onRef父调子