2016-05-19 20 views
9

Używam komponentu react-data-grid. Zapewnia strukturę siatki z możliwością edycji i wiele więcej opcji. Po kliknięciu każdej komórki możemy edytować zawartość komórki. W moim projekcie mam sytuację taką jak przy ustawieniu kolumny daty Chcę powiązać interfejs użytkownika, w którym użytkownik może wybrać datę. Do tego użyłem komponentu react-datepicker. Jestem w stanie podać komponent reag-datepicker jako formatter w opcji kolumny daty. Mogę zmienić datę w komponencie datepicker, ale to nie aktualizuje wartości komórki (po kliknięciu na przycisk danych konsoli można zobaczyć zmiany zostały zaktualizowane lub nie). może aktualizować wartość komórki, gdy wybrana jest inna data w komponencie reag-datepicker. Dzieje się to automatycznie, gdy wartość zmieni się w innych komórkach.Używanie reaguj-datepicker w komponencie react-data-grid

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import ReactDataGrid from 'react-data-grid'; 
import DatePicker from 'react-datepicker'; 
import moment from 'moment'; 


//helper to generate a random date 
function randomDate(start, end) { 
    return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())).toLocaleDateString(); 
} 

//helper to create a fixed number of rows 
function createRows(numberOfRows){ 
    var _rows = []; 
    for (var i = 1; i < numberOfRows; i++) { 
    _rows.push({ 
     id: i, 
     task: 'Task ' + i, 
     startDate: randomDate(new Date(2015, 3, 1), new Date()) 
    }); 
    } 
    return _rows; 
} 

//function to retrieve a row for a given index 
var rowGetter = function(i){ 
    return _rows[i]; 
}; 

//renders react datepicker component 
var ExampleDate = React.createClass({ 
    displayName: 'Example', 

    getInitialState: function() { 
    return { 
     startDate:moment(this.props.value,"MM-DD-YYYY") 
    }; 
    }, 

    consoleDate:function(){ 
     console.log(this.state.startDate); 
    }, 

    handleChange: function(date) { 
    this.setState({ 
     startDate: date 
    }); 
    }, 

    render: function() { 
    return (
    <div> 
     <DatePicker selected={this.state.startDate} onChange={this.handleChange} /> 
    </div> 
    ); 

    } 
}); 

//Columns definition 
var columns = [ 
    { 
     key: 'id', 
     name: 'ID', 
     width: 80 
    }, 
    { 
     key: 'task', 
     name: 'Title', 
     editable : true, 
     width:100 
    }, 
    { 
     key: 'startDate', 
     name: 'Start Date', 
     editable : true, 
     formatter:<ExampleDate />, 
     width:100 
    } 
] 

var Example = React.createClass({ 

    getInitialState : function(){ 
    return {rows : createRows(5)} 
    }, 

    rowGetter : function(rowIdx){ 
    return this.state.rows[rowIdx] 
    }, 

    handleRowUpdated : function(e){ 
    //merge updated row with current row and rerender by setting state 
    var rows = this.state.rows; 
    Object.assign(rows[e.rowIdx], e.updated); 
    this.setState({rows:rows}); 
    }, 

    output:function(){ 
    console.log(this.state.rows); 
    }, 

    render:function(){ 
    return(
     <div> 
      <ReactDataGrid 
      enableCellSelect={true} 
      columns={columns} 
      rowGetter={this.rowGetter} 
      rowsCount={this.state.rows.length} 
      minHeight={200} 
      onRowUpdated={this.handleRowUpdated} /> 
      <button onClick={this.output} > Console data </button> 
     </div> 
    ) 
    } 

}); 

ReactDOM.render(<Example />, document.getElementById('container')); 
+0

Wystąpił błąd w przeglądarce "Uwaga: Wiersz:' klucz' nie jest podpisem. Próba dostępu do niego spowoduje zwrócenie 'niezdefiniowanej' .Jeśli potrzebujesz dostępu do ta sama wartość w komponencie potomnym, powinieneś przekazać ją jako inny rekwizyt. " –

Odpowiedz

2

Występują pewne problemy, gdy próbowałem odtworzyć. W każdym razie, po kilku zmianach I działa prawidłowo: - usunąłem losową datę, aby uniknąć „Nieprawidłowa data” - Naprawiłem formater takiego

formatter: ({value}) => <ExampleDate value={value} /> 

Wszystko działa dobrze, ale zawsze pojawia się ostrzeżenie, z powodu kluczowe podpórki twoich kolumn :(

+0

Czy możesz wysłać cały kod pl.i wypróbowałeś rozwiązania, które nie działało – codegeek

+0

Moja zła konsola.log pokazuje, że stan wiersza nie jest aktualizowany ed. Zgodnie z tym (https://github.com/adazzle/react-data-grid/blob/master/src/Cell.js#L122) jeśli używasz niestandardowego formatyzatora, nie możesz obsłużyć trybu edycji :( –

+0

czy jest jakiś sposób, żeby to osiągnąć? – codegeek

Powiązane problemy