未捕获的TypeError:无法读取未定义的属性'onMouseEnter'

时间:2019-03-04 19:17:05

标签: javascript reactjs dropdown react-bootstrap

我想构建一系列下拉菜单,当鼠标悬停在它们上方时,这些下拉菜单将打开。我正在使用React-Bootstrap进行下拉。我已经定义了一个函数并将其设置在我的构造函数中。但它不会在Chrome中呈现,这告诉我onMouseEnter函数未定义。 我错过了什么导致这种情况发生?我认为我正在遵循基本的React准则,但无法弄清我错过了什么。

import React, { Component } from "react";
import ReactDOM from "react-dom";
import "./Menu.css";
import Dropdown from '../../../../../node_modules/react-bootstrap/Dropdown';

class Menu extends Component {  

 constructor(props) {
    super(props);

    this.toggle = this.toggle.bind(this);
    this.onMouseEnter = this.onMouseEnter.bind(this);
    this.onMouseLeave = this.onMouseLeave.bind(this);
    this.state = {
      dropdownOpen: false
    };

    this.tempData = this.tempData.bind(this);
 } 

  toggle() {
    this.setState(prevState => ({
      dropdownOpen: !prevState.dropdownOpen
    }));
  }

  onMouseEnter() {
    this.setState({dropdownOpen: true});
  }

  onMouseLeave() {
    this.setState({dropdownOpen: false});
  }


 tempData(){return ...}


 MakeDropdowns(data) {
    let CreateSubs = function(props){
         let set = props.props;
         let val=[];

         for(var j=0;j<set.length;j++){
            val.push(<Dropdown.Item href={set[j].link} key={set[j].name +" " + j}>{set[j].name}</Dropdown.Item>)
        }

        return val;
    }

    let list = [];
    for(var i=0;i<data.data.length;i++){
        let val = data.data[i];
        list.push(
            <li id="MenuBodyLI" key={val.name+ " " + i}>
                <Dropdown onMouseOver={this.onMouseEnter} onMouseLeave={this.onMouseLeave} isOpen={this.state.dropdownOpen} toggle={this.toggle}>
                  <Dropdown.Toggle variant="secondary" size="sm" id="dropdown-basic">
                  {val.name}
                  </Dropdown.Toggle>
                  <Dropdown.Menu>
                    <CreateSubs props={val.subtitles}/>
                  </Dropdown.Menu>
                </Dropdown>             
            </li>
        );
    }

    return list;    
  }

  render() {
    const val = this.tempData();

    return (
        <div className="MenuBody">          
            <ul id="MenuBodyUL">
                <this.MakeDropdowns data={val}/>
            </ul>
        </div>
    );
  }
}
export default Menu;

const wrapper = document.getElementById("create-menu");
wrapper ? ReactDOM.render(<Menu />, wrapper) : false;

1 个答案:

答案 0 :(得分:0)

尝试以与您的MakeDropdowns相同的方式进行绑定onMouseEnter

此外,如果MakeDropdowns是应创建并返回JSX元素的类方法,则应类似执行以下操作:

return (
  <div className="MenuBody">          
    <ul id="MenuBodyUL">
      {this.MakeDropdowns(this.data)} // Do not start your methods with capital letter
    </ul>
  </div>
);

您可以在此处找到一些示例 https://reactjs.org/docs/lists-and-keys.html#embedding-map-in-jsx