如何在 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} />