2015-09-24 8 views
6

Ho il seguente reagiscono componente che recupera i dati Ajax sul caricamento della pagina iniziale, in questo modo:rerender Reagire componente con il nuovo parametro di query AJAX Valori

var MyTable = React.createClass({ 

    getInitialState: function() { 
     return { 
      rows: [ 
       ['Something, ' '], 
       ['Something else', ' ']    ] 
     }; 
    }, 

    componentDidMount: function() { 
     var self = this; 
     $.get('http://domain.com/api/Orders/from-date/' + fromDate + '/to-date/' + toDate, 
      function(result) { 
       var newState = React.addons.update(this.state, { 
        rows: { 
         0: { 
          1: { $set: result } 
         } 
        } 
       }); 
       this.setState(newState);    
      }.bind(this) 
     ); 
    }, 

    render: function() { 
     return (

      <Table 
       rowHeight={50} 
       rowGetter={(rowIndex) => { 
        return this.state.rows[rowIndex]; 
       }} 
       rowsCount={this.state.rows.length} 
       onRowClick={this._onRowClick} 
       width={1000} 
       height={342} 
       groupHeaderHeight={40} 
       headerHeight={0}> 
       <ColumnGroup label="Products" 
          fixed={true}> 
        <Column label="" 
          width={col1} 
          dataKey={0} /> 
        <Column label="" 
          width={700} 
          dataKey={1} /> 
       </ColumnGroup> 
      </Table> 

     ); 
    } 
}); 
MyTable = React.createFactory(MyTable) 
React.render(MyTable(), 
    document.getElementById('my-table-container') 
); 

Il mio problema è che non riesco a rerender componente quando la data è cambiato da datepicker quindi il parametro data Ajax cambia e deve essere fatta un'altra richiesta con questi nuovi valori.

Quello che ho provato:

$(function(){ 
    $("#calculate-orders").on("click",function(){ 
     fromDate = document.getElementById("from-date").value; 
     toDate = document.getElementById("to-date").value; 

     React.render(MyTable(), 
      document.getElementById('my-table-container') 
     ); 

    }) 
}) 

Ma nulla sembra accadere. Come posso risolvere questo? E può essere fatto solo con JavaScript/jsx, senza la necessità di flusso e, soprattutto, senza node.js?

Ps. Sto usando FixedDataTable in questo esempio.

+0

Non puoi semplicemente legare il DatePicker al tuo componente usando un parametro di evento, in questo modo ogni volta che l'evento viene ricevuto lo stato degli aggiornamenti dei componenti, che wi Il tuo componente sarà nuovamente sottoposto a rendering. –

+0

Sfortunatamente, non penso che funzionerà? Per quanto ho capito, funzionerebbe solo se ci fosse una relazione genitore-figlio? https://facebook.github.io/react/tips/communicate-between-components.html - ma in questo caso ho creato un'applicazione in MVC e come ho avuto modo di conoscere reagire, l'ho usata sempre di più per diversi sezioni, tuttavia i selettori di date (da/a data) e select dropdown (lingua) non sono componenti di reazione del genitore - sono semplicemente markup html. :/ – Dac0d3r

+0

Stavo pensando che un componente ascolti un evento, che il datapicker attivi un evento che il componente sta ascoltando, quindi non c'è bisogno di componenti figlio genitore. https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events –

risposta

4

La risposta era come Furqan Zafar ha detto (grazie uomo).

Per implementare il metodo del ciclo di vita componentWillReceiveProps con la stessa logica e passare le nuove proprietà.

$.get('http://domain.com/api/Orders/from-date/' + nextProps.fromDate + '/to-date/' + nextProps.toDate, 
      function(result) { 
       var newState = React.addons.update(this.state, { 
        rows: { 
         0: { 
          1: { $set: result } 
         } 
        } 
       }); 
       this.setState(newState);    
      }.bind(this) 
     ); 

Ho avuto un piccolo problema con esso ottenere TypeError: Impossibile aggiungere contesto proprietà, oggetto non è estensibile - ma che era perché ho inizialmente avevo creato il componente con JavaScript e stavo rerendering in JSX. Ha bisogno di essere lo stesso .. ad esempio:

Se ho fatto questo inizialmente:

MyTable = React.createFactory(MyTable) 

Allora questo non avrebbe funzionato a rerender:

React.render(
    <MyTable fromDate={fromDate} toDate="{toDate}"/>, 
    document.getElementById('my-table-container') 
); 

ma questo sarebbe:

React.render(
    MyTable(
     { 
      'fromDate': fromDate, 
      'toDate': toDate 
     }), document.getElementById('my-table-container') 
    ); 
Problemi correlati