简体   繁体   English

刷新(重新调用)API的“反应”按钮

[英]react button for refresh(re-call) API

I have an API that gives me a random location each time I recall the API, and I want the button to just re-call the API. 我有一个API,每次调用该API时,都会给我一个随机的位置,并且我希望按钮仅调用该API。

I tried to use an arrow function and a normal function but I get a different error; 我尝试使用箭头功能和常规功能,但遇到了另一个错误; my general idea is to wrap the fetching method with a function and then call this function twice, the first call before I render the component and the second call on this button. 我的一般想法是用函数包装fetching方法,然后调用此函数两次,第一次调用是在渲染组件之前,第二次调用此按钮。

These are my attempts: 这些是我的尝试:

(Note: my buggy function is handleOnClick ) (注意:我的越野车功能是handleOnClick

 state = {
   isLoading: true,
   shop: null, 
   error: null
 };

 componentDidMount() {
   // fix CORB and CORS issues by using proxy
   var proxyUrl = 'https://cors-anywhere.herokuapp.com/',
     targetUrl ='https://wainnakel.com/api/v1/GenerateFS.php?uid=26.2716025,50.2017993&g%20et_param=value';

     function handleOnClick() {
       fetch(proxyUrl + targetUrl)
     .then(res => res.json())
     .then(shop => {
       console.table(shop); // create table in console 
       this.setState({ 
         shop ,
         isLoading:false,
       });
     })
     .catch(e => {
       console.log(e);
     });    
   }

   handleOnClick();
 }


   showLocation = () => {
   var location = `${this.state.shop.lat}%2C%20${this.state.shop.lon}`;
  var gmapurl =`https://maps.google.com/maps?q=${location}&t=&z=17&ie=UTF8&iwloc=&output=embed`;
  return gmapurl;
};



 render() {

   const { isLoading, shop, error } = this.state; //no need to write this.state every time



   let gmapurl ;  //create variable that we will store the new location from the API 

   return (  


     <React.Fragment>
          <Navigation />

     <div> 
     {/* // Display a message if we faced an error */}
     {error ? <p>{error.message}</p> : null} 
     {!isLoading ? ( //   check data if it ready 
     //and take lat and lon from api ,and place it in  embedded google map url
    gmapurl =`https://maps.google.com/maps?q=${this.state.shop.lat}%2C%20${this.state.shop.lon}&t=&z=17&ie=UTF8&iwloc=&output=embed`,

       shop ? (
         <div>

           <h1> {this.state.shop.name}</h1>
        {/* MAP */}  
        <div className="mapouter MapPage"><div className="gmap_canvas">
           <iframe width="768" height="500" id="gmap_canvas" src={gmapurl} 
           frameBorder="0" scrolling="false" marginHeight="0" marginWidth="0">
           </iframe>
           <h1>map veiw</h1></div> 
           </div>


           <button className="btn" onClick={() =>  {handleOnClick}}> <div className="lds-ellipsis"><div></div><div></div><div></div><div></div></div>أقتراح آخر</button>

        </div> ) : ( '')
):(      // show loading icon if there is a delay in data
<div> <img src={loadingpic}></img>  </div>
 )
     }
     </div>
     </React.Fragment>
   );
 }
}

and this the error I got 这是我得到的错误


  Line 82:  Expected an assignment or function call and instead saw an expression no-unused-expressions

  Line 82:  'handleOnClick' is not defined  no-undef

Your handleOnClick is a local function, that can only be called from inside componentDidMount . 您的handleOnClick是一个局部函数,只能从componentDidMount内部调用。 To be able to call it from anywhere inside the class, use a method. 为了能够从类内部的任何地方调用它,请使用方法。 Maybe the name should be a bit more descriptive of the task that it actually does, eg loadShop : 也许该名称应该更能说明其实际执行的任务,例如loadShop

 loadShop() {
   this.setState({ isLoading: true });

  fetch(proxyUrl + targetUrl)
    .then(res => res.json())
    .then(shop => {
      console.table(shop);
      this.setState({ 
         shop ,
         isLoading:false,
      });
     });
 }

Then you can call it from anywhere inside the class as this.loadShop() , eg 然后,您可以从类内的任何位置调用this.loadShop() ,例如

 <button onClick={() => this.loadShop()} >

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM