2017-10-27 12 views
0

私はAccordionコンポーネントを使用してコンテンツをレンダリングします。コンテンツでは私はSliderを使用しています。スライダーに機能を追加しようとしているので、バーのポイントをタップして値を選択することもできます。しかし、ステートレスなコンポーネント内ではrefを使うことができないので、スライダビューを外部から参照することはできません。ここで私がやろうとしているものです:ステートレスレスポンスネイティブ関数でコンポーネントを参照する

render() { 
    Return (
    <Accordion 
     sections={SECTIONS} 
     renderHeader={this.renderHeader} 
     renderContent={this.renderContent} 
    /> 
) 
} 

tapSliderHandler = (evt) => { 
    this.refs.slider.measure((fx, fy, width, height, px, py) => { 
    this.setState({value: (evt.nativeEvent.locationX - px)/width}); 
    }) 
} 

renderContent = (section, i, isActive) => { 
    return (
    <View ref="slider" style={styles.container}> 
     <TouchableWithoutFeedback onPressIn={this.tapSliderHandler}> 
      <Slider 
      value={this.props.appState[section.id]} 
      onValueChange={value => this.props.appState[section.id] = value} 
      /> 
     </TouchableWithoutFeedback> 
    </View> 
); 
} 

問題は、関数がステートレスであるため、私はtapSliderHandlerからREF =「スライダー」を参照することはできませんということです。どのようにこれを解決するための任意のアイデアですか?

ステートレス関数の代わりにクラスを使用してこれを達成する方法の答えが見つかりましたが、アコーディオンがコンテンツをレンダリングするための関数を期待しているときにこれを行う方法を理解できません。

タッピングコードは、hereから取られた例に従っています。

+0

私はあなたが何をしているのか理解していますが、問題は理解できません。あなたは上記のコードがどこで壊れているかをもっと明確にすることができますか? 「アコーデオンがコンテンツをレンダリングする機能を期待しているときに、これをどうやって行うのかわかりません」 'renderContent' propに関数を渡しているようです。それは私にはうまくいくようなので、何が欠けていますか? –

+0

申し訳ありませんが、私は明確ではありませんでした。 renderContentはステートレスな関数なので、 'ref'を定義する用途はありません。問題は、refを使用できないので、view(ref = "slider")をtapSliderHandler関数から参照する方法です。私は質問をより良くしようとします。 – Mikko

+0

Gotcha、この場合、前の答えを拡張して、要素にrefを渡すことでこれを解決できるはずだと思います... 'renderContent = {this.renderContent.bind(null、section、i 、isActive、elem) ' –

答えて

0

あなたの質問は「renderContent関数を呼び出して引数(セクション、私、isActive)を渡す方法は?それはあなたがそれをやる方法です。

<Accordion 
    sections={SECTIONS} 
    renderHeader={this.renderHeader} 
    renderContent={this.renderContent.bind(null, section, i, isActive)} 
/> 

しかし、私はそれがあなたが探している解決策ではありません。そうでない場合は、私のコメントを見て、あなたのコードがどこに分かれているのか理解してください。

関連する問題