2017-03-17 16 views
0

fixed-data-table-2(npm)の実装を作成しています。編集ボタンでセルを入力に変更します。編集して保存(投稿)することができます。私は(状態の)配列全体を更新していますので、React - セルの内部状態の配列のハンドルの変更

enter image description here

しかし、大きな問題があります... は、それはあまりにも、onChangeがセルにトリガーされることをひとつひとつの時間をタイピングを遅いです。

イベントハンドラ(表)

import reactUpdate from "react/lib/update"; 
onChangeEditableCell(field, rowIndex, newValue) { 
    const data = reactUpdate(this.state.data, {[rowIndex]: {[field]: {$set: newValue}}}) 
    this.setState({data : data}); 
} 

イベントハンドラ(セル)

onChange(e) { 
    e.preventDefault(); 
    const newValue = e.target.value; 
    this.props.onHandleInput(this.props.field, this.props.rowIndex, newValue); 
} 

render() { 
    const {rowIndex, field, data, editMode, onHandleInput, ...props} = this.props; 

    return (
     <Cell {...props}> 
      {editMode ? <input onChange={this.onChange} className="text-cell-edit" type="text" value={this.getCell()} /> : data[rowIndex][field]} 
     </Cell> 
    ); 
} 

これは明らかに悪い考えです...どうやって達成することができます同じだけど性能面では?

onHandleInput(セルの小道具)onChangeEditableCell(テーブルの機能)である

PS

ユーザーがSave

に当たったとき、私は、オブジェクト全体を投稿する data配列が必要
+0

「編集モード」で状態を直接変更するのではなく、状態のコピーを変更しないでください。ユーザーが「保存」をクリックしたときに、または2つの状態を深くマージしますか? –

+0

状態の外に変数を作成するのは良い方法ですか?そのような場合、私はそれを行う方法を検索するつもりです。それは良いアイデアのようです。 –

+0

私は100%確信していませんが、状態への変更をストリーミングし、すべてのキーストロークで不必要なコンポーネントの再レンダリングを強制するのは過度の(そして "危険な")ようです。 –

答えて

1

私がこのような状況で行うことは、セルがそれぞれのキー押しで更新される独自の状態になることです。その後、入力がフォーカスを失った後に起動するonblurイベントでテーブルレベルの状態を更新します。

個人的な意見は、私の意見では、州を上に引き上げるという一般的な慣行には良い例外です。

+0

これは良いアプローチだと思われますが、ちょっとハッキリ感じます。 –

+0

さて、私はそれを試して、それはかなりうまくいきます。誰かがより良いアイデアを持って来るかどうかを私は待つつもりです。しかし、これはうまくいきます。 –

0

タイムアウトを追加してください:

onChange(e) { 
    e.preventDefault(); 
    const newValue = e.target.value; 
    if (this.timeout) { 
    clearTimeout(this.timeout); 
    this.timeout = 0; 
    } 
    this.timeout = setTimeout(()=> { 
    this.props.onHandleInput(this.props.field, this.props.rowIndex, newValue); 
    }, 1000); 

} 
関連する問題