元素类型无效:应为字符串(对于内置组件)或 class/function 反应错误
Element type is invalid: expected a string (for built-in components) or a class/function React Error
当我尝试通过按钮更改页面时,我遇到了 React 问题(但是)控制台给我:
Element type is invalid: expected a string (for built-in components) or >a class/function (for composite components) but got: undefined. You >likely forgot to export your component from the file it's defined in.
但是,当我将 onClick
代码放入 class 代码时,它会显示 jsx 代码。所以它有效,但为什么我仍然收到错误?这是我的代码:
import React from 'react';
import {render} from 'react-dom';
//sass
require('../sass/style.scss');
var pages = ['Qrscan'];
var jsx = [<Qrscan />];
class App extends React.Component {
constructor (props) {
super(props);
this.state = {target: <Menu />};
App.changePage = App.changePage.bind(this);
}
static changePage (tar) {
this.setState({target: tar});
}
render () {
return (
this.state.target
)
}
}
//Rendering
class Menu extends React.Component {
render() {
return (
<div id="root">
<Header />
<div className="container">
<But target="Qrscan" class="button button-QR" text="Use QR code" type="button" linkTo="" />
<But class="button button-URL" text="Use URL" type="button" />
</div>
</div>
)
}
}
class Qrscan extends React.Component {
render() {
return (
<h1>test</h1>
)
}
}
//elements
class Header extends React.Component {
render () {
return (
<div className="header">
<div className="header-logo">Jukey</div>
</div>
)
}
}
class But extends React.Component {
getInfo () {
for (var i = 0; i < pages.length; i++) {
if(pages[i] == this.props.target) {
return jsx[i];
}
}
}
render () {
return (
<button onClick={() => App.changePage(this.getInfo())} className={this.props.class}>{this.props.text}</button>
)
}
}
render (<App />, document.getElementById('app'));
感谢您花时间帮助我解决问题![=14=]
ES6 Class 声明是 not hoisted.
在您定义 var jsx = [<Qrscan />];
的第二行中,该元素实际上是 undefined
。当我打印出 jsx
数组的内容时,我得到:
Object {$$typeof: Symbol(react.element), type: undefined, key: null, ref: null, props: Object…}
因此,您只需将 jsx
数组声明转移到 在 您的 <Qrscan>
组件声明之后。
请参阅以下 JSFiddle 进行修复,并亲眼看看它在移动声明顺序后是否有效 (:
var pages = ['Qrscan'];
//Rendering
class Menu extends React.Component {
render() {
return (
<div id="root">
<Header />
<div className="container">
<But target="Qrscan" class="button button-QR" text="Use QR code" type="button" linkTo="" />
<But class="button button-URL" text="Use URL" type="button" />
</div>
</div>
)
}
}
class App extends React.Component {
constructor (props) {
super(props);
this.state = {target: <Menu />};
App.changePage = App.changePage.bind(this);
}
static changePage (tar) {
this.setState({target: tar});
}
render () {
return (
this.state.target
)
}
}
class Qrscan extends React.Component {
render() {
return (
<h1>test</h1>
)
}
}
var jsx = [<Qrscan />];
//elements
class Header extends React.Component {
render () {
return (
<div className="header">
<div className="header-logo">Jukey</div>
</div>
)
}
}
class But extends React.Component {
getInfo () {
for (var i = 0; i < pages.length; i++) {
if (pages[i] == this.props.target) {
return jsx[i];
}
}
}
render () {
return (
<button onClick={() => App.changePage(this.getInfo())} className={this.props.class}>{this.props.text}</button>
)
}
}
ReactDOM.render (<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app">
</div>
当我尝试通过按钮更改页面时,我遇到了 React 问题(但是)控制台给我:
Element type is invalid: expected a string (for built-in components) or >a class/function (for composite components) but got: undefined. You >likely forgot to export your component from the file it's defined in.
但是,当我将 onClick
代码放入 class 代码时,它会显示 jsx 代码。所以它有效,但为什么我仍然收到错误?这是我的代码:
import React from 'react';
import {render} from 'react-dom';
//sass
require('../sass/style.scss');
var pages = ['Qrscan'];
var jsx = [<Qrscan />];
class App extends React.Component {
constructor (props) {
super(props);
this.state = {target: <Menu />};
App.changePage = App.changePage.bind(this);
}
static changePage (tar) {
this.setState({target: tar});
}
render () {
return (
this.state.target
)
}
}
//Rendering
class Menu extends React.Component {
render() {
return (
<div id="root">
<Header />
<div className="container">
<But target="Qrscan" class="button button-QR" text="Use QR code" type="button" linkTo="" />
<But class="button button-URL" text="Use URL" type="button" />
</div>
</div>
)
}
}
class Qrscan extends React.Component {
render() {
return (
<h1>test</h1>
)
}
}
//elements
class Header extends React.Component {
render () {
return (
<div className="header">
<div className="header-logo">Jukey</div>
</div>
)
}
}
class But extends React.Component {
getInfo () {
for (var i = 0; i < pages.length; i++) {
if(pages[i] == this.props.target) {
return jsx[i];
}
}
}
render () {
return (
<button onClick={() => App.changePage(this.getInfo())} className={this.props.class}>{this.props.text}</button>
)
}
}
render (<App />, document.getElementById('app'));
感谢您花时间帮助我解决问题![=14=]
ES6 Class 声明是 not hoisted.
在您定义 var jsx = [<Qrscan />];
的第二行中,该元素实际上是 undefined
。当我打印出 jsx
数组的内容时,我得到:
Object {$$typeof: Symbol(react.element), type: undefined, key: null, ref: null, props: Object…}
因此,您只需将 jsx
数组声明转移到 在 您的 <Qrscan>
组件声明之后。
请参阅以下 JSFiddle 进行修复,并亲眼看看它在移动声明顺序后是否有效 (:
var pages = ['Qrscan'];
//Rendering
class Menu extends React.Component {
render() {
return (
<div id="root">
<Header />
<div className="container">
<But target="Qrscan" class="button button-QR" text="Use QR code" type="button" linkTo="" />
<But class="button button-URL" text="Use URL" type="button" />
</div>
</div>
)
}
}
class App extends React.Component {
constructor (props) {
super(props);
this.state = {target: <Menu />};
App.changePage = App.changePage.bind(this);
}
static changePage (tar) {
this.setState({target: tar});
}
render () {
return (
this.state.target
)
}
}
class Qrscan extends React.Component {
render() {
return (
<h1>test</h1>
)
}
}
var jsx = [<Qrscan />];
//elements
class Header extends React.Component {
render () {
return (
<div className="header">
<div className="header-logo">Jukey</div>
</div>
)
}
}
class But extends React.Component {
getInfo () {
for (var i = 0; i < pages.length; i++) {
if (pages[i] == this.props.target) {
return jsx[i];
}
}
}
render () {
return (
<button onClick={() => App.changePage(this.getInfo())} className={this.props.class}>{this.props.text}</button>
)
}
}
ReactDOM.render (<App />, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app">
</div>