Reactプロジェクトで「クラスを関数として呼び出せません」を取得する


130

Reactマップコンポーネントをプロジェクトに追加しようとしていますが、エラーが発生します。Fullstack Reactのブログ投稿を参考にしています。エラーがスローされる場所をgoogle_map.jsの83行目で追跡しました。

function _classCallCheck(instance, Constructor) { 
  if (!(instance instanceof Constructor)) { 
    throw new TypeError("Cannot call a class as a function"); 
    } 
  }

これが私の地図コンポーネントです。最後の3行である58〜60行目をコメントアウトすると、ページは(マップなしで)正常にロードされます。編集:@Dmitriy Nevzorovが提案した変更を加えましたが、それでも同じエラーが発生します。

import React from 'react'
import GoogleApiComponent from 'google-map-react'

export class LocationsContainer extends React.Component {
    constructor() {
        super()
    }
  render() {
    const style = {
        width: '100vw',
        height: '100vh'
    }
    return (
      <div style={style}>
        <Map google={this.props.google} />
      </div>
    )
  }
}

export class Map extends React.Component {
    componentDidUpdate(prevProps, prevState){
        if (prevProps.google !== this.props.google){
            this.loadMap();
        }
    }
    componentDidMount(){
        this.loadMap();
    }
    loadMap(){
        if (this.props && this.props.google){
            const {google} = this.props;
            const maps = google.maps;

            const mapRef = this.refs.map;
            const node = ReactDOM.findDOMNode(mapRef);

            let zoom = 14;
            let lat = 37.774929
            let lng = 122.419416
            const center = new maps.LatLng(lat, lng);
            const mapConfig = Object.assign({}, {
                center: center,
                zoom: zoom
            })
            this.map = new maps.Map(node, mapConfig)
        }
    }
    render() {
        return (
            <div ref='map'>
                Loading map...
            </div>
        )
    }
}

export default GoogleApiComponent({
  apiKey: MY_API_KEY
})(LocationsContainer)

そして、このmapコンポーネントがmain.jsでルーティングされる場所は次のとおりです。

import {render} from 'react-dom';
import React from 'react';
import Artists from './components/Artists'
import { Router, Route, Link, browserHistory } from 'react-router'
import Home from './components/HomePage'
import Gallery from './components/ArtGallery'
import ArtistPage from './components/ArtistPage'
import FavsPage from './components/FavsPage'
import LocationsContainer from './components/Locations'

//Create the route configuration
render((
  <Router history={browserHistory}>
    <Route path="/" component={Home} />
        <Route path="locations" component={LocationsContainer} />
        <Route path="artists" component={Artists} /> 
        <Route path="gallery" component={Gallery} />     
      <Route path="favorites" component={FavsPage} />
      <Route path=":artistName" component={ArtistPage} />
  </Router>
), document.getElementById('app'))

2
は2つありますがexport default、そうではありnew GoogleAPIComponent()ませんGoogleAPIComponent()か?
gcampbell

デフォルトの1つを削除して、提案を試しました。。Locations.js:58キャッチされない例外TypeError:それは実際にGoogleマップに話しているようにそれは良いですが、ページをロードする前に、それは別の不可解なエラーがスローされ、見えます?(中間値)は、「関数ではありません任意のアイデアを
マイクフレミング

1
あなたが削除するとどうなります(LocationContainer)か?
gcampbell

ありがとう、私はそれを得たと思います!奇妙なことに、それが彼らのブログ投稿に書かれているのです。それでもGoogleマップから他のいくつかのエラーが発生するので、ここに表示します。「GoogleMap:apiKeyは非推奨です。代わりにbootstrapURLKeys = {{key:YOUR_API_KEY}}を使用してください。google_map.js:689 GoogleMap:centerまたはdefaultCenterpropertyを定義する必要がありますgoogle_map.js:699 GoogleMap:zoomまたはdefaultZoompropertyを定義する必要がありますgoogle_map.js:704 '
Mike Fleming

1
私は他のエラーについてはよく分からないが、あなたは最初のものを修正するためにこれを試みることができる:export default new GoogleApiComponent({ bootstrapURLKeys: MY_API_KEY })
gcampbell

回答:


207

私にとってextends React.Componentは、最後に書くのを忘れたときに起こりました。それはあなたが持っていたものとは正確には違いますが、この答えを読んでいる他の人がこれから利益を得られることを願っています。


19
これが機能する理由を説明する過剰反応で偉大なポストがありますoverreacted.io/how-does-react-tell-a-class-from-a-functionは
エリックKigathi

1
投稿の要約:ブラウザでクラスと関数を区別することは、実際には完全に簡単なことではありません...「実際の解決策は本当に単純ですが、Reactがこの解決策に至った理由を説明するために、非常に正解です。 .. "blah、blah、blah、...->「React.Componentを拡張しない場合、ReactはプロトタイプでisReactComponentを見つけられず、コンポーネントをクラスとして扱いません。」
spinkus

すごい。私は同様の問題に直面していました&あなたの解決策が問題を修正しました。しかし、私の構文はでしたimport React, { Component } from 'react'; class extends Component。これをに置き換えることComponentで問題を解決する方法を理解できませんでしたReact.Component。インポートは重要ですか?
Arun Ramachandran

70

私にとっては、newアニメーション状態を設定するときにキーワードを使用するのを忘れたためです。

例えば:

fadeAnim: Animated.Value(0),

fadeAnim: new Animated.Value(0),

それを修正します。


1
これで問題が解決しました。アニメーションではない別のユースケースを使用していましたが、新しいキーワードを使用したことで解決しました。ありがとう
Olivier JM

4
発生したことを知るために4時間44分4秒を費やしました。あなたは神です。
Satheeshwaran

うん、それも私だった。ありがとうございました!
James Cushing、

64

tl; dr

React Router v4を使用している場合は、<Route/>コンポーネントをチェックして、本当にcomponentpropを使用してクラスベースのReactコンポーネントを渡してください!

より一般的には、クラスに問題がないと思われる場合は、クラスを呼び出すコードがそれを関数として使用していないかどうかを確認してください。

説明

このエラーが発生したのは、React Router v4を使用してrenderいて、クラスcomponent内の<Route/>コンポーネントを渡すためにコンポーネントのプロップの代わりに誤ってプロップを使用したためです。これは問題でした。なぜなら、Reactコンポーネントでrender機能するものであるのに対して、関数が期待される(呼び出される)ためですcomponent

したがって、このコードでは:

<HashRouter>
    <Switch>
        <Route path="/" render={MyComponent} />
    </Switch>
</HashRouter>

<Route/>コンポーネントを含む行は、次のように記述されているはずです。

<Route path="/" component={MyComponent} />

彼らがそれをチェックせず、そのような使用可能なエラーを与え、間違いを見つけやすいのは残念です。


47

私が使ったので私に起こりました

PropTypes.arrayOf(SomeClass)

の代わりに

PropTypes.arrayOf(PropTypes.instanceOf(SomeClass))


おかげで、私の場合、間違ったPropTypes定義が問題でした。
Vasiliy 2017年

これは私の問題を解決しました!のPropTypes.oneOfType([SomeClass, SomeOtherClass]).isRequired,代わりでした PropTypes.oneOfType([PropTypes.instanceOf(SomeClass), PropTypes.instanceOf(SomeOtherClass)]).isRequired,
Doug

ありがとう、本当に何が悪いのか長い間疑問に思いました!
フィーバーメディア

14

export default宣言が重複しています。最初のものは実際には関数である2番目のものによってオーバーライドされます。


良いキャッチ!GoogleApiComponentの前にデフォルトを残しましたが、それでも同じエラーが発生します。または、すべてのデフォルトを削除すると、GoogleApiComponentのターミナルで「予期しないトークン」エラーが発生します。
マイクフレミング

14

私にとっては、のComponentName.prototype代わりでしたComponentName.propTypesPhpstormIDE によって自動提案されます。それが誰かを助けることを願っています。


14

同じ問題が発生しました。ES6コンポーネントクラスが拡張されていないために発生しましたReact.Component


8

ほとんどの場合、これらの問題は、反応からコンポーネントを拡張できない場合に発生します。

import React, {Component} from 'react'

export default class TimePicker extends Component {
    render() {
        return();     
    }
}

7

私にとっては、propTypesの代わりにプロトタイプを使用したためです

class MyComponent extends Component {

 render() {
    return <div>Test</div>;
  }
}

MyComponent.prototype = {

};

それはあるはずです

MyComponent.propTypes = {

};

まったく同じケース。ありがとうございました!
Tekson

6
Post.proptypes = {

}

Post.propTypes = {

}

そのようなエラーを非常に正確に監視する方法について誰かがコメントする必要があります。


1
いくつかの詳細情報を使用して、ソリューション/回答を説明することをお勧めします。
ダーマン

やった、ブラボー!
Mbanda

3

このエラーが表示されるのは単一のケースではないようです。

ステートフルコンポーネントでコンストラクターを宣言しなかったときに、私に起こりました。

class MyComponent extends Component {

    render() {
        return <div>Test</div>;
    }
}

の代わりに

class MyComponent extends Component {

    constructor(props) {
        super(props);
    }

    render() {
        return <div>Test</div>;
    }
}

3

チェックできる2つのことは、

class Slider extends React.Component {
    // Your React Code
}

Slider.propTypes = {
    // accessibility: PropTypes.bool,
}
  • React.Componentを必ず拡張してください
  • プロトタイプの代わりにpropTypesを使用(IDEインテリセンスによる)

Slider.propTypes:{}である必要があります
David Casanellas

2

これは一般的な問題であり、1つのケースでは発生しません。ただし、すべての場合に共通の問題はimport、特定のコンポーネントを忘れてしまうことです(インストールしたライブラリからのものか、作成したカスタムメイドコンポーネントのどちらかは関係ありません)。

import {SomeClass} from 'some-library'

インポートせずに後で使用する場合、コンパイラーはそれを関数と見なします。したがって、壊れます。これは一般的な例です:

imports

...code...

そして、あなたのコードのどこかに

<Image {..some props} />

コンポーネントをインポートするのを忘れた場合<Image />、コンパイラーは他のインポートの場合のように文句を言うことはありませんが、コードに到達すると壊れます。


1

私にとっては、誤ってrenderメソッドを削除してしまったからです!

componentWillReceiveProps短いrenderメソッドの直前に、不要になったメソッドを含むクラスがありました。私が急いでそれを削除するときに、誤ってrenderメソッド全体も削除してしまいました。

完全に無関係なファイルのコメントを問題の「原因」として指摘するコンソールエラーが発生していたため、これは追跡するのが苦痛でした。



1

そうしたときに私はそれを手に入れました:

function foo() (...) export default foo

正しく:

export default  () =>(...);

または

const foo = ...
export default foo

1

私にとっては、接続機能を適切にラップせず、デフォルトの2つのコンポーネントをエクスポートしようとしたために起こりました


1

反応ネイティブでmobxを使用しているときに間違ったクラスをインポートして間違ったストアを参照すると、このエラーに直面しました。

このスニペットでエラーに直面しました:

import { inject, Observer } from "mobx-react";

@inject ("counter")
@Observer

以下のスニペットのようないくつかの修正の後。このようにして問題を解決しました。

import { inject, observer } from "mobx-react";

@inject("counterStore")
@observer

実際に何が悪かったのか、私が使用したのではなく、observer使用したのObserverではなく、間違ったクラスcounterStoreを使用していましたcounter。私はこのように私の問題を解決しました。


1

ファイルに MyComponent.js

export default class MyComponent extends React.Component {
...
}

そのコンポーネントに関連するいくつかの関数を配置します。

export default class MyComponent extends React.Component {
...
}

export myFunction() {
...
}

次に、その関数をインポートした別のファイルで:

import myFunction from './MyComponent'
...
myFunction() // => bang! "Cannot call a class as a function"
...

問題を見つけられますか?

中括弧を忘れて、MyComponent名前でインポートしましたmyFunction

したがって、修正は次のとおりです。

import {myFunction} from './MyComponent'

1

クラスではなく関数のインポート中にインポート文を間違って作成すると、この問題が発生しました。removeMaterial別のモジュールの関数の場合:

正しい:

import { removeMaterial } from './ClaimForm';

違う:

import removeMaterial from './ClaimForm';

1

私は小さな間違いを犯してこのエラーを受け取りました。私のエラーは、クラスとしてではなく関数としてクラスをエクスポートすることでした。私が持っていたクラスファイルの最後に:

export default InputField();

あるべき時:

export default InputField;

0

私もこれに遭遇しました。reactコンポーネントの内部にJavaScriptエラーがある可能性があります。依存関係を使用している場合はnew、クラスの演算子を使用して新しいインスタンスをインスタンス化していることを確認してください。次の場合にエラーがスローされます

this.classInstance = Class({})

代わりに使用

this.classInstance = new Class({})

ブラウザのエラーチェーンに表示されます

at ReactCompositeComponentWrapper._constructComponentWithoutOwner

それは私が信じているプレゼントです。


0

HMRを停止して、もう一度ヒットnpm startしてプロジェクトを再構築してください。
これにより、エラーが消えました。理由はわかりません。


0

私の場合、間違ってcomment代わりに書いたComponent

私はこれを書いたところです。

import React, { Component } from 'react';

  class Something extends Component{
      render() {
          return();
     }
  }

これの代わりに。

import React, { Component } from 'react';

  class Something extends comment{
      render() {
          return();
     }
  }

それは大したことではありませんが、私のような初心者にとっては本当に混乱しています。これがお役に立てば幸いです。


0

私の場合、JSXを使用して親コンポーネントが「<>」なしで他のコンポーネントを呼び出していました

 <ComponentA someProp={someCheck ? ComponentX : ComponentY} />

直す

<ComponentA someProp={someCheck ? <ComponentX /> : <ComponentY />} />

0

ここで別のレポート:エクスポートしたため、機能しませんでした:

export default compose(
  injectIntl,
  connect(mapStateToProps)(Onboarding)
);

の代わりに

export default compose(
  injectIntl,
  connect(mapStateToProps)
)(Onboarding);

ブラケットの位置に注意してください。どちらも正しいので、リンターやかわいらしいもの、または類似のものに捕まることはありません。追跡するのにしばらくかかった。


0

私の場合、最後にあるはずの関数Homeの最初の引数として、誤ってコンポーネント名()を指定しconnectました。ああ。

これは確かに私にエラーを与えました:

export default connect(Home)(mapStateToProps, mapDispatchToProps)

しかし、これは確かにうまくいきました:

export default connect(mapStateToProps, mapDispatchToProps)(Home)

0

これは、render誤って関数に誤って名前を付けたときに発生しました。

import React from 'react';

export class MyComponent extends React.Component {
  noCalledRender() {
    return (
      <div>
        Hello, world!
      </div>
    );
  }
}

このエラーのインスタンスは、クラスに適切なrenderメソッドがなかったために発生しました。


0

実際には、すべての問題が再接続します。ソリューション:

正解

export default connect(mapStateToProps, mapDispatchToProps)(PageName)

誤りとバグ

export default connect(PageName)(mapStateToProps, mapDispatchToProps)

-1

私にとっては、rootReducer.jsでのレデューサーのインポートが間違っていました。レデューサーファイルの代わりにコンテナーをインポートしました。

import settings from './pages/Settings';

しかし、確かに

import settings from './pages/Settings/reducer';

設定ディレクトリには、actions.js、index.js、reducer.jsというファイルが含まれています。

これを確認するには、redux / es / redux.jsからassertReducerShape()関数のレデューサー引数を記録します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.