আমার প্রতিক্রিয়া প্রকল্পে "একটি ক্লাসটিকে একটি ফাংশন হিসাবে কল করতে পারে না" পাওয়া Get


129

আমি আমার প্রকল্পে একটি প্রতিক্রিয়া মানচিত্র উপাদান যুক্ত করার চেষ্টা করছি তবে একটি ত্রুটি হিসাবে চালাচ্ছি। আমি ফুলস্ট্যাক রিএ্যাক্টের ব্লগ পোস্টটি একটি রেফারেন্স হিসাবে ব্যবহার করছি । আমি ত্রুটিটি যেখানে google_map.js লাইনে 83 নম্বরে ফেলেছি তা ট্র্যাক করেছি:

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

এখানে এখন পর্যন্ত আমার মানচিত্রের উপাদান রয়েছে। আমি শেষ তিনটি লাইন 58-60 লাইনের মন্তব্য দিলে পৃষ্ঠাটি ঠিক জরিমানা (কোনও মানচিত্র ছাড়াই) লোড হয়। সম্পাদনা: @ দিমিত্রি নেভজারভ প্রস্তাবিত পরিবর্তনগুলি করেছি এবং এটি এখনও আমাকে একই ত্রুটি দেয়।

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)

এবং এখানে এই মানচিত্রের উপাদানটি মেইন.জেসগুলিতে রূপান্তরিত হয়:

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
আপনার দুটি আছে export default, এবং এটি new GoogleAPIComponent()না GoogleAPIComponent()?
gcampbell

আমি একটি ডিফল্ট অপসারণ করেছি এবং আপনার পরামর্শটি চেষ্টা করেছি। দেখে মনে হচ্ছে এটি আসলে গুগল ম্যাপের সাথে এখন কথা বলছে, যা ভাল, তবে পৃষ্ঠাটি লোড করার আগে এটি আরও একটি ক্রিপ্টিক ত্রুটি ছুঁড়ে দেয়: লোকেশনস.জেএস: 58 আনকচড টাইপ এরিয়ার: (মধ্যবর্তী মান) কোনও ফাংশন নয় "। কোনও ধারণা?
মাইক ফ্লেমিং

1
আপনি যদি অপসারণ (LocationContainer)?
gcampbell

ধন্যবাদ, আমি মনে করি এটি পেয়েছে! অদ্ভুত, এটি তাদের ব্লগ পোস্টে এটি লেখা আছে। গুগল ম্যাপ থেকে এখনও কিছু অন্যান্য ত্রুটি পেয়েছি, আমি এগুলি এখানে রাখব: 'গুগলম্যাপ: এপিকে কে অবচয় করা হয়েছে, তার পরিবর্তে বুটস্ট্র্যাপ ইউআরএলকিগুলি = {{কী ব্যবহার করুন: YOUR_API_KEY}।। google_map.js: 689 গুগলম্যাপ: সেন্টার বা ডিফল্ট সেন্টারপ্রোপার্টি অবশ্যই google_map.js: 699 গুগলম্যাপ: জুম বা ডিফল্টজুম্পার্টি সংজ্ঞায়িত করতে হবে google_map.js: 704 '
মাইক ফ্লেমিং

1
আমি অন্যান্য ত্রুটি সম্পর্কে নিশ্চিত নই, তবে আপনি প্রথমটি ঠিক করার জন্য এটি চেষ্টা করতে পারেন:export default new GoogleApiComponent({ bootstrapURLKeys: MY_API_KEY })
gcampbell

উত্তর:


206

আমার জন্য এটি যখন আমি লিখতে ভুলে গিয়েছিলাম তখনই ঘটেছিল extends React.Component। আমি জানি আপনার ঠিক কী ছিল তা নয়, তবে অন্যরা এই উত্তরটি পড়ার মাধ্যমে আশা করা যায় this


19
সেখানে মহান পোস্ট এ তীব্র প্রতিক্রিয়া দেখাবে ব্যাখ্যা করেছেন যে কেন এই কাজ করে overreacted.io/how-does-react-tell-a-class-from-a-function
এরিক Kigathi

1
পোস্টের সংক্ষিপ্তসার: একটি শ্রেণি এবং ব্রাউজারে কোনও ফাংশনের মধ্যে পার্থক্য করা আসলে সম্পূর্ণ তুচ্ছ নয় ... "প্রকৃত সমাধানটি আসলেই সহজ, তবে এই সমাধানটির সাথে কেন প্রতিক্রিয়া শেষ হয়েছে তা বোঝানোর জন্য [আমি একটি প্রচেষ্টা চালিয়ে যাচ্ছি] বিশাল স্পর্শকাতর। .. "ব্লা, ব্লা, ব্লা, ... ->" আপনি যদি প্রতিক্রিয়া না বাড়ান omp কম্পোনেন্ট, প্রতিক্রিয়াটি প্রোটোটাইপে আইস্যাক্ট কম্পোনেন্টটি খুঁজে পাবে না এবং উপাদানটিকে শ্রেণ হিসাবে বিবেচনা করবে না ""
স্পিংকাস

70

আমার পক্ষে এটি ছিল কারণ আমি newঅ্যানিমেটেড স্টেট সেট আপ করার সময় কীওয়ার্ডটি ব্যবহার করতে ভুলে গিয়েছিলাম ।

উদাহরণ:

fadeAnim: Animated.Value(0),

প্রতি

fadeAnim: new Animated.Value(0),

এটি ঠিক করতে হবে।


1
এটি আমার সমস্যার সমাধান করেছে, আমি অ্যানিমেটেড নয় বরং নতুন কীওয়ার্ডটি ব্যবহার করার পরে এটির সমাধান করার জন্য একটি ভিন্ন ব্যবহারের কেস ব্যবহার করছি। আপনাকে ধন্যবাদ
অলিভিয়ার জেএম

3
4 ঘন্টা 44 মিনিট 4 সেকেন্ড সময় ব্যয় করে wth কী হয়েছিল তা জানার চেষ্টা করে। তুমি ঈশ্বর.
সত্যেশ্বরন

হ্যাঁ, আমিও ছিলাম। ধন্যবাদ!
জেমস কুশিং

64

TL; ড

আপনি যদি প্রতিক্রিয়া রাউটার ভি 4 <Route/>ব্যবহার করেন তবে আপনি যদি প্রকৃতপক্ষে এটি ব্যবহার করেন তবে আপনার উপাদানটি পরীক্ষা করুনcomponent আপনার শ্রেণিভিত্তিক প্রতিক্রিয়া উপাদানটি পাস করার প্রস্তাবটি !

আরও সাধারণভাবে: আপনার শ্রেণিটি যদি ঠিক মনে হয়, যা কোডটি এটি কল করে এটি কোনও ফাংশন হিসাবে ব্যবহার করার চেষ্টা করে না কিনা তা পরীক্ষা করে দেখুন।

ব্যাখ্যা

আমি এই ত্রুটিটি পেয়েছি কারণ আমি প্রতিক্রিয়া রাউটার ভি 4 ব্যবহার করছিলাম এবং আমি দুর্ঘটনাক্রমে আমার উপাদানটি একটি শ্রেণীর পাস করার জন্য উপাদানটির renderপরিবর্তে প্রপটি ব্যবহার করেছি। এটি একটি সমস্যা ছিল, কারণ একটি ফাংশন প্রত্যাশা করে (কল করে), যখন এমনটি যা প্রতিক্রিয়া উপাদানগুলিতে কাজ করবে।component<Route/>rendercomponent

সুতরাং এই কোডে:

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

উপাদানযুক্ত লাইনটি এইভাবে <Route/>লেখা উচিত ছিল:

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

এটি লজ্জাজনক, তারা এটিকে পরীক্ষা করে না এবং এ জাতীয় এবং সহজে ভুল ধরা সহজ ব্যবহারের জন্য ত্রুটি দেয়।


47

আমার ব্যবহার হয়েছে কারণ আমি ব্যবহার করেছি

PropTypes.arrayOf(SomeClass)

পরিবর্তে

PropTypes.arrayOf(PropTypes.instanceOf(SomeClass))


ধন্যবাদ, ভুল প্রোপটাইপস সংজ্ঞাটি আমার ক্ষেত্রে সমস্যা ছিল।
ভাসিলি

এই আমার সমস্যা সমাধান! ছিল PropTypes.oneOfType([SomeClass, SomeOtherClass]).isRequired,পরিবর্তে PropTypes.oneOfType([PropTypes.instanceOf(SomeClass), PropTypes.instanceOf(SomeOtherClass)]).isRequired,
ডগ

ধন্যবাদ, সত্যিই দীর্ঘদিন ধরে ভাবছিলাম যে সেখানে কী ভুল হচ্ছে!
জ্বর মিডিয়া

14

আপনি সদৃশ export defaultঘোষণা প্রথমটি দ্বিতীয় দ্বারা ওভাররাইড হয়ে যায় যা আসলে একটি ফাংশন।


ভালো বল ধরা! আমি ডিগ্রিটি গুগলএপিপি কম্পোনেন্টের সামনে রেখে দিয়েছি এবং এখনও আমি একই ত্রুটি পেয়েছি। বিকল্পভাবে, সমস্ত ডিফল্ট মুছে ফেলা আমাকে GoogleApiComp घटकে আমার টার্মিনালে একটি "অপ্রত্যাশিত টোকেন" ত্রুটি দেয়।
মাইক ফ্লেমিং

14

আমার জন্য, এটি ComponentName.prototypeপরিবর্তে ছিল ComponentName.propTypesPhpstormআইডিই দ্বারা প্রস্তাবিত অটো । আশা করি এটি কারও সাহায্য করবে।


14

আমি একই সমস্যাটি অনুভব করেছি, এটি ঘটেছে কারণ আমার ES6উপাদান শ্রেণিটি প্রসারিত হয়নি React.Component


8

প্রায় এই বিষয়গুলো ঘটে যখন তুমি ব্যাপ্ত মিস কম্পোনেন্ট প্রতিক্রিয়া থেকে:

import React, {Component} from 'react'

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

7

আমার পক্ষে এটি ছিল কারণ আমি প্রোপটাইপের পরিবর্তে প্রোটোটাইপ ব্যবহার করেছি

class MyComponent extends Component {

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

MyComponent.prototype = {

};

এটা হওয়া উচিত

MyComponent.propTypes = {

};

আমার জন্য একই ঘটনা। ধন্যবাদ!
টেকসন

6
Post.proptypes = {

}

প্রতি

Post.propTypes = {

}

এই ধরণের ত্রুটি নিখুঁতভাবে কীভাবে পর্যবেক্ষণ করা যায় সে সম্পর্কে কারও মন্তব্য করা উচিত।


1
কিছু বিস্তারিত তথ্য দিয়ে আপনার সমাধান / উত্তরটি ব্যাখ্যা করা ভাল।
ধর্মং

ইয়াৰ এটা হয়, ব্রাভো!
এমবান্ডা

3

দেখে মনে হচ্ছে এই ত্রুটিটি উপস্থিত হওয়ার পরে কোনও মামলা নেই।

আমার সাথে ঘটেছিল যখন আমি স্টেটফুল কম্পোনেন্টে কনস্ট্রাক্টর ঘোষণা করি না।

class MyComponent extends Component {

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

পরিবর্তে

class MyComponent extends Component {

    constructor(props) {
        super(props);
    }

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

3

দুটি জিনিস যা আপনি চেক করতে পারেন তা হ'ল,

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

Slider.propTypes = {
    // accessibility: PropTypes.bool,
}
  • নিশ্চিত করুন যে আপনি প্রতিক্রিয়া.কম্পোনেন্টটি প্রসারিত করেছেন
  • প্রোটোটাইপের পরিবর্তে প্রোপটাইপগুলি ব্যবহার করুন (আইডিই ইন্টেলিজেন্স অনুসারে)

স্লাইডার.প্রপ টাইপগুলি হওয়া উচিত: {}
ডেভিড ক্যাসানেলাস

2

এটি একটি সাধারণ সমস্যা, এবং একক ক্ষেত্রে হাজির হয় না। তবে, সমস্ত ক্ষেত্রে সাধারণ সমস্যাটি হ'ল আপনি importএকটি নির্দিষ্ট উপাদানটিকে ভুলে গেছেন (এটি আপনি যে কোনও লাইব্রেরি ইনস্টল করেছেন বা আপনার তৈরি কাস্টম তৈরির উপাদানটি তা নয়):

import {SomeClass} from 'some-library'

আপনি যখন এটি পরে আমদানি না করে ব্যবহার করেন, সংকলকটি এটি একটি ফাংশন বলে মনে করে। সুতরাং, এটি বিরতি। এটি একটি সাধারণ উদাহরণ:

imports

...code...

এবং তারপরে কোথাও আপনার কোডের ভিতরে

<Image {..some props} />

আপনি যদি উপাদানটি আমদানি করতে ভুলে যান <Image />তবে সংকলকটি অন্যান্য আমদানির জন্য যেমন অভিযোগ করবে না, তবে এটি আপনার কোডে পৌঁছালে তা ভেঙে যাবে।


1

আমার জন্য, কারণ আমি দুর্ঘটনাক্রমে আমার মুছে ফেলেছি render পদ্ধতিটি ফেলেছিলাম!

আমার একটি componentWillReceivePropsপদ্ধতি ছিল যেখানে আমার আর প্রয়োজন হয় না সঙ্গে একটি ক্লাস ছিল , সঙ্গে সঙ্গে একটি সংক্ষিপ্ত renderপদ্ধতির পূর্ববর্তী । আমার তাড়াহুড়া করার সময়, আমি ঘটনাক্রমে পুরোটিকে সরিয়ে দিয়েছিrender পদ্ধতিটিও ।

এই ছিল ব্যথা , নিচে ট্র্যাক করতে হিসাবে আমি এই সমস্যার "SOURCE" হচ্ছে সম্পূর্ণরূপে অপ্রাসঙ্গিক ফাইল মন্তব্য নির্দেশ কনসোল ত্রুটি পেয়ে ছিল।


1

আমার অনুরূপ সমস্যা ছিল আমি রেন্ডার পদ্ধতিটিকে ভুল করে ডাকছিলাম

একটি ত্রুটি দিয়েছে:

render = () => {
    ...
}

পরিবর্তে

সঠিক:

render(){
    ...
}


1

আমার জন্য এটি ঘটেছিল কারণ আমি আমার সংযোগ ফাংশনটি সঠিকভাবে গুটিয়ে নিই এবং ডিফল্ট দুটি উপাদান রফতানি করার চেষ্টা করেছি


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

আমি এটিতেও চলে এসেছি, এটি সম্ভব আপনার প্রতিক্রিয়া উপাদানটির ভিতরে জাভাস্ক্রিপ্ট ত্রুটি রয়েছে। আপনি যদি newক্লাসের অপারেটরটি নতুন উদাহরণটি ইনস্ট্যান্ট করতে ব্যবহার করছেন তবে কোনও নির্ভরতা ব্যবহার করছেন কিনা তা নিশ্চিত করুন । ত্রুটি যদি নিক্ষেপ করা হবে

this.classInstance = Class({})

পরিবর্তে ব্যবহার

this.classInstance = new Class({})

আপনি ব্রাউজারে ত্রুটি শৃঙ্খলে দেখতে পাবেন

at ReactCompositeComponentWrapper._constructComponentWithoutOwner

এটাই আমি বিশ্বাস করি।


0

আপনাকে এইচএমআর বন্ধ করার চেষ্টা করুন এবং 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

আমার ক্ষেত্রে, জেএসএক্সকে প্যারেন্ট উপাদান ব্যবহার করে "<>" ছাড়াই অন্যান্য উপাদানকে কল করা হয়েছিল

 <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ফাংশনের আর্গুমেন্ট হিসাবে রেখেছিলাম যখন এটি শেষে থাকার কথা ছিল। duh।

এটি অবশ্যই - আমাকে ত্রুটি দিয়েছে:

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

আমার জন্য এটি rootReducr.js এ কোনও হ্রাসকারকের আমদানি ছিল। আমি হ্রাসকারী ফাইলের পরিবর্তে ধারকটি আমদানি করেছি।

উদাহরণ

import settings from './pages/Settings';

তবে নিশ্চিত হওয়া উচিত

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

যেখানে সেটিংস ডিরেক্টরিতে নিম্নলিখিত ক্রিয়াকলাপগুলি রয়েছে।

এটি যাচাই করার জন্য আপনি রিডুএক্স / এসএস / রিডেক্স.জেএস থেকে অ্যাসেটরাইডুসারশ্যাপ () ফাংশনের হ্রাসকারী আরগ লগ করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.