2016-09-22 6 views
8

私はonsenuiを使ってリストを作って反応しています。 しかし、私はonchangedからバインドを呼び出すことはできません。未定義のプロパティ 'bind'を読み取ることができません。 React.js

私は理解できませんでした....誰でもこれを解決できますか?

これは私のコードです。 私はhandlechangedメソッドを入力項目から呼び出したいと思います。 しかし、undefinedのプロパティ 'bind'を読み込めません。

export default class MainPage extends React.Component { 
 

 

 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
     selectedValue: "myself", 
 
     destinations: ["myself","somebody"], 
 
     }; 
 
    } 
 

 

 
    handleChange(value) { 
 
    this.setState({selectedValue: value}); 
 
    } 
 

 
    renderRadioRow(row) { 
 
    return (
 
     <ListItem key={row} tappable> 
 
     <label className='left'> 
 
      <Input 
 
      inputId={`radio-${row}`} 
 
      checked={row === this.selectedValue} 
 
      onChange={this.handleChange.bind(this, row)} 
 
      type='radio' 
 
      /> 
 
     </label> 
 
     <label htmlFor={`radio-${row}`} className='center'> 
 
      {row} 
 
     </label> 
 
     </ListItem> 
 
    ) 
 
    } 
 

 
    render() { 
 
    return (
 
     <Page renderToolbar={this.renderToolbar}> 
 
     <p style={{textAlign: 'center'}}> 
 
      test 
 
     </p> 
 

 
     <List 
 
      dataSource={this.state.destinations} 
 
      renderRow={this.renderRadioRow} 
 
     /> 
 
     </Page> 
 
    ); 
 
    } 
 
}

+0

スタックスニペット(使用した '<> 'ツールバーボタン)は** runnable **の例です。あなたの例は実行可能ではないので、コードブロック( '{}'ツールバーボタン)になければなりません。 Stack SnippetsはReactJSをサポートしているので、*実行可能にする方が良いでしょう。 –

+0

renderRadioRow関数は、 'this'がonChange = {this.handleChange.bind(this、row)}のバインディングに使用される新しいContextを作成します。 –

+0

「未定義のXを読むことができません」という標準的な答えがありますか?私はこれらの質問を見続けており、その理由の99%は容易に明白です。エラーメッセージにはすべてが必要です。 'undefined 'になる変数からXにアクセスしています。提案された行動綱領 - なぜそれを防止し、Xにアクセスしないかを調べる。あなたのニーズにマッチする。残りの質問は、サードパーティの図書館で同じことが起こっていることです。その場合、通常は正しく使用しないという問題があります。提案された行動方針 - あなたが誤って構成したか、それを誤解しているかどうかを調べる。 – vlaz

答えて

9

https://facebook.github.io/react/docs/reusable-components.html#no-autobinding

ませ自動バインド

方法は、彼らが自動的にインスタンスにこれを結合しないことを意味し、通常のES6クラスと同じセマンティクスに従ってください。あなたは明示的に私たちはあなたが結合することをお勧めします

<div onClick={() => this.tick()}> 

をあなたはthis

<div onClick={this.tick.bind(this)}> 

を維持するためにバインド()を使用するかは

矢印の機能を使用することができます .bind(this)または矢印機能 =>:

を使用する必要がありますコンストラクタ内のイベントハンドラはすべてのインスタンスに対して一度だけバインドされます。

constructor(props) { 
    super(props); 
    this.state = {count: props.initialCount}; 
    this.tick = this.tick.bind(this); 
} 
それはコンストラクタで一度結合していたとして

今、あなたは直接this.tickを使用することができます。

それはすでにコンストラクタ

<div onClick={this.tick}>

これは、アプリケーションのパフォーマンスのために優れているにバインドされている場合は特に、あなた子コンポーネント内の浅い比較でshouldComponentUpdate()を実装します。

export default class MainPage extends React.Component { 
 

 

 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
     selectedValue: "myself", 
 
     destinations: ["myself","somebody"], 
 
     }; 
 
     this.renderRadioRow = this.renderRadioRow.bind(this); 
 
    } 
 

 

 
    handleChange(value) { 
 
    this.setState({selectedValue: value}); 
 
    } 
 

 
    renderRadioRow(row) { 
 
    return (
 
     <ListItem key={row} tappable> 
 
     <label className='left'> 
 
      <Input 
 
      inputId={`radio-${row}`} 
 
      checked={row === this.selectedValue} 
 
      onChange={() => { 
 
       this.handleChange(row); 
 
      } 
 
      type='radio' 
 
      /> 
 
     </label> 
 
     <label htmlFor={`radio-${row}`} className='center'> 
 
      {row} 
 
     </label> 
 
     </ListItem> 
 
    ) 
 
    } 
 

 
    render() { 
 
    return (
 
     <Page renderToolbar={this.renderToolbar}> 
 
     <p style={{textAlign: 'center'}}> 
 
      test 
 
     </p> 
 

 
     <List 
 
      dataSource={this.state.destinations} 
 
      renderRow={this.renderRadioRow} 
 
     /> 
 
     </Page> 
 
    ); 
 
    } 
 
}

+0

この関数を行の値で呼び出す必要がありますが、この関数にいくつかの値を入れることはできますか? –

+0

次に、矢印機能を使用してください 'onChange = {()=> handleChange(row)}' – Lottamus

+0

'()=> handleChange(行)'と '()=> this.handleChange(行)'を試しました。しかし、両方とも未定義のhandleChangeエラーを発生させました... –

0

私は、行に渡された値が分からいけない、しかし、あなたはその機能とバインドを呼び出すためにレンダリングコンテキストを渡す必要があります。

export default class MainPage extends React.Component { 


    constructor(props) { 
     super(props); 
     this.state = { 
      selectedValue: "myself", 
      destinations: ["myself","somebody"], 
     }; 
    } 


    handleChange(value) { 
     this.setState({selectedValue: value}); 
    } 

    renderRadioRow(row,renderContext) { 
     return (
      <ListItem key={row} tappable> 
       <label className='left'> 
        <Input 
         inputId={`radio-${row}`} 
         checked={row === this.selectedValue} 
         onChange={this.handleChange.bind(renderContext, row)} 
         type='radio' 
        /> 
       </label> 
       <label htmlFor={`radio-${row}`} className='center'> 
        {row} 
       </label> 
      </ListItem> 
     ) 
    } 

    render() { 
     var renderContext=this; 
     return (
      <Page renderToolbar={this.renderToolbar}> 
       <p style={{textAlign: 'center'}}> 
        test 
       </p> 

       <List 
        dataSource={this.state.destinations} 
        renderRow={() => this.renderRadioRow(row,renderContext)} 
       /> 
      </Page> 
     ); 
    } 
} 
関連する問題