2017-04-13 5 views
1

商品のリストがあり、この商品には異なる価格が含まれています。ユーザが製品を選択すると、彼はすべての価格を編集することができる。これは、次のようになります。データを送信してフォームの行を削除する適切な方法

_renderPriceRow() { 
    return (
    this.props.product.prices.map((price, i) => { 
     return (
     <tr key={'pricerowinput-' + Math.random()}> 
      <td > 
      <input type="text" className="form-control" defaultValue={price.quantity}/> 
      </td> 
      <td > 
      <input type="text" className="form-control" defaultValue={price.name}/> 
      </td> 
      <td > 
      <input type="text" className="form-control" defaultValue={price.price}/> 
      </td> 
      <td> 
      <button type="button" className="btn btn-sm" aria-label="Delete price" onClick={() => alert("Price deleted")}> 
       <span className="glyphicon glyphicon-trash" aria-hidden="true"></span> 
      </button> 
      </td> 
     </tr> 
    ); 
    }) 
); 
} 

彼らは他の製品を選択した場合は、デフォルト値が変更されません変更しないかのように行が再レンダリングますので、私は、行のキーをランダム化し。

小道具:

const mapStateToProps = (state) => { 
    const products = state.products.items; 
    const isEmpty = state.products.items === undefined || state.products.items.size === 0 || state.productSelected === null; 
    if(isEmpty) { 
    return ({product: null}); 
    } 
    return { 
    product: products.get(state.productSelected) 
    } 
}; 

ので、製品が製品の(フィルター)のリストがある店から取られています。

次のステップでは、実際には2つの質問があります。 1.行を追加または削除するにはどうすればよいですか? 2.テーブルの価格を配列に、他の商品フィールド(表示されていない)をディスパッチできるオブジェクトにどのように組み入れますか?

還元のため、すべてが単なる財産です。だからコンポーネントに取り込むのは簡単でした。どのようにそれらを得るには?

答えて

1

すべての値がReduxストアで保持されている場合は、そのストアを更新して値を追加および削除する必要があります。

あなたはあなたのテーブルの入力フィールドにonChangeハンドラを追加することができます。

updateFieldはあなたの店を更新するための減速をトリガーReduxのアクションをある
<input 
    type="text" 
    className="form-control" 
    defaultValue={price.quantity} 
    onChange={this.props.store.updateField} 
/> 

行全体を削除する場合は、そのエントリをストアから削除するボタンonClickの操作を開始します。どの行をイベントターゲットから削除するかを推測することができます。

+0

私はこれが当てはまると考えました。したがって、prodcut自体は500のマップにあり、格納されたオブジェクトは不変でなければなりません。それを更新する正しい方法は何ですか?その1つの製品だけをコピーする必要がありますか?それとも、すべてのアップデートですべての州のコピーを作成する大きな地図でそれを更新する必要がありますか? –

+0

私にはまた、ユーザーが保存をヒットしたときに実際に商品を保管したいと思うのは、店舗を更新しているように見えます。 –

+0

あなたのレデューサーは、ストア内のオブジェクトの不変性を保つために、常に新しい状態(たとえば、Object.assign({}、oldState、updatedState)を返す必要があります。実際にデータを保存する時期は、この表に関連して概要がどのように構成されているかによって異なります。概要で 'shouldComponentUpdate'を使用して' dataSaved'フラグがある場合にのみ店舗から新しいデータを表示したり、新しいデータを実際にマップにマージするために 'onSave'アクションを使用します。 –

関連する問題