Files
JKVideo/utils/useSheetTransition.ts

43 lines
1.4 KiB
TypeScript
Raw Permalink Normal View History

import { useEffect, useRef, useState } from "react";
import { Animated } from "react-native";
/**
* Sheet "挂载 + 滑入 / 滑出 + 卸载"
*
*
* const { rendered, slideAnim } = useSheetTransition(visible, sheetH);
* if (!rendered) return null;
* <Animated.View style={{ transform: [{ translateY: slideAnim }] }}></Animated.View>
*
*
* - visible=true rendered=true "由下往上"
* - visible=false 240ms rendered false Modal
* - visible timing.start() finished=false
* rendered
*/
export function useSheetTransition(visible: boolean, sheetH: number) {
const [rendered, setRendered] = useState(visible);
const slideAnim = useRef(new Animated.Value(visible ? 0 : sheetH)).current;
useEffect(() => {
if (visible) {
setRendered(true);
Animated.timing(slideAnim, {
toValue: 0,
duration: 240,
useNativeDriver: true,
}).start();
} else {
Animated.timing(slideAnim, {
toValue: sheetH,
duration: 240,
useNativeDriver: true,
}).start(({ finished }) => {
if (finished) setRendered(false);
});
}
}, [visible, sheetH]);
return { rendered, slideAnim };
}