Я исследую ловушку, которая генерирует компонент-оболочку, чтобы уменьшить шаблон добавления анимации в мое приложение, поддерживающее реакцию. Я уже написал хук, который возвращает анимированные значения и заботится об их внутреннем управлении, он отлично работает. Однако каждый раз, когда я использую его, мне приходится писать шаблон применения анимированных значений следующим образом:
//pseudocode
const [animatedValue, animationRef, ...otherUsefuLStuff] = useMyGenericAnimationHook(...some animation config)
return (
<Animated.View style={{transform: [{translateY: animatedValue}]}}>
.....
</Animated.View>
)
Это не имеет большого значения, но все же это какой-то шаблон, который я должен использовать для каждого анимация. Я думал, могу ли я вернуть компонент-оболочку из моего анимационного крючка, чтобы абстрагироваться от этого шаблона, что-то вроде следующего
//pseudocode
const [AnimatedTranslateY, animatedValue, animationRef, ...otherUsefulStuff] = useMyGenericAnimationHook(... some animation config)
return (
<AnimatedTranslateY>.....</AnimatedTranslateY>
)
Это выглядит чище, но возврат нового типа компонента из хука определенно вызывает проблему . React будет разбирать и перестраивать дочерние элементы на каждом рендере, потому что каждый раз, когда запускается useMyAnimationHook (), он будет возвращать новый тип компонента!
//pseudocode
const useMyGenericAnimationHook= (....configuration arguments) => {
const animatedValueRef = ....create the animated value(s) ref(s)
const WrapperView: React.FC<ViewProps> = useMemo(
() =>
React.memo(({ children, style, ...restProps }) => (
<Animated.View {...restProps}
style={[style, { transform: ...apply animated value(s)}]}>
{children}
</Animated.View>
)),
[animatedValueRef.current]
)
return [WrapperView, animationHandle, otherUsefulStuff]
}
Вот здесь я несколько запутался. Я думаю, что это должно работать нормально, а не перестраивать дерево на каждом рендере. Тип компонента должен оставаться стабильным, если зависимости, данные для useMemo, не изменятся, и в этот момент мы все равно хотим, чтобы он отображался. Однако я не совсем уверен в этом.
Какова будет реакция при использовании <WrapperView>
?
Есть ли причина, по которой это не лучший шаблон?
Спасибо за понимание!