私は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から取られた例に従っています。
私はあなたが何をしているのか理解していますが、問題は理解できません。あなたは上記のコードがどこで壊れているかをもっと明確にすることができますか? 「アコーデオンがコンテンツをレンダリングする機能を期待しているときに、これをどうやって行うのかわかりません」 'renderContent' propに関数を渡しているようです。それは私にはうまくいくようなので、何が欠けていますか? –
申し訳ありませんが、私は明確ではありませんでした。 renderContentはステートレスな関数なので、 'ref'を定義する用途はありません。問題は、refを使用できないので、view(ref = "slider")をtapSliderHandler関数から参照する方法です。私は質問をより良くしようとします。 – Mikko
Gotcha、この場合、前の答えを拡張して、要素にrefを渡すことでこれを解決できるはずだと思います... 'renderContent = {this.renderContent.bind(null、section、i 、isActive、elem) ' –