13

我的具体目标是使用 ScrollView 的ScrollTo 方法,但保持功能组件结构。

更一般地说,这需要获取当前组件的 ref,而裸 react native 是不可能的

2016 年 12 月,recompose添加了Allows handlers 属性 withHandlers 成为工厂函数,但我不太清楚如何正确使用它。

如何在 Recompose 中使用 withHandlers 将 refs 添加到功能组件并在 ScrollView 上调用 ScrollTo?

4

3 回答 3

21

你可以尝试这样的事情:

/* ... */

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)
于 2017-08-18T03:42:10.827 回答
5

就个人而言,我更喜欢将 Ref 作为道具启动

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

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

const MyComponent = ({ ref }) => <Foo ref={ref} />
于 2018-10-10T13:21:47.820 回答
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);
于 2018-07-22T17:23:19.020 回答