2017-02-19 73 views
2

我有一個輸入值列表,我需要使用從調度函數返回的信息填充... 我無法設置componentWillMount內部的狀態因爲我需要等待reducer將信息返回到狀態。從mapStateToProps()給出的Redux道具設置組件的本地狀態

內componentWillMount方法分派調用來獲取數據

componentWillMount() { 
     this.props.getData(this.props.params.id); 
} 

裏面componentWillReceiveProps方法我用的道具設置本地狀態返回數據 我把的setState()代碼此方法中,以確保被在connect()合併了本地道具內的數據後執行。 (任何更好的地方做嗎?)

componentWillReceiveProps(nextProps) { 
     if (nextProps.data) { 
      this.setState({ 
       contact: nextProps.data.contact, 
       number: nextProps.data.number, 
       date: nextProps.data.date, 
       payment: nextProps.data.payment, 
       fields: nextProps.data.fields 
      }); 
     } 
} 

然後我呈現給他們的狀態值

renderInputFields() { 
     if (this.state.fields) { 
      return this.state.fields.map(function(field, index) { 
       return (
        <div key={'line-' + index}> 

         <input key={'quantity-' + index} 
           type="text" 
           id={index} 
           name="quantity" 
           placeholder="Add quantity" 
           value={field.quantity} 
           onChange={this.onFieldChange} /> 

         <input key={'description-' + index} 
           type="text" 
           id={index} 
           name="description" 
           placeholder="Add description" 
           value={field.description} 
           onChange={this.onFieldChange} /> 

         <input key={'price-' + index} 
           type="text" 
           id={index} 
           name="price" 
           placeholder="Add price" 
           value={field.price} 
           onChange={this.onFieldChange} /> 
         <a onClick={this.onAddField}> 
          <i className="fa fa-times" aria-hidden="true"></i> 
         </a> 

        </div> 
       ) 
      }, this); 
     } 
    } 

const mapStateToProps = (state) => { 
    return { 
     data: state.data.selected 
    } 
} 

export default connect(mapStateToProps, { getData, updateDate, genData, deleteData })(DataEditor); 

現在的問題領域:

這是一個很好的做法,以獲得我需要的結果?

回答

2

使用Redux時,您應該默認使用無狀態組件。無論您是否使用redux,從props複製狀態都是反模式,但絕對不是您想要對redux執行的操作。

似乎無狀態的組件看起來效率低下 - 尤其是像你這樣的輸入字段。但事實並非如此。虛擬DOM將確保您的輸入字段中的擊鍵最終對DOM沒有影響(因爲它已經同步)。

此外,使用Redux時,通常不會從componentWillMount中啓動Ajax請求。通常情況下,您可以在適當的時間發送操作(應用程序啓動,或者如果您正在使用react-router和路由器的「輸入」事件)。

相關問題