MuiThemeProvider.render():必须返回有效的React元素(或null)

时间:2017-07-16 05:37:41

标签: javascript reactjs material-ui

我正在使用带有React的Material UI来创建下拉列表。如果我将下拉组件保留在我的src/app.js中,一切都会很好。但是,如果我将其移至单独的文件fruits.js,我会收到以下错误:

  1. MuiThemeProvider.render():必须返回有效的React元素(或null)。您可能已经返回了undefined,数组或其他一些无效对象。

  2. 未处理的拒绝(TypeError):无法读取属性' _currentElement'为null

  3. 以下是app.js中的代码:

    import React, { Component } from 'react';
    import logo from './logo.svg';
    import './App.css';
    import Fruits from './fruits';
    
    class App extends Component {
      render() {
        return (
          <div className="App">
            <div className="App-header">
              <img src={logo} className="App-logo" alt="logo" />
              <h2>Welcome to React</h2>
            </div>
            <h1>Fruits</h1>
            <Fruits/>
          </div>
        );
      }
    }
    
    export default App;
    

    fruits.js中的代码:

    import React, { Component } from 'react';
    import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
    import DropDownMenu from 'material-ui/DropDownMenu';
    import MenuItem from 'material-ui/MenuItem';
    import injectTapEventPlugin from 'react-tap-event-plugin';
    injectTapEventPlugin();
    
    class Fruits extends Component {
      constructor(props) {
        super(props);
        this.state = {
          msg: '',
          current_fruit_pic: '',
          fruits: []
        };
      }
      componentWillMount(){
        let that = this;
        fetch('http://localhost:3001/fruits',{mode: 'cors'}).then((res)=>{
          res.json().then((data)=>{
            that.setState({
              fruits: data
            })
          });
        });
      }
    
      handleChange = (event, index, value) => {
        this.setState({
          msg: "you have clicked " + value.type,
          current_fruit_pic: value.img
        },()=> console.log(this.state));
      };
      render() {
        return (
        <MuiThemeProvider>
            <h2>{this.state.msg}</h2>
            <img className='fruit-image' src={this.state.current_fruit_pic} alt='no fruit chosen'/>
            <br/>
            <DropDownMenu value={this.state.value} onChange={this.handleChange}  openImmediately={true}>
            {
              this.state.fruits.map(function(fruit,i){
                return <MenuItem key={i} value={fruit} primaryText={fruit.type}/>
              })   
            }
            </DropDownMenu>
        </MuiThemeProvider>
        );
      }
    }
    
    export default Fruits;
    

    我的package.json

    {
      "name": "glocomm",
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "express": "^4.15.3",
        "material-ui": "^0.18.6",
        "react": "^15.6.1",
        "react-dom": "^15.6.1",
        "react-tap-event-plugin": "^2.0.1"
      },
      "devDependencies": {
        "react-scripts": "1.0.10"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test --env=jsdom",
        "eject": "react-scripts eject"
      }
    }
    

    http://localhost:3001/fruits返回的数据:

    [{"type":"apple","img":"http://images.all-free-download.com/images/graphiclarge/apple_graphic_6815072.jpg"},{"type":"banana","img":"http://img05.deviantart.net/e8a7/i/2015/336/6/4/banana_vector_by_alexismnrs-d9isfz4.png"},{"type":"pear","img":"http://www.pngmart.com/files/1/Pear-Vector-PNG.png"},{"type":"strawberry","img":"http://4vector.com/i/free-vector-strawberry-clip-art_113695_Strawberry_clip_art_hight.png"},{"type":"watermelon","img":"http://www.freepngimg.com/thumb/watermelon/16-watermelon-png-image-thumb.png"}]
    

1 个答案:

答案 0 :(得分:13)

<MuiThemeProvider>只能有一个孩子,否则会引发错误,所以将其包装在<div>中:

<MuiThemeProvider>
  <div>
    <h2>{this.state.msg}</h2>
    <img className='fruit-image' src={this.state.current_fruit_pic} alt='no fruit chosen' />
    <br />
    <DropDownMenu value={this.state.value} onChange={this.handleChange}  openImmediately={true}>
      {
        this.state.fruits.map(function(fruit, i) {
          return <MenuItem key={i} value={fruit} primaryText={fruit.type} />
        })   
      }
    </DropDownMenu>
  </div>
</MuiThemeProvider>