为啥从其他文件导入组件会导致“Invariant Violation: Element type is invalid”错误?

Posted

技术标签:

【中文标题】为啥从其他文件导入组件会导致“Invariant Violation: Element type is invalid”错误?【英文标题】:Why importing components from other files caused "Invariant Violation: Element type is invalid" error?为什么从其他文件导入组件会导致“Invariant Violation: Element type is invalid”错误? 【发布时间】:2018-10-25 01:57:55 【问题描述】:

我在 ios Swift 语言方面相当先进,但在 react 原生框架或 javascript 语言方面非常新。我也试图为堆栈导航器找到正确的教程几个小时,但我找不到它。我目前正在使用this tutorial 来学习 React Native 堆栈导航的基础知识,并希望将两个屏幕拆分为各自的文件。基本上,我想用它的AppDelegate.swift 和 View Controller 的文件来模仿 Swift。但它会产生这样的错误:

Invariant Violation:元素类型无效:应为字符串(对于 内置组件)或类/函数(用于复合组件) 但得到:对象。您可能忘记从 它在其中定义的文件,或者您可能混淆了默认值和命名 进口。

这是老错误。现在的新错误:

TypeError: undefined is not an object (evalating 'this.props.navigation.navigate')

此错误位于:

在主屏幕中(在 renderApplication.js:33)

...

这是我当前的代码。已根据解决方案进行了编辑。

App.js:

import React from 'react';
import  Button, AppRegistry  from 'react-native';
import  StackNavigator  from 'react-navigation';
import HomeScreen from './HomeScreen';
import ProfileScreen from './ProfileScreen';

export default HomeScreen;

const App = StackNavigator(
  Home:  screen: HomeScreen ,
  Profile:  screen: ProfileScreen ,
);

AppRegistry.registerComponent("TestProject", () => App);

HomeScreen.js:

import React from 'react';
import  Button  from 'react-native';
import  StackNavigator  from 'react-navigation';

export default class HomeScreen extends React.Component 
  static navigationOptions = 
    title: 'Welcome',
  ;
  render() 
    const  navigate  = this.props.navigation;
    return (
      <Button
        title="Go to Jane's profile"
        onPress=() =>
          navigate('Profile',  name: 'Jane' )
        
      />
    );
  

ProfileScreen.js:

import React from 'react';
import  Text  from 'react-native';
import  StackNavigator  from 'react-navigation';

export default class ProfileScreen extends React.Component 
  static navigationOptions = 
    title: 'Jane Profile',
  ;
  render() 
    const  navigate  = this.props.navigation;
    return (
      <Text>Welcome to Jane profile!</Text>
    );
  

如果我能指出我的代码中的任何错误和错误,我将不胜感激,因为现在我完全没有注意到我的代码中的任何问题,因为我自己正在学习这一点。请帮忙。每次学习新语言时,第一步总是最难的部分。

在这种情况下,我正在尝试创建一个带有按钮的主屏幕,该按钮通向带有文本的第二个屏幕(配置文件)。我也知道我应该能够在HomeScreen 发送的ProfileScreen 中提取配置文件的名称,但我现在对其进行了硬编码,以便让我更容易理解解决方案。

【问题讨论】:

您的每个组件中都不需要AppRegistry.registerComponent ("TestProject", () =&gt; Screen);。您需要注册您的***组件。此外,括号和registerComponent 之间有一个空格,应该删除。尝试从屏幕文件中删除它并将其添加到 App - AppRegistry.registerComponent("TestProject", () =&gt; App); @Dan "You need to register your top level component" --> 这种情况下,你的意思是我需要在App.js中添加export default HomeScreen;吗? 抱歉刚刚更新,删除您的AppRegistry 语句并将其放入App 组件文件中。你的出口在我看来很好。 您的导航脚本错误! 您可能还需要使用createStackNavigator - reactnavigation.org/docs/en/stack-navigator.html 【参考方案1】:

试试这个

import React from 'react';
import  StackNavigator  from 'react-navigation';
import HomeScreen from './HomeScreen';
import ProfileScreen from './ProfileScreen';

const App = StackNavigator(
  HomeScreen:  screen: HomeScreen ,
  ProfileScreen:  screen: ProfileScreen ,
, 
  initialRouteName: 'HomeScreen',
  headerMode: 'none'
);

export default () => <App />;
    路由名称应该相同,但不是强制性的 推荐。 导出导航元素。 我的项目中什至没有 AppRegistry 脚本,但它仍在工作。

如果有任何问题请在下方评论!希望这能解决问题

注意:这将适用于 react-navigation 版本 1.5.11

对于 react-navigation v2 试试这个代码

import React from 'react';
import  createStackNavigator  from 'react-navigation';
import HomeScreen from './HomeScreen';
import ProfileScreen from './ProfileScreen';

const App = createStackNavigator(
   HomeScreen:  screen: HomeScreen ,
   ProfileScreen:  screen: ProfileScreen ,
, 
   initialRouteName: 'HomeScreen',
   headerMode: 'none'
);

export default () => <App />;

将导航脚本文件设为全局以访问其道具!

【讨论】:

是的,我认为这有助于我更多地了解 AppRegistry 有时可以省略,尽管我现在不明白 AppRegistry 的意义是什么。目前,该错误现在变为更直接的 StackNavigator 错误。就像系统在HomeScreen中找不到this.props.navigation.navigate函数一样。 我的 react-navigation 版本是 2.0.1。 StackNavigator 应该可以通过所有路径访问!不要在每个页面中都导入它! 问题出在版本上!始终检查文档和 package.json 文件中的版本!很高兴它起作用了 在做了一个小研究后,我发现This API only works in projects made with react-native init or in those made with Create React Native App which have since ejected. 我使用 create-react-native-app cli 并且我从未弹出,所以 AppRegistery API 对我没有用【参考方案2】:

在 react-native 中我们不会使用AppRegistry.registerComponent 注册每个组件,而是注册父组件和父组件渲染子组件。您需要的更改是注册App 组件并导出HomeScreenProfileScreen

示例

App.js

...
const App = StackNavigator(
  Home:  screen: HomeScreen ,
  Profile:  screen: ProfileScreen ,
);
AppRegistry.registerComponent('projectName', () => App)

HomeScreen.js

...
class HomeScreen extends React.Component 
  ...

export default HomeScreen;

ProfileScreen.js

...
class ProfileScreen extends React.Component 
  ...

export default ProfileScreen;

希望这会有所帮助!

【讨论】:

哦,我明白了。我认为 AppRegistry 是使该类广为人知的方式,并且可以在整个项目中使用。现在我已经更新了文件,关于导入导出文件的问题消失了,我又得到了一个错误。我认为现在它直接与堆栈导航器相关。 很高兴知道您的import 问题已解决:)。

以上是关于为啥从其他文件导入组件会导致“Invariant Violation: Element type is invalid”错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 parmap 上使用 pyinstaller 会导致 tkinter matplotlib 导入错误。为啥?

在使用 WebWorker 时,从导入其他类的文件中导入类会导致 Angular 8 编译失败

为啥从内部组件中更改 @Input 变量会导致它无法检测到来自外部组件的新更改?

如何修复 Invariant Violation:元素类型无效:预期为字符串(对于内置组件)

缩小反应错误 #321;访问 https://reactjs.org/docs/error-decoder.html?invariant=321

为啥导入 ViewController 会导致 Xcode 无法找到另一个 ViewController?