2017-12-09 11 views
0

4つの行のゲームで、コンポーネントの配列を作成します。親コンポーネントから特定のコンポーネントのメソッドを呼び出す必要があります。refを含むコンポーネントの配列

フィールドを構築する2つの方法は次のとおりです。 renderRowで私は、コンストラクタで定義されている配列にrefを入れます。

renderRow(row){ 
    var Buttons = new Array(this.props.w) 
    for (var i = 0; i < this.props.w; i++) { 
    thisButton=<FieldButton ref={(r) => { this.refField['row'+ row +'col'+ i] = r; }} handler={this.actionFunction} key={'row'+ row +'col'+ i}></FieldButton> 
    Buttons.push(thisButton) 
    } 
    return Buttons 
} 

renderField(){ 
    var Field = new Array(this.props.h); 
    for (var i = 0; i < this.props.h; i++) { 
    var row = this.renderRow(i); 
    Field.push(<View key={i} style={styles.fieldWrap}>{row}</View>); 
    } 
    this.field = Field; 
} 

actionFunctionは単に現在のrefを出力します。

actionFunction(pos) { 
    console.log(this.refField['row'+ pos.row +'col'+ pos.col]) 
} 

問題:出力は未定義です。

編集: 私はreField変数をCONSOLE.LOG場合、これが出力されます: enter image description here

+1

ライン4: 'thisButton'はVAR thisButtonまたはconstのthisButtonように宣言する必要があります。これは単にタイプミスかもしれません。 –

+0

何も変更しませんでした。 – Colin

+0

オブジェクトrefFieldをthis.refField = {}のように初期化しました –

答えて

0

が実際にリアクトちょうどこの呼ばレフリーのための特別な性質を持っています!あなたは、実際にはオブジェクトへの参照の名前を設定し、this.refs.referenceNameを使用して、クラス内の任意の場所に、そのオブジェクトにアクセスすることができます

https://reactjs.org/docs/refs-and-the-dom.html

。オブジェクトに参照を設定するとき、プロパティ名は 'ref'(単数)であり、アクセスするときは 'this.refs'(複数)を使用することに注意してください。例えば :今

renderRow(row){ 
    var Buttons = new Array(this.props.w) 
    for (var i = 0; i < this.props.w; i++) { 
    const thisButton=<FieldButton ref={'row' + row + 'col' + i} handler={this.actionFunction} key={'row'+ row +'col'+ i}></FieldButton> 
    Buttons.push(thisButton) 
    } 
return Buttons 
} 

、あなたはactionFunctionからFieldButtonことを取得する必要がある場合:

actionFunction(pos) { 
    console.log(this.refs['row'+ pos.row +'col'+ pos.col]) 
} 

注:また、あなたの関数がクラスのインスタンスにバインドされていることを確認してください。

+0

これまでにやったことがありました。「Element refは文字列(add)で指定されましたが、所有者は設定されていませんでした。あなたは複数のコピーを持っているかもしれません。だから私は他の方法を使うことに決めました。 – Colin

+0

それでは、Reactの複数のコピーを読み込んでいますか?その問題を修正すると、この問題を解決できます。あなたの依存関係の1つは、Reactの複製コピーをロードすることですか?しかし、この問題を解決する必要があります。すべてが機能しているのは、反応のコピーが正しいデータを持っていて、他のコピー(コピー)がactionFunctionが呼び出されていないということだけです。あなたが複数の反作用のコピーを使用すると、このような多くのミステリーバグが発生する可能性があります。 –

0

解決策は、varの代わりにletを使用してforループの変数を初期化することでした。 ワーキングコード:

renderRow(row){ 
    var Buttons = new Array(this.props.w) 
    for (let i = 0; i < this.props.w; i++) { 
    let thisButton=<FieldButton ref={(r) => { this.refField['row'+ row +'col'+ i] = r; }} handler={this.actionFunction} key={'row'+ row +'col'+ i}></FieldButton> 
    Buttons.push(thisButton) 
    } 
    return Buttons 
} 

renderField(){ 
    var Field = new Array(this.props.h); 
    for (let i = 0; i < this.props.h; i++) { 
    let row = this.renderRow(i); 
    Field.push(<View key={i} style={styles.fieldWrap}>{row}</View>); 
    } 
    this.field = Field; 
} 
関連する問題