ScrollTo undefined в анимированном ScrollView
При использовании Animated.createAnimatedComponent(ScrollView)
для создания анимированного ScrollView
более не возможно использовать scrollTo
.
const AnimatedScrollView = Animated.createAnimatedComponent(ScrollView);
<AnimatedScrollView ref={(ref) => this.list = ref}>
<View style={{height: 1000}} />
</AnimatedScrollView>
Вызов this.list.scrollTo({x: 0, y: 0})
дает следующую ошибку:
_this.list.scrollTo is not a function
Он отлично работает на обычном ScrollView. Есть ли способ решить это?
Ответы
Ответ 1
Ответ @max23_ может пока работать, но это не правильный способ - как правило, мы никогда не должны обращаться к закрытым переменным напрямую, так как они часто подвержены изменениям. (редактировать: неуважение :-))
Благодаря этому запросу на извлечение новый и перспективный способ получения ref
на завернутый компонент заключается в использовании служебного метода getNode()
, поскольку доступ к закрытым переменным (с добавлением _
) небезопасен от будущих изменений API.
Итак, новый способ сделать это
ref={c => (this.myRef = c)}
а затем при вызове метода, делая
this.myRef.getNode().scrollTo({
y: 0,
animated: true,
});
:-)
Ответ 2
Попробуйте это, чтобы получить возврат компонента от метода Animated.createAnimatedComponent
:
ref={(ref) => this.list = ref._component}
Тогда вызов this.list.scrollTo({x: 0, y: 0})
должен работать.
Ответ 3
Основываясь на ответе @jhm - новый, рекомендуемый способ создания ссылки на компонент, поскольку в React 16.3 используется React.createRef()
, как упомянуто @cyqui.
С обычным (примечание: не анимированным) компонентом мы просто создали бы ссылку на ScrollView
рекомендуемым способом:
scrollView = React.createRef();
<ScrollView
ref={this.scrollView}>
и использование статических методов как таковых:
this.scrollView.current.scrollTo({x: number, y: number, animated: true|false})
Однако при работе с компонентом Animated
мы переходим к прямой манипуляции, которая требует от нас получить собственный узел компонента перед вызовом любых статических методов. Поэтому вы получите следующее:
scrollView = React.createRef();
<Animated.ScrollView
ref={this.scrollView}>
this.scrollView.current.getNode().scrollTo({x: number, y: number, animated: true|false})
Ответ 4
Просто добавив еще один ответ, так как оба решения "getNode" и "_component" не спомогли мне. Я использую реагировать родной 0,57. Успейте заставить это работать, используя scrollToOffset
componentDidMount() {
this.refs.listRef.scrollToOffset({ offset: 0, animated: false })
}
render() {
return (
<FlatList ref="listRef" ... />
}
};
Ответ 5
Если RN> = 0,59 (возможно, раньше) и следующая настройка Ref:
const ScrollViewX = Animated.createAnimatedComponent(ScrollView);
_scrollView = React.createRef();
<ScrollViewX
ref={this._scrollView}>
Вы можете вручную прокрутить анимированный компонент следующим образом:
this._scrollView.current._component.scrollTo({x: number, y: number, animated: true|false})
(ScrollToOffset устарел и, вероятно, удален в 0.6)