2016-11-23 15 views
0

私は非常に単純な反応のアプリケーションを起動して実行しようとしています。コンポーネント間の通信との反応

ユースケースは簡単です: アカウント名の配列を取得し、値が変更されると(ユーザーが値を選択しました) - アカウントを表示するfireイベントです。

ここでは、showAccountメソッドがAppの状態にアクセスできるようにするためのコードスニペットを示します。

showAccount()からAppの状態にアクセスするにはどうすればよいですか?

import React, { Component } from 'react'; 
import injectTapEventPlugin from 'react-tap-event-plugin'; 

import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; 
import AutoComplete from 'material-ui/AutoComplete'; 


// Needed for onTouchTap 
// http://stackoverflow.com/a/34015469/988941 
injectTapEventPlugin(); 

import './App.css'; 


class App extends Component { 
    constructor() { 
    super(); 
    this.state = {accounts: []} 
    } 

    componentDidMount() { 
    this.setState({ accounts: [ 
     {account_name: "foo", account_id: 1}, 
     {account_name: "bar", account_id: 2} 
    ]}) 
    } 

    showAccount (value) { 
    // HERE IS THE PROBLEM! 
    // `this` points to AutoComplete rather than to App 
    console.log(this.state.accounts) 
    } 

    render() { 
    return (  
     <MuiThemeProvider> 
     <div className="App"> 
     <center> 
     <AutoComplete 
      floatingLabelText="account name" 
      filter={AutoComplete.caseInsensitiveFilter} 
      dataSource={this.state.accounts.map((account) => account.account_name)} 
      onUpdateInput={this.showAccount} 
     /></center> 
     </div> 
     </MuiThemeProvider> 
    ); 
    } 
} 

export default App; 
+3

{this.showAccount.bind(this)} –

+0

@AMacdonaldありがとう!! 私はそれを投票できるように答えとして設定しますか? –

+0

yay - ちょうどそれを –

答えて

3

showAccountメソッドをバインドしてもよろしいですか?

このコードをチェックすると、バインド方法の例がありますが、showAccountメソッドでも同じことを行う必要があります。

class InputExample extends React.Component { 
    constructor(props) { 
    super(props); 

    this.state = { text: '' }; 
    this.change = this.change.bind(this); 
    } 

    change(ev) { 
    this.setState({ text: ev.target.value }); 
    } 

    render() { 
    let { text } = this.state; 
    return (<input type="text" value={text} onChange={this.change} />); 
    } 
} 

はECMAScriptの2015年のクラスでは、手動メソッドをバインドする必要があります。私は私が仕事でだから、より多くを拡大するための時間を持っていますが、この記事をチェックし

http://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/ ません

は、サンプル・コードは、そのポストからであるECMAScriptの2015クラスのセクション をチェック

よろしくアプリケーションスコープに

+1

@ TzuryバーYochayこれは、操作を行うためのcorect方法です - コンストラクタでバインドする必要がありますレンダリングメソッドではないそうでなければ、ビューがレンダリングされるたびにバインディングでパフォーマンスヒットを受け取ります – Jordan

+0

ありがとう - それは良いリンクと良い学習だ:) –

1

バインドお電話を:

{this.showAccount.bind(this)}

は動作します。

関連する問題