javascript - Ufanget feil: Invariant brudd: Elementtype er ugyldig: forventet en streng (for innebygde komponenter) eller en klasse/funksjon, men fikk: objekt
Jeg får denne feilen:
Ufanget feil: Invariantbrudd: Elementtypen er ugyldig: forventet en streng (for innebygde komponenter) eller en klasse/funksjon (for sammensatte komponenter), men fikk: objekt.
Dette er koden min:
var React = require('react')
var ReactDOM = require('react-dom')
var Router = require('react-router')
var Route = Router.Route
var Link = Router.Link
var App = React.createClass({
render() {
return (
<div>
<h1>App</h1>
<ul>
<li><Link to="/about">About</Link></li>
</ul>
</div>
)
}
})
var About = require('./components/Home')
ReactDOM.render((
<Router>
<Route path="/" component={App}>
<Route path="about" component={About} />
</Route>
</Router>
), document.body)
Min Home.jsx-fil:
var React = require('react');
var RaisedButton = require('material-ui/lib/raised-button');
var Home = React.createClass({
render:function() {
return (
<RaisedButton label="Default" />
);
},
});
module.exports = Home;
Svar #1
I mitt tilfelle (ved bruk av Webpack) var det forskjellen mellom:
import {MyComponent} from '../components/xyz.js';
mot
import MyComponent from '../components/xyz.js';
Den andre fungerer mens den første forårsaker feilen. Eller det motsatte.
Svar #2
du trenger eksport standard eller require(path).default
var About = require('./components/Home').default
Svar #3
Har du nettopp modulært gjort noen av React-komponentene dine? Hvis ja, vil du få denne feilen hvis du glemte å spesifisere module.exports, for eksempel:
ikke-modularisert tidligere gyldig komponent/kode:
var YourReactComponent = React.createClass({
render: function() { ...
modularisert komponent/kode med module.exports:
module.exports = React.createClass({
render: function() { ...
Svar #4
I mitt tilfelle returnerte en av de eksporterte undermodulene ikke en riktig React-komponent.
const Component = <div> Content </div>;
i stedet for
const Component = () => <div>Content</div>;
Feilen som ble vist var for forelderen, derfor kunne den ikke finne ut av det.
Svar #5
Hvis du får denne feilen, kan det være fordi du importerer lenke ved å bruke
import { Link } from 'react-router'i stedet kan det være bedre å bruke
import { Link } from 'react-router-dom'
^--------------^
Jeg tror dette er et krav for react router versjon 4
Svar #6
Gitt din feil av:
'Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object'Du har 2 alternativer:
- Eksportfilen din kan ha ordet
defaultsom i
export default class someNameHere
Da må importen din unngå å bruke {} rundt den. Som i
import somethingHere from someWhereHere
- Unngå å bruke standardordet. Da ser eksporten din slik ut
export class someNameHere
Da må importen din bruke {}. Som
import {somethingHere} from someWhereHere
Svar #7
Ikke bli overrasket over listen av svar for ett enkelt spørsmål. Det finnes ulike årsaker til dette problemet;
For mitt tilfelle var advarselen
warning.js:33 Advarsel: React.createElement: typen er ugyldig -- forventet en streng (for innebygde komponenter) eller en klasse/funksjon (for sammensatte komponenter) men fikk: undefined. Du har sannsynligvis glemt å eksportere komponenten din fra filen den er definert i. Sjekk koden din på index.js:13.
Etterfulgt av feilen
invariant.js:42 Uopptatt feil: Elementtypen er ugyldig: forventet en streng (for innebygde komponenter) eller en klasse/funksjon (for sammensatte komponenter), men fikk: udefinert. Du har sannsynligvis glemt å eksportere komponenten din fra filen den er definert i.
Jeg kunne ikke forstå feilen siden den ikke nevner noen metode eller filnavn. Jeg klarte å løse det først etter å ha sett på denne advarselen, nevnt ovenfor.
Jeg har følgende linje i index.js.
<ConnectedRouter history={history}>
Da jeg googlet etter feilen ovenfor med søkeordet "ConnectedRouter" fant jeg løsningen på en GitHub-side.
Feilen skyldes at når vi installerer react-router-redux-pakken, installerer vi som standard denne. https://github.com/reactjs/react-router-redux, men ikke det faktiske biblioteket.
For å løse denne feilen, installer riktig pakke ved å spesifisere npm-scope med @
npm install react-router-redux@next
Du trenger ikke å fjerne pakken som er installert feil. Den vil automatisk bli overskrevet.
Takk.
PS: Selv advarsel hjelper deg. Ikke neglisjer advarsel ved kun å se på feil alene.
Svar #8
https://github.com/rackt/react-router/blob/e7c6f3d848e55dda11595447928e843d39bed0eb/examples/query-params/app.js#L4 Router er også en av egenskapene til react-router. Så endre dine modulkrav-koder slik:
var reactRouter = require('react-router')
var Router = reactRouter.Router
var Route = reactRouter.Route
var Link = reactRouter.Link
Hvis du vil bruke ES6-syntaksen lenke bruk (import), bruk babel som hjelper.
Forresten, for å få koden din til å fungere, kan vi legge til {this.props.children} i App, slik
render() {
return (
<div>
<h1>App</h1>
<ul>
<li><Link to="/about">About</Link></li>
</ul>
{this.props.children}
</div>
)
}
Svar #9
I mitt tilfelle ble det forårsaket av feil kommentarsymboler. Dette er feil:
<Tag>
/*{ oldComponent }*/
{ newComponent }
</Tag>
Dette er korrekt:
<Tag>
{/*{ oldComponent }*/}
{ newComponent }
</Tag>
Merk de krøllede parentesene
Svar #10
Jeg har samme feil : FEIL FIKS !!!!
Jeg bruker 'react-router-redux' v4, men den er dårlig.. Etter npm install react-router-redux@next er jeg på "react-router-redux": "^5.0.0-alpha.9",
OG DET FUNGERER
Svar #11
Jeg fikk dette ved å gjøre import App from './app/'; og forventet at det skulle importere ./app/index.js, men det importerte i stedet ./app.json.
Svar #12
Jeg hadde det samme problemet og innså at jeg ga en Udefinert React-komponent i JSX-markeringen. Saken er at React-komponenten som skulle rendres ble beregnet dynamisk, og den endte opp med å være udefinert!
Feilen oppga:
Invariant Brudd: Elementtype er ugyldig: forventet en streng (for innebygde komponenter) eller en klasse/funksjon (for sammensatte komponenter), men fikk: udefinert. Du har sannsynligvis glemt å eksportere komponenten din fra filen den er definert i. Sjekk render-metoden til
C.
Eksemplet som gir denne feilen:
var componentA = require('./components/A');
var componentB = require('./components/B');
const templates = {
a_type: componentA,
b_type: componentB
}
class C extends React.Component {
constructor(props) {
super(props);
}
// ...
render() {
//Let´s say that depending on the uiType coming in a data field you end up rendering a component A or B (as part of C)
const ComponentTemplate = templates[this.props.data.uiType];
return <ComponentTemplate></ComponentTemplate>
}
// ...
}Problemet var at en ugyldig "uiType" ble oppgitt, og derfor ga dette udefinert som resultat:
templates['InvalidString']