How do you add refs to functional components using withHandlers in Recompose and call ScrollTo on a ScrollView?

后端 未结 3 869
囚心锁ツ
囚心锁ツ 2021-02-13 21:12

My specific goal is to use the ScrollTo method of a ScrollView but maintain functional component structure.

More generally this requires getting ref to the current compo

相关标签:
3条回答
  • 2021-02-13 22:04

    You can try something like this:

    /* ... */
    
    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)
    
    0 讨论(0)
  • 2021-02-13 22:14

    Another way is to make a class as a ref store:

    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);
    
    0 讨论(0)
  • 2021-02-13 22:19

    Personally I prefer to initiate Ref as a prop

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

    And then just pass it to your stateless component

    const MyComponent = ({ ref }) => <Foo ref={ref} />
    
    0 讨论(0)
提交回复
热议问题