2017-09-25 13 views
0

次のコードがあります。 setText関数をMyClickerクラスに1回渡すと正常に動作します。したがって、以下のコードでは、「Second Text」というテキストが正しく表示されています。小道具として渡された関数に値を渡そうとしています

しかし、私はまた、孫のクラスにsetText関数を渡したいと思います。以下のテキスト「3rd Text」は決して表示されません。

ボタンは上手く表示されますが、クリックすると何も表示されません。コンソールにエラーメッセージが表示されず、setText()関数が呼び出されません。

は私がもともと持っていた:代わりに

<Voo setText={() => this.setText} /> 

<Voo setText={this.setText.bind(this)} /> 

が、次のエラーになった:エラーの原因を見た後

Warning: setState(...): Cannot update during an existing state transition

を、私が試しました上記のように矢印の関数を呼び出しますが、エラーはなく、setText関数は呼び出されません。

プークラス::

import MyClicker from './MyClicker' 
import Voo from './Voo' 

class Poo extends React.Component { 

    constructor() { 
     super(); 

     this.state = { 
      text: "Intro Text", 
     }; 

    } 

    setText(text){ 
     this.setState({ 
      text: text 
     }) 
    } 

    render(){ 
     return (
      <div> 
       <h2>{this.state.text}</h2> 
       <MyClicker handleClick={this.setText.bind(this, "Second Text")} text="Click for 2nd Text" /> 

       <Voo setText={() => this.setText} /> 
     ) 
    } 

} 

VOOクラス:

import MyClicker from './MyClicker' 
class Voo extends React.Component { 

    render(){ 
     <MyClicker handleClick={this.props.setText("Third Text")} text="Click for 3rd Text" /> 
    } 

} 

MyClickerクラス:

class MyClicker extends React.Component { 

    handleClick(){ 
     this.props.handleClick(); 
    } 


    render(){ 
     return (
      <div onClick={this.handleClick.bind(this)}>{this.props.text}</div> 
      ) 

    } 

} 

私は何をすることができます。ここ

は、私のコードの簡易版でありますこの問題を解決するレム?

+1

あなたのVooクラスでは、 'handleClick = {()=> this.props.setText(" Third Text ")}'にする必要があります。あなたがそうしたような使い方をすれば、単に小道具として渡すのではなく、その機能を実行させることになります。カッコは関数を実行します。 – bennygenel

+0

@bennygenelありがとうございました。それはうまくいった。それを答えとして自由に追加してください。 – kojow7

+2

2番目のエラーは、あなたが ' this.setText()} />'の代わりに ' this.setText} />'を書いたことでした。 '()=> this.setText()' - これの後にカッコが見付かりませんでした。setText' –

答えて

1

Vooクラスは​​小道具に小さな構文エラーがあります。

以下のようになります。

class Voo extends React.Component { 
    render(){ 
     <MyClicker handleClick={() => this.props.setText("Third Text")} text="Click for 3rd Text" /> 
    } 
} 

このように使用すると、機能が実行されるようになりました。ちょうど小道具として渡されるのではなく実行されます。括弧は関数を実行します。

0

このように関数をバインドすることができます。そして、setTextを以下のように渡してください。そして、これを渡し、必要なものを "自動的に"渡します。

()を使用すると、setStateが実行され、コンポーネントが再レンダリングされ、状態が再び実行されます。エンドレスループが作成されました。

setText = (text) => { 
    this.setState({ 
     text: text 
    }) 
} 

<Voo setText={this.setText} /> 
+0

これは間違いありませんが、この機能は現在の標準ではまだ完全には実装されていません。 – kojow7

+0

これはどの段階にあるのでしょうか?私はそれを見つけることができませんでした。 – Modig

関連する問題