2015-10-27 20 views
9

Dopo essersi frustrato dalla gemma react_rails a causa della mancanza di supporto per i moduli Commonjs, sto testando la gemma react_webpack_rails da netguru. ma da allora ho avuto una violazione invariante.Errore React.js Uncaught: Violazione invariata

Per esempio, se sto scrivendo un semplice componente Ciao Mondo nella sintassi ES6:

import React from 'react'; 

class tasksBox extends React.Component { 
    render() { 
    return <div>Hello World</div>; 
    } 
} 

export default tasksBox; 

sollevare questi errori:

Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). 

Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. 

il vostro aiuto sarà molto apprezzato, non posso capire da dove viene l'errore.

+0

Niente di sbagliato con il codice c'è quindi il problema è altrove –

+0

In che modo stai provando a rendere 'tasksBox'? –

+0

Se la modifica della maiuscola risolve veramente il problema, il codice effettivo deve essere diverso. –

risposta

6

Il nome del componente di risposta non è valido. Deve essere capitalizzato in questo modo:

export class TasksBox extends React.Component { 
    render() { 
     return <div>Hello World</div>; 
    } 
} 

È possibile esportare la classe in linea. Notate che ho cambiato il nome di iniziare con una lettera maiuscola TasksBox invece di tasksBox come Reagire vuole il nome della classe per iniziare con la lettera maiuscola


EDIT: se il vostro esempio non ha funzioni definite personalizzati statali o di altri non voi bisogno questo sia un Reagire classe .. ma piuttosto può essere un Stateless Funzione/Componente in questo modo

export default (props) => { 
    return <div>Hello World</div>; 
} 
+0

Non c'è bisogno di chiamare 'super()' se non si sostituisce il costruttore. Anche la maiuscola del nome della classe non ha importanza, è importante in JSX, ma non vediamo come viene eseguito 'tasksBox'. –

+0

@FelixKling non hai uno stato sulla classe se non sovrascrivi il costruttore se non sbaglio giusto? ci sono anche alcune altre cose che sono state raccomandate nella risposta –

+0

Vedere il mio commento modificato per quanto riguarda le altre cose. Giusto, non hai lo stato, ma il componente non usa lo stato, quindi non è un problema. Non sto dicendo che i tuoi suggerimenti sono sbagliati, sto insinuando che non risolveranno il problema che l'utente ha. –

8

Beh, la risposta è stata molto semplice, necessaria per mettere la prima lettera del nome di classe in lettera maiuscola. e tutto è andato bene.

import React from 'react'; 

class TasksBox extends React.Component { 
    render() { 
    return <div>blabla</div>; 
    } 
} 

export default TasksBox; 

grazie per il vostro aiuto ragazzi.

+0

che era una specifica nella mia risposta –

+0

sorry mancato. altri commenti erano veri anche dal modo in cui la classe di sotto era solo un esempio nudo. le tue risposte sono state accettate :) –

+0

Non è corretto. Il problema non si trova in questo componente. Come puoi vedere, i nomi delle classi non devono essere in maiuscolo: https://jsfiddle.net/rprwgv52/. Il fatto che l'errore dica "... but got: undefined" indica piuttosto che il componente non è stato importato correttamente. –

3

So che questa è una domanda precedente, ma mi sono imbattuto in questo problema solo quando ho provato ad usare la libreria dei componenti react-bootstrap.

Stavo tentando di importare DropDownButton da 'reagire-bootstrap' utilizzando la nuova sintassi di importazione import DropdownButton from 'react-bootstrap' e il problema era che avevo bisogno di parentesi graffe intorno DropDownButton in questo modo: import { DropdownButton } from 'react-bootstrap'

Problemi correlati