2017-02-24 73 views
0

我目前在项目中使用ReactJs, 而且我有按钮,当点击按钮时,有api调用并且组件应该被渲染。如何重新呈现异步调用的反应组件?

但是到现在为止,使用ComponentDidMount()不会发生,使用ComponentWillMount()检查结果是一样的。

所以任何人都可以让我知道如果我失去了什么?

代码:

import React from 'react'; 
import "./AddCarrier.css" 
import {DataTable,Alert,Loader} from 'react-pattern-library'; 

import axios from 'axios'; 

export default class AddCarrier extends React.Component{ 
    constructor(props){ 
     super(props); 
     this.state={tableContent:{},tableContentAdd:{},carrier:{},responseCarrierList:{},tableContentEdit:{},carrierResponse:{},agentName:"",agentType:"",error:"",ntID:"",producerNumber:"",ux:"normal"} 
     this.getList = this.getList.bind(this) 
     this.addCarrier = this.addCarrier.bind(this) 
     this.editCarrier = this.editCarrier.bind(this) 
     this.getListCarrier = this.getListCarrier.bind(this); 
    } 

    getList(){ 
     let carrier={}; 
     let responseCarrierList={}; 
     var agentName,agentType,ntID,producerNumber; 

     const url = 'http://localhost:9001/carriers'; 
     axios.post(url,{ 
      ntId:"xxxxxx" 
     }) 
      .then(rsp => { 
       if(rsp!=undefined){ 
       agentName = rsp.data.agentDetails[0].agentName; 
       agentType = rsp.data.agentDetails[0].agentType; 
       ntID=rsp.data.agentDetails[0].NTID; 
       producerNumber=rsp.data.agentDetails[0].ProducerNumber; 
       carrier=rsp.data.carrier; 
       responseCarrierList=rsp.data.responseCarrierList; 
       this.setState({carrier:carrier,responseCarrierList:responseCarrierList,agentName: agentName, agentType: agentType,ntID:ntID,producerNumber:producerNumber}); 
       this.getListCarrier(); 
      } 
     }) 

    } 
    componentWillMount(){ 
     this.getList(); 
    } 

    getListCarrier(){ 
     var addObj={tableBody:[]}; 
     var editObj={tableBody:[]}; 
     var addCarrierArray = [] 
     this.state.carrier.forEach(carrierAdd => { 
     if(this.state.responseCarrierList.filter((filterCarrier) => filterCarrier.CARRIER_NAIC_CD == carrierAdd.carrierNaicCd).length == 0){ 
      addCarrierArray.push(carrierAdd)} 
     }) 
     var carrierDetails = this.state.carrier; 
     /////////////Add Carrier Component//////////// 
     addCarrierArray.map(carrier =>{ 
      var elements = {} 
      elements.CarrierName = carrier.vendorNm + " - " + carrier.carrierNaicCd; 
      elements.UserName = <input ref={user=> this.uname = user} type="text" id="uname" placeholder="enter username" className="c-form-field__input" data-id={carrier.carrierNaicCd}/>; 
      elements.Password = <input ref={pass=> this.password = pass} type="password" id="pass" placeholder="enter password " className="c-form-field__input"/>; 
      elements.Action =<button className="c-btn c-btn--secondary c-btn--sm" type="submit" onClick={this.addCarrier}>Add</button>; 
      elements.SignUp = <a href={carrier.signupUrl} target="_blank">SignUp</a>; 
      addObj.tableBody.push(elements)}) 

     /////////////Edit Carrier Component//////////// 
     this.state.responseCarrierList.map(carrier =>{ 
      var elements = {}; 
      elements.CarrierName = this.state.carrier.filter((carrierFilter) => carrierFilter.carrierNaicCd == carrier.CARRIER_NAIC_CD)[0].vendorNm + " - " + carrier.CARRIER_NAIC_CD;    
      elements.UserName = <input ref={user=> this.uname = user} type="text" id="uname" defaultValue = {carrier.USERNAME} readOnly className="c-form-field__input" data-id={carrier.CARRIER_NAIC_CD}/>; 
      elements.Password = <input ref={pass=> this.password = pass} type="password" id="pass" defaultValue = "******" readOnly className="c-form-field__input"/>; 
      elements.Action =<button className="c-btn c-btn--secondary c-btn--sm" type="submit" onClick={this.editCarrier} id="edit">edit</button>; 
      addObj.tableBody.push(elements) 
      }) 
     this.setState({tableContentAdd: addObj,tableContentEdit:editObj}); 
    } 

    addCarrier(event){ 
     const username=event.target.parentElement.parentElement.querySelector("#uname").value; 
     const password=event.target.parentElement.parentElement.querySelector("#pass").value; 
     const carrierName = event.target.parentElement.parentElement.childNodes[0].innerText 
     const naic = event.target.parentElement.parentElement.querySelector("#uname").getAttribute("data-id"); 
     if(username=="") 
      this.setState({error:"Username is required"}); 
     else{ 
      this.setState({error:""}); 
      const url = 'http://localhost:9001/carriers/carrierUpdate'; 
      axios.post(url,{ 
        producerNumber: this.state.producerNumber, 
        networkId: this.state.ntID, 
        userId:username, 
        password: password, 
        naicCode: naic 
        }).then(rsp => { 
        }); 
       } 
     } 

    editCarrier(event){ 
     switch(event.target.parentElement.parentElement.querySelector("#edit").innerText){ 
      case "edit": 
       event.target.parentElement.parentElement.querySelector("#uname").removeAttribute("readOnly") 
       event.target.parentElement.parentElement.querySelector("#pass").removeAttribute("readOnly") 
       event.target.parentElement.parentElement.querySelector("#edit").innerText = "add" 
       break; 

      case "add": 
       const username=event.target.parentElement.parentElement.querySelector("#uname").value; 
       const password=event.target.parentElement.parentElement.querySelector("#pass").value; 
       event.target.parentElement.parentElement.querySelector("#uname").setAttribute("readOnly",true) 
       event.target.parentElement.parentElement.querySelector("#pass").setAttribute("readOnly",true) 
       event.target.parentElement.parentElement.querySelector("#edit").innerText = "edit" 
       this.addCarrier(event) 
       break;    
     }   
    } 
    render(){ 
     return (
       <div className="carrierDashboard"> 
        <div className="add-carrier"> 
         {(this.state.agentName!=""?<h3 className="welcome-heading">Welcome {this.state.agentName} ({this.state.agentType})</h3>:<h3/>)} 
         {(this.state.error) ? <Alert type="alert">{this.state.error}</Alert> : <span></span>} 
         {(this.state.tableContentAdd["tableBody"]!=undefined)?<DataTable data={this.state.tableContentAdd} sortable={true} className="c-table--simple"/>:<Loader />} 
        </div>      
       </div> 
      ) 
    } 
} 

回答

0

我认为这是一个问题,因为国家这个this.getListCarrier();后得到了更新。如果我是对的,那么它必须反映在addCarrier()下次调用中的以前更改。

解决方法是使用回调setState(newState, callback)

getList(){ 
    let carrier={}; 
    let responseCarrierList={}; 
    var agentName,agentType,ntID,producerNumber; 
    const url = 'http://localhost:9001/carriers'; 
    axios.post(url,{ 
     ntId:"xxxxxx" 
    }) 
     .then(rsp => { 
      if(rsp!=undefined){ 
      agentName = rsp.data.agentDetails[0].agentName; 
      agentType = rsp.data.agentDetails[0].agentType; 
      ntID=rsp.data.agentDetails[0].NTID; 
      producerNumber=rsp.data.agentDetails[0].ProducerNumber; 
      carrier=rsp.data.carrier; 
      responseCarrierList=rsp.data.responseCarrierList; 
        this.setState({carrier:carrier,responseCarrierList:responseCarrierList,agentName: agentName, agentType: agentType,ntID:ntID,producerNumber:producerNumber},() => this.getListCarrier()); 
     } 
    }) 
} 

我希望它能帮助...!

+0

嗨感谢您的回复......我试着用上面的代码..但仍然没有发生按钮点击后重新呈现。 –

0

如果this.getListCarrier();取决于设置的完整状态,也许您可​​以将此调用移动到componentDidMount()。这种方式this.getListCarrier();只会在组件完全安装时触发。

getList(){ 
    let carrier={}; 
    let responseCarrierList={}; 
    var agentName,agentType,ntID,producerNumber; 

    const url = 'http://localhost:9001/carriers'; 
    axios.post(url,{ 
     ntId:"xxxxxx" 
    }) 
     .then(rsp => { 
      if(rsp!=undefined){ 
      agentName = rsp.data.agentDetails[0].agentName; 
      agentType = rsp.data.agentDetails[0].agentType; 
      ntID=rsp.data.agentDetails[0].NTID; 
      producerNumber=rsp.data.agentDetails[0].ProducerNumber; 
      carrier=rsp.data.carrier; 
      responseCarrierList=rsp.data.responseCarrierList; 
      this.setState({carrier:carrier,responseCarrierList:responseCarrierList,agentName: agentName, agentType: agentType,ntID:ntID,producerNumber:producerNumber}); 
     } 
    }) 

} 
componentWillMount(){ 
    this.getList(); 
} 
componentDidMount(){ 
    this.getListCarrier(); 
}