2017-12-12 3 views
2

現在選択されている行の状態をstateに保持するデータテーブルにmaterial-ui controlled tableの例を使用するコンポーネントがあります。これは正常に動作しており、反応開発ツールで状態が正しく更新されているのがわかります。ただし、updatePickが呼び出されると、this.state.selectedは更新された値を返しません。デベロッパーツールのコンポーネント状態の更新は、後でthis.stateを呼び出すときではない

constructor(props) { 
    super(props); 
    this.state = { 
     selected: [], 
    } 
    } 

    isSelected = (index) => { 
    return this.state.selected.indexOf(index) !== -1; 
    } 

    handleRowSelection = (selectedRows) => { 
    this.setState({ 
     selected: selectedRows, 
    }) 
    } 


    updatePick =() => { 
    console.log(this.state.selected); //Shows [] 
    console.log(this.state.selected[0]); //undefined 
    this.props.updateTodaysPick(this.props.players[this.state.selected[0]]); 
    } 

は、開発ツールに反応 を選択することが私の状態を示しています[1]

私が研究し、ので、ここで私は除外することができますカップルの事ですしてきました。

  1. これを機能に結びつけても役に立ちませんでした。私の理解は、矢印関数を使うことはこれの必要性を否定するということです。
  2. 私はsetStateが同期的に起こらないことを知っています。 UpdatePickメソッドは直後に起動されていませんが、状態を更新するのに十分な時間があったため、別々に切り替える必要があります。

ここに私の機能をレンダリング

render() { 

    var players = this.props.players.slice(0, 40).map((player, index) => { 
      return (
      <TableRow key={index} selected={this.isSelected(index)}> 
       <TableRowColumn></TableRowColumn> 
       <TableRowColumn>{player.first_name} {player.last_name}</TableRowColumn> 
       <TableRowColumn>{player.team}</TableRowColumn> 
      </TableRow> 
     ) 
     } 
    ) 

    return (
     <div> 
     <div className="submit"><RaisedButton label="Update Player" secondary={true} onClick={this.updatePick} /></div> 
     <Table onRowSelection={this.handleRowSelection} preScanRows={false} fixedHeader={true}> 
      <TableHeader> 
      <TableRow> 
       <TableHeaderColumn>ID</TableHeaderColumn> 
       <TableHeaderColumn>Name</TableHeaderColumn> 
       <TableHeaderColumn>Status</TableHeaderColumn> 
      </TableRow> 
      </TableHeader> 
      <TableBody> 
      {players} 
      </TableBody> 
     </Table> 
     </div> 
    ); 
    } 

これはstackoverflowの上の私の最初の質問ですだ - うまくいけば、それは嗅ぎ次第です。


EDIT:これは、テーブルコンポーネントがフォーカスを失ったとき(送信ボタンをクリックする)行を選択解除するマテリアルUI設定です。これは、テーブルの小道具で設定できます。

答えて

0

Material UI Tableの既定の動作のために問題が発生しました。

お客様のTableは、<RaisedButton/>clickedのたびにblurringです。

この結果、行が選択されていないthis.handleRowSelection()が呼び出され、this.state.selectionがクリアされます。 this.updatePick()を呼び出すことではなくonClickよりもonMouseDownを使用します:

<div className="submit"><RaisedButton label="Update Player" secondary={true} onMouseDown={this.updatePick} /></div> 

blurを防ぐためにeventのparamに火preventDefault()、その後に必ず:blurringからあなたTableを防止するために

// Update Pick. 
updatePick = (event) => { 

    // Prevent Table from blurring. 
    event.preventDefault() 

    // Update Todays Pick. 
    this.props.updateTodaysPick(this.props.players[this.state.selected[0]]) 
} 
+0

真、しかし、私はDBを誰かを選択するたびにヒットしたくない、私は彼らが閲覧することができるようにしたい、彼らの好きな場合は、選択を変更することができますし、それを提出する。 –

+0

この[Material UI doc ref](http://www.material-ui.com/#/components/table)に基づいて、私はあなたの送信ボタン['blurs'](https:// developer.mozilla.org/en-US/docs/Web/Events/blur)を開き、 'this.state.selection'をクリアします。解決策はテーブルを「ぼかす」ことではありません。そのトリックは 'onClick'ではなく' onMouseDown'と 'preventDefault()'を使うことです。私はこれを実証するために私の答えを改訂しました。 –

+0

ああ、私はより良い解決策を見いだしましたが、ぼかし効果があります。 material-ui tableBodyは、この振る舞いを切り替える小道具を受け入れます。 ありがとうございました! –

関連する問題