如何在 Recompose 中使用 withHandlers 向功能组件添加引用并在 ScrollView 上调用 ScrollTo?
How do you add refs to functional components using withHandlers in Recompose and call ScrollTo on a ScrollView?
我的具体目标是使用 ScrollView 的 ScrollTo method 但保持功能组件结构。
更一般地说,这需要获取对 isn't possible with naked react native.
当前组件的引用
2016 年 12 月 recompose 添加了 Allows handlers property of withHandlers to be a factory function 但我不太清楚如何正确使用它。
如何在 Recompose 中使用 withHandlers 向功能组件添加引用并在 ScrollView 上调用 ScrollTo?
您可以尝试这样的操作:
/* ... */
const MyView = ({ onRef, children }) => (
<View>
<ScrollView ref={onRef} /* ... */>
{children}
</ScrollView>
</View>
)
export default compose(
withHandlers(() => {
let myScroll = null;
return {
onRef: () => (ref) => (myScroll = ref),
scrollTo: () => (value) => myScroll.scrollTo(value)
}
},
lifecycle({
componentDidMount() {
this.props.scrollTo({ x: 0, y: 100, animated: true })
}
})
)(MyView)
另一种方法是将 class 作为 ref 存储:
const Stateless = ({ refs }) => (
<div>
<Foo ref={r => refs.store('myFoo', r)} />
<div onClick={() => refs.myFoo.doSomeStuff()}>
doSomeStuff
</div>
</div>
)
class RefsStore {
store(name, value) {
this[name] = value;
}
}
const enhancer = compose(
withProps({ refs: new RefsStore() }),
)(Stateless);
我个人更喜欢将 Ref 作为 prop 启动
withProps(() => ({
ref: React.createRef(),
})),
然后将其传递给您的无状态组件
const MyComponent = ({ ref }) => <Foo ref={ref} />
我的具体目标是使用 ScrollView 的 ScrollTo method 但保持功能组件结构。
更一般地说,这需要获取对 isn't possible with naked react native.
当前组件的引用2016 年 12 月 recompose 添加了 Allows handlers property of withHandlers to be a factory function 但我不太清楚如何正确使用它。
如何在 Recompose 中使用 withHandlers 向功能组件添加引用并在 ScrollView 上调用 ScrollTo?
您可以尝试这样的操作:
/* ... */
const MyView = ({ onRef, children }) => (
<View>
<ScrollView ref={onRef} /* ... */>
{children}
</ScrollView>
</View>
)
export default compose(
withHandlers(() => {
let myScroll = null;
return {
onRef: () => (ref) => (myScroll = ref),
scrollTo: () => (value) => myScroll.scrollTo(value)
}
},
lifecycle({
componentDidMount() {
this.props.scrollTo({ x: 0, y: 100, animated: true })
}
})
)(MyView)
另一种方法是将 class 作为 ref 存储:
const Stateless = ({ refs }) => (
<div>
<Foo ref={r => refs.store('myFoo', r)} />
<div onClick={() => refs.myFoo.doSomeStuff()}>
doSomeStuff
</div>
</div>
)
class RefsStore {
store(name, value) {
this[name] = value;
}
}
const enhancer = compose(
withProps({ refs: new RefsStore() }),
)(Stateless);
我个人更喜欢将 Ref 作为 prop 启动
withProps(() => ({
ref: React.createRef(),
})),
然后将其传递给您的无状态组件
const MyComponent = ({ ref }) => <Foo ref={ref} />