React native ref Property 'ref' 在类型'IntrinsicAttributes & 上不存在

Posted

技术标签:

【中文标题】React native ref Property \'ref\' 在类型\'IntrinsicAttributes & 上不存在【英文标题】:React native ref Property 'ref' does not exist on type 'IntrinsicAttributes &React native ref Property 'ref' 在类型'IntrinsicAttributes & 上不存在 【发布时间】:2021-03-17 12:30:23 【问题描述】:

我收到以下错误,但我无法弄清楚如何解决它,有人可以帮助我。

下面也是expo上的完整代码链接。

零食博览会报告的<AppIntroSlider /> 错误

例子:

输入 ' ref: (ref: any) => any;数据:键:字符串;标题:字符串; 文本:字符串;背景颜色:字符串; [];渲染项目:(项目: 任何)=> 元素; renderPagination: (activeIndex: number) => 元素; scrollX: (scrollXList: any) => any; ' 不可分配给类型 'IntrinsicAttributes & 数据:任何[];渲染项目:(信息: ListRenderItemInfo & 尺寸: 宽度:数字;高度: 数字; ; ) => 反应节点; renderSkipButton?: (() => ReactNode) | 不明确的; ... 19 更多 ...; scrollX?: ((a: any) => void) |不明确的; & FlatListProps<...> & ...; '。属性 'ref' 不存在于 类型'IntrinsicAttributes & 数据:任何[];渲染项目:(信息: ListRenderItemInfo & 尺寸: 宽度:数字;高度: 数字; ; ) => 反应节点; renderSkipButton?: (() => ReactNode) | 不明确的; ... 19 更多 ...; scrollX?: ((a: any) => void) |不明确的; & FlatListProps<...> & ...; '。

链接:expo


  const slider = useRef(null);
  ...
  <AppIntroSlider
      ref=(ref: any) => (slider.current = ref)
      ...

type ItemTProps<ItemT> = 
  data: ItemT[];
  renderItem: (
    info: ListRenderItemInfo<ItemT> & 
      dimensions:  width: number; height: number ;
    
  ) => React.ReactNode;
  renderSkipButton?: () => React.ReactNode;
  renderNextButton?: () => React.ReactNode;
  renderDoneButton?: () => React.ReactNode;
  renderPrevButton?: () => React.ReactNode;
  onSlideChange?: (a: number, b: number) => void;
  onSkip?: () => void;
  onDone?: () => void;
  renderPagination?: (activeIndex: number) => React.ReactNode;
  activeDotStyle: ViewStyle;
  dotStyle: ViewStyle;
  dotClickEnabled: boolean;
  skipLabel: string;
  doneLabel: string;
  nextLabel: string;
  prevLabel: string;
  showDoneButton: boolean;
  showNextButton: boolean;
  showPrevButton: boolean;
  showSkipButton: boolean;
  bottomButton: boolean;
  scrollX?: (a: any) => void;
 & FlatListProps<ItemT>;

const AppIntroSlider: FunctionComponent<ItemTProps<any>> = (
  data,
  renderItem,
  renderSkipButton,
  renderNextButton,
  renderDoneButton,
  renderPrevButton,
  onSlideChange,
  onSkip,
  onDone,
  renderPagination,
  activeDotStyle = 
    backgroundColor: 'rgba(255, 255, 255, .9)',
  ,
  dotStyle = 
    backgroundColor: 'rgba(0, 0, 0, .2)',
  ,
  dotClickEnabled = true,
  skipLabel = 'Skip',
  doneLabel = 'Done',
  nextLabel = 'Next',
  prevLabel = 'Back',
  showDoneButton = true,
  showNextButton = true,
  showPrevButton = false,
  showSkipButton = false,
  bottomButton = false,
  extraData,
  scrollX,
  ...otherProps
: any) => 

【问题讨论】:

你的应用在世博小吃中运行良好! @Aymen:单击时下一个按钮不起作用,问题是我必须使用对模块的引用,我说的是那个问题。不知道我有没有说清楚。 @WaheedAkhtar:请问您能否举个例子?在应用程序内部,我无法访问 goToSlide 方法,我应该通过 ref 访问该方法。 【参考方案1】:

当您登录 slider.current ref 时,它会显示 null,因为您的 AppIntroSlider 组件是功能组件,不支持这种方式。您有两种解决方案,将 AppIntroSlide 更改为类组件,它会正常工作,或者使用 forwardRef

【讨论】:

如果我想使用 forwardRef 应该怎么做? 我应该改变什么? 看这个解释levelup.gitconnected.com/… 如果我没有通过学习你给我的指南成功,我可以问你是否可以帮助我。了解我错在哪里并能够使其发挥作用非常重要。 我收到以下错误:__slider$current.goToSlide is not a function. (In '_slider$current.goToSlide(activeIndex + 1, true)', '_slider$current.goToSlide' is undefined) 但我不明白我做错了什么。链接:snack.expo.io/vsrGzYEPA【参考方案2】:

我查看了您使用useImperativeHandle 发布的示例,并且您基本上是正确的。您的用法与 in my other answer 的用法略有不同,因为您的函数 goToSlide 接受参数。

当您为引用的组件定义interface 时,您需要使用适当的参数类型定义goToSlide 函数。您当前将其定义为不带参数的函数 (goToSlide(): void),这就是为什么您收到错误 "Type '(pageNum: number, triggerOnSlideChange?: boolean | undefined) => void' is not assignable to输入 '() => void'。”useImperativeHandle 对应。

export interface MyRef 
  goToSlide(pageNum: number, triggerOnSlideChange?: boolean): void;

MyCustomComponentProps 上的一堆道具应该被定义为可选的。您已经为它们设置了默认值。

修复这两个问题后,所有错误都会消失,除了由可选链接 ?. 引起的错误。这是一个新功能,我不知道如何让 Expo 理解它。

您在技术上需要sliderRef 之后的?.,因为总是会定义 ref 对象。 current 属性可能是null,因此您确实需要?.current 之后。但是如果红色下划线打扰您,您也可以使用老式的方式检查它:

const prev = (activeIndex: number): void => 
  if ( sliderRef.current ) 
    sliderRef.current.goToSlide(activeIndex - 1, true);
  
;

Updated expo link

【讨论】:

谢谢你,我依靠你的例子来尝试解决问题。我可以问你任何我有的和没能解决的问题吗?

以上是关于React native ref Property 'ref' 在类型'IntrinsicAttributes & 上不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中使用 React.forwardRef()

react native ref 怎么使用

React-native refs 和 Expo Camera

reactnative this.refs 怎么返回值

React Native ref高级用法&&setNativeProps使用

如何在 React Native 中动态创建多个 Refs