如何在Recompose中使用withHandlers向函数组件添加refs并在ScrollView上调用ScrollTo?

时间:2017-08-14 16:01:13

标签: javascript react-native recompose

我的具体目标是使用ScrollView的ScrollTo method,但维护功能组件结构。

更一般地说,这需要引用isn't possible with naked react native

的当前组件

2016年12月重新组合添加了Allows handlers property of withHandlers to be a factory function,但我无法弄清楚如何正确使用它。

如何在Recompose中使用withHandlers向函数组件添加refs并在ScrollView上调用ScrollTo?

3 个答案:

答案 0 :(得分:19)

您可以尝试这样的事情:

/* ... */

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)

答案 1 :(得分:3)

我个人更喜欢以ref作为道具

  withProps(() => ({
    ref: React.createRef(),
  })),

然后将其传递给您的无状态组件

const MyComponent = ({ ref }) => <Foo ref={ref} />

答案 2 :(得分:1)

另一种方法是将一个类作为参考存储:

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);