如何使用 react-native-popup-menu 在自定义渲染器组件中创建关闭动画?
How to create a close animation in a custom renderer component using react-native-popup-menu?
我正在使用 react-native-popup-menu
并创建了我自己的 renderer
组件。它是一个功能组件,所以简而言之它看起来像这样:
const ContextMenuRenderer = ({ children, layouts, ...otherProps }) => {
return (
<Animated.View
{...otherProps}
onLayout={handleViewLayout}
style={[styles.viewStyle, viewAnimations]}
>
{children}
</Animated.View>
);
}
viewAnimations
里面有开场动画,代码比较大但是可以在this snack.
中看到
docs 说“为了处理异步关闭动画,渲染器可以实现 close()
菜单关闭前调用的方法。关闭方法必须 return Promise
."
我阅读了 ContextMenu code,它是一个 class 组件并将 close()
实现为:
close() {
return new Promise(resolve => {
Animated.timing(this.state.scaleAnim, {
duration: CLOSE_ANIM_DURATION,
toValue: 0,
easing: Easing.in(Easing.cubic),
useNativeDriver: USE_NATIVE_DRIVER,
}).start(resolve);
});
}
我试图在我的函数组件中实现类似的东西,但代码没有执行。我认为这行不通,但我该怎么做才能在关闭时创建动画?我想做一个淡出动画。
function close() {
console.log('close'); // It isn't logged
return new Promise((resolve) => {
console.log('resolve close');
});
}
为了让您的渲染器开始关闭动画,RN 弹出方法通过 ref.
调用命令式方法 close
最安全的方法(就图书馆也使用和证明的而言)是使用 class 组件(正如您已经找到的那样)。
另一种选择可能是将挂钩 useImperativeHandle 与 forwardRef 一起使用。像
function FancyRenderer(props, ref) {
useImperativeHandle(ref, () => ({
close: () => {
return new Promise(...);
}
}));
return <View>;
}
FancyRenderer = forwardRef(FancyRenderer);
我记得我们正在尝试以某种方式检查我们是否可以首先获得 ref
,所以我不确定您是否会像在钩子之前编码的那样工作,我们从未尝试过那样。在这种情况下可能需要小的 PR。
我正在使用 react-native-popup-menu
并创建了我自己的 renderer
组件。它是一个功能组件,所以简而言之它看起来像这样:
const ContextMenuRenderer = ({ children, layouts, ...otherProps }) => {
return (
<Animated.View
{...otherProps}
onLayout={handleViewLayout}
style={[styles.viewStyle, viewAnimations]}
>
{children}
</Animated.View>
);
}
viewAnimations
里面有开场动画,代码比较大但是可以在this snack.
docs 说“为了处理异步关闭动画,渲染器可以实现 close()
菜单关闭前调用的方法。关闭方法必须 return Promise
."
我阅读了 ContextMenu code,它是一个 class 组件并将 close()
实现为:
close() {
return new Promise(resolve => {
Animated.timing(this.state.scaleAnim, {
duration: CLOSE_ANIM_DURATION,
toValue: 0,
easing: Easing.in(Easing.cubic),
useNativeDriver: USE_NATIVE_DRIVER,
}).start(resolve);
});
}
我试图在我的函数组件中实现类似的东西,但代码没有执行。我认为这行不通,但我该怎么做才能在关闭时创建动画?我想做一个淡出动画。
function close() {
console.log('close'); // It isn't logged
return new Promise((resolve) => {
console.log('resolve close');
});
}
为了让您的渲染器开始关闭动画,RN 弹出方法通过 ref.
调用命令式方法close
最安全的方法(就图书馆也使用和证明的而言)是使用 class 组件(正如您已经找到的那样)。
另一种选择可能是将挂钩 useImperativeHandle 与 forwardRef 一起使用。像
function FancyRenderer(props, ref) {
useImperativeHandle(ref, () => ({
close: () => {
return new Promise(...);
}
}));
return <View>;
}
FancyRenderer = forwardRef(FancyRenderer);
我记得我们正在尝试以某种方式检查我们是否可以首先获得 ref
,所以我不确定您是否会像在钩子之前编码的那样工作,我们从未尝试过那样。在这种情况下可能需要小的 PR。