2017-10-20 7 views
1

react-dndを使用してドラッグアンドドロップの小さな実装があります。 2つの列があり、右側の列から左側にドラッグすると、特定のステータス項目がアクティブになります。React.js - フロントエンドでArray.unshift()の配列を更新しない

ドロップ時に、pushCard()が呼び出されます(名前が示唆するように)、ドラッグされた項目を有効化されたステータスの配列、つまりstatus_dataにプッシュします。

しかし、問題はstatus_data.push(itemToPush)で、配列の最後に新しい項目をプッシュします。私は、配列の上にアイテムをプッシュする、つまり配列のインデックス0を挿入したかったのです。この場合

status_data.unshift(itemToPush)作品が、unshiftstateにし、バックエンドでの配列を更新しますが、それはフロントエンドに更新arrayが表示されません。むしろ最初にドラッグされたのと同じ要素を押し続けるだけです。

Simple description of problem in a GIF.

pushCard

pushCard(item) { 
    const { status_data } = this.state.template; 
    const itemToPush = { 
     title : item.title || 'CUSTOM', 
     type_id : item.type_id, 
     color : item.color || '#000', 
     type: item.type, 
     require_notes: item.require_notes || false, 
     require_estimate: item.require_estimate || false 
    }; 
    status_data.unshift(itemToPush); 
    this.setState(Object.assign(this.state.template, { status_data })); 
} 

renderActiveStatuses

renderActiveStatuses() { 
    let renderedResult = ''; 
    if (this.state.template.status_data.length < 0) { 
     renderedResult = (<p>No status active in this template.</p>); 
    } else { 
     renderedResult = this.state.template.status_data.map((status, i) => { 
     return (
      <Status deleteStatus={this.deleteStatus} handleStatusUpdate={this.onStatusUpdate} index={i} id={status.id} moveCard={this.moveCard} statusData={status} key={status.id} /> 
     ); 
     }); 
    } 
    return renderedResult; 
} 

renderActiveStatuses成分のrender関数で呼び出されます。

答えて

1

statusオブジェクトとなり、 itemToPushここに表示されているプロパティはidで、keyとして使用しているものはStatusです。あなたは代わりにkey={i}を試すことができます(マップインデックスを使用することが最良の考えではない場合でも)。

const itemToPush = { 
    id: Math.random().toString(36).substr(2, 16), 
    ... 
} 

をし、あなたが前に行ったように、今status.idを使用します。

あなたは、このような(おそらく)ユニークなIDを生成することができます。

これらの数百万を生成するリスクがある場合は、より良いIDジェネレータがあります。

+0

'key = {i}'を実行すると、 'react-dnd'が混乱します。各項目に固有の 'index'が必要です。 –

+0

'Status'の' id'も間違っています。 'status.title + status.type_id + i'のようなものを試すことができます。さもなければ、それらのためのランダムなIDを生成するあなたの状態項目のためのファクトリ、すなわちその型に与えられたこれらの項目の1つを返し、オブジェクトにIDを追加する関数が必要になります。 – JulienD

+0

IDジ​​ェネレータで更新されました。 – JulienD

1

この点についてはどうですか?あなたがあなたの質問に行ったように

this.setState({template: Object.assign({}, this.state.template, { status_data })}); 

オリジナルのものは変化しない一方で、あなただけの、あなたの状態にの内容を割り当てているので、あなたの状態は次のように、

state = { 
    template: {status_data: ...}, 
    status_data: ..., 
    ... 
} 
+0

あなたはおそらく 'あなたが状態を直接変更していないように' Object.assign({}、this.state.template、{status_data})したいと思うでしょう(https://reactjs.org/docs/state-and- lifecycle.html#do-not-modify-state-directly) –

+0

本当に、私は答えを更新しました。 – JulienD

+0

@JulienDありがとうございます。しかし、これは問題を解決しません:9 –

関連する問題