反应函数没有定义no-undef

时间:2017-06-11 17:12:49

标签: reactjs

在尝试编译我的应用时出现以下错误 - ' getRestaurants'未定义no-undef

我无法跟踪为什么没有为zipCodeToCoords定义getRestaurants

我有一个输入组件,在提交时接受邮政编码并调用zipCodeToCoords,然后我想调用getRestaurants

这是主要的反应成分

class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      restraunts:[],
      selectedRestraunt:null
    }
  }


  getRestaurants(lat,lon){
    var url = "https://developers.zomato.com/api/v2.1/geocode?lat="+lat+"&lon="+lon;
    $.ajax({
      url:url,
      headers:{
        'Accept': 'application/json',
        'user_key': 'MY KEY'
      }

    }).done(function(data){
      console.log(data);
    });
  }


  zipCodeToCoords(zip){
    var url = "https://www.zipcodeapi.com/rest/MYKEY/info.json/"+ zip +"/degrees";
    $.ajax({
      url:url,

    }).done(function(data){
      console.log(data.lat);
      getRestaurants(data.lat,data.lng);
    });
  }




  render() {
    return (
      <div className="App">
        <div className="row">
          <div className="columns large-9">
            <Input onSearchTermSubmit={this.zipCodeToCoords} />
          </div>  
        </div>
        <div className="row">
          <div className="columns large-9">
            <RestrauntInfo />
          </div>
          <div className="columns large-3">
            <RestrauntList />
          </div>
        </div>
      </div>
    );
  }
}

这是输入组件

class Input extends Component{

    constructor(props){
        super(props);
        this.state = {zip:''};

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }


    handleSubmit(event){
        event.preventDefault();
        this.props.onSearchTermSubmit(this.state.zip);
    }
    handleChange(event){
        this.setState({zip:event.target.value});

    }

    render(){
        return(<div>
            <form onSubmit={this.handleSubmit}>
                <div className="input-group">
                    <span className="input-group-label">Enter Zip Code</span>
                    <input className="input-group-field" type="number" value={this.state.zip} onChange={this.handleChange} />
                    <div className="input-group-button">
                      <input type="submit" className="button" value="Submit" />
                    </div>
                </div>  
            </form> 
        </div>);
    }
}

2 个答案:

答案 0 :(得分:17)

获取餐馆不是一些全局功能,它是您的App类上的一种方法,因此您需要这样调用它。解决这个问题的最简单方法可能是:

  1. 将完成的回调更改为箭头功能
  2. this.getRestaurants
  3. 中致电zipCodeToCoords
  4. 在您的构造函数中将this绑定到getRestaurantszipCodeToCoords,即this.getRestaurants = this.getRestaurants.bind(this);
  5. 回调将成为:

    done((data) => {
        console.log(data.lat);
        this.getRestaurants(data.lat,data.lng);
    });
    

答案 1 :(得分:1)

这看起来是一个范围问题,因为你传递zipCodeToCoords它的范围是从它调用的地方,而不是你想要的地方。要解决此问题,您可以使用.bind,或者如果您正在转换应用程序,则可以将其更改为箭头功能。

  zipCodeToCoords = (zip) => {
       ...
  }

您还需要更改getRestaurants(data.lat,data.lng);以从范围this.getRestaurants(data.lat,data.lng);

调用它