我正在开发一个 react native 应用程序并使用 React router native v4,并且我正在尝试开发动画部分,正如文档所建议的那样,首先我确保一切都可以在没有动画或过渡的情况下工作。
我已经迭代了实现,这就是我现在所得到的:
我的主要组件呈现以下内容:
// app.js:render
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
我的 routes.js 呈现以下内容(注意传递给 Switch 的 location 属性,以防止它在父组件之前更新其子组件):
// routes.js render
<ViewTransition pathname={location.pathname}>
<Switch location={location}>
<Route exact path={uri.views.main} component={Dashboard} />
<Route path={uri.views.login} component={Login} />
<Route path={uri.views.register} component={Register} />
</Switch>
</ViewTransition>
以及处理动画的 ViewTransition,现在它只是淡入/淡出旧视图和新视图:
// view-transition.js
@withRouter
export default class ViewTransition extends Component {
static propTypes = {
children: PropTypes.node,
location: PropTypes.object.isRequired,
};
state = {
prevChildren: null,
opacity: new Animated.Value(1)
};
componentWillUpdate(nextProps) {
if (nextProps.location !== this.props.location) {
this.setState({ prevChildren: this.props.children }, this.animateFadeIn);
}
}
animateFadeIn = () => {
Animated.timing(this.state.opacity, {
toValue: 0,
duration: 150
}).start(this.animateFadeOut);
};
animateFadeOut = () => {
this.setState({ prevChildren: null }, () => {
Animated.timing(this.state.opacity, {
toValue: 1,
duration: 400
}).start();
});
};
render() {
const { children } = this.props;
const { prevChildren, opacity } = this.state;
return (
<Animated.View
style={{
...StyleSheet.absoluteFillObject,
opacity,
position: "absolute"
}}
>
{prevChildren || children}
</Animated.View>
);
}
}
上面的代码正在工作,我可以看到旧视图淡出和新视图淡入,但是我有一个问题,当它开始淡出时,组件以某种方式重新安装,我希望在动画开始之前看到闪烁,我希望知道我的代码有什么问题。