开发者问题收集

React Native 功能组件 - 类型无效错误 - 调用视频时需要字符串或类/函数

2022-11-23
127

我之前见过这个问题,但通过 Import / Export 花括号解决它的方法似乎不是根本原因。

我可以尝试将一个功能组件添加到我的页面 React.js 中,该组件将包含从 Expo 导入的视频。它似乎会导致错误,我觉得这与 VideoInstance 中的 Video 类有关,导致错误,但我不确定。

Phase2.js 页面

import React from 'react'
import { View, StyleSheet} from 'react-native'
import { VideoInstance } from '../components/Videos'


export default function Phase2() {
  return (
    <View style={styles.container}>
      <VideoInstance/>
    </View>
  )
}

const styles = StyleSheet.create(
  {
    container: {
      flex:1,
      backgroundColor: 'red',
    }
  }
)

Video.js Functional Comp(我认为错误在于 Video,因为运行时没有它和 Touchable)

import React from 'react'
import { View, Text, StyleSheet, TouchableWithoutFeedback } from 'react-native'
import Video from 'expo-av'

export const VideoInstance = () => {
  const video = React.useRef(null);
  const [status, setStatus] = React.useState({})

  const onPlayPausePress = () => {
    status.isPlaying ? video.current.pauseAsync() : video.current.playAsync()
  }

  return (
    <View>
        <TouchableWithoutFeedback onPress={onPlayPausePress}>
        <Video
          ref={video}
          style={styles.video}
          source={{uri:"https://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4"}}
          resizeMode='contain'
          useNativeControls={false}
          isLooping
          shouldPlay
          onPlaybackStatusUpdate={setStatus}
          />
          </TouchableWithoutFeedback>  
      </View>
  )
}


const styles = StyleSheet.create(
  {
    container: {
      flex:1,
      backgroundColor: 'red',
    },
    video: {
      flex: 1,
      alignSelf: 'stretch'
    }
  }
)

**完整错误消息: **

Warning: React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite 
components) but got: %s.%s%s, undefined,  You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.

Check the render method of `VideoInstance`., 
    in VideoInstance (created by Phase2)

我希望视频在第 2 阶段页面上呈现。但它不会呈现。我尝试将 VideoInstance 的代码直接放入 Phase2 函数中,并且它可以工作,因此问题一定是出在尝试将其放入的地方,只是不确定是什么……

3个回答

您对 Video 组件使用了错误的导入。

您导入的方式如下 import Video from 'expo-av
但实际应该是 import { Video } from 'expo-av'

您导入的方式好像是默认导出,但包“expo-av”可能将其导出为命名导出,因此您应该使用命名导入。

MDN 导入文档
MDN 导出文档

tkuvek
2022-11-24

您应该在导出后写入 默认 并检查它

 export default const VideoInstance = () => {
 // Your code
 }
basan nofal
2022-11-24

您可以在代码中更改导入。

const VideoInstance = () => {
 // Your code
 }
 
 export default VideoInstance;

让我知道它是否有效。谢谢

Stuti Dyer
2022-11-24