いくつかのアニメーションを持つ自分のリアクションルータを試してみる。レンガの壁にぶつけてください。状態を失うことなくインスタンスのリストをレンダリングする方法/コンポーネントを再作成しますか?
私はスクリーンのスタックをレンダリングしています。
スタックをポップまたはプッシュできます。
私の問題は、スタックが変更されたときに状態が失われ、コンストラクタが以前の状態を破壊して(スタックが役に立たなくなる)ということです。 どうすればいいですか?
画面
render() {
return (<View
{...this.props}
onLayout={(event) => this.onLayout(event)}
pointerEvents={this.state.isAnimating ? 'none' : undefined}
>
{ this.renderStackOfScreens() }
</View>);
};
renderStackOfScreens() {
// Render screens.
return this.state.stackOfScreens
.map((eachScreen, index) => {
// Render second last screen IF animating. Basically because we have a screen animating over the top.
if (index === this.state.stackOfScreens.length - 2 && this.state.isAnimating) {
return (
<Animated.View
key={eachScreen.props.screenId + '_parent'}
style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }}>
{ eachScreen }
</Animated.View>
);
}
// Render last screen which is animated.
if (index === this.state.stackOfScreens.length - 1) {
return (
<Animated.View
key={eachScreen.props.screenId + '_parent'}
style={this.getOffset(this.state.animatedScreenOffset)}>
{ eachScreen }
</Animated.View>
);
}
})
// Remove the undefined values.
.filter((eachScreen) => !!eachScreen);
}
ここ https://pastebin.com/BbazipKtを完全な例を見ることができますレンダリング画面(この後、私たちがオン状態であるスタックにプッシュ)
/**
* Create a new React.Element as a screen and pass props.
*/
createNewScreen = (screenName: string, props: ?any = {}): any => {
// Props is not an object.
if (typeof props !== 'object') {
Logger.error(`Passed props to screen name ${screenName} wasn't an object or undefined. Will error next screens.`);
return;
}
let propsUnlocked = JSON.parse(JSON.stringify(props));
// Add unique screen it.
const uniqueScreenKey = this.generateRandomUniqueID();
propsUnlocked.key = uniqueScreenKey;
propsUnlocked.screenId = uniqueScreenKey;
propsUnlocked.navKing = this;
propsUnlocked.screenName = screenName;
// Find the original screen to copy from.
// This just copies the 'type'
// $FlowFixMe
return React.createElement(this.findScreenNameComponent(screenName).type, propsUnlocked);
}
を作成します。
画面の種類は合格ですユニークな子供たちの中でエド。
各画面はコンポーネントの「タイプ」ですが、どのようにレンダリングしますか? 私のコード例をここにプッシュしました: https:// pastebin。com/BbazipKt –
また、前の画面をすべてレンダリングするとパフォーマンスが低下しますか? (私はモバイルheheでこれをやっています) –
@OliverDixonそれはちょうど擬似コードであり、必ずしもすべての画面をレンダリングする必要はありません。 ReactCSSTransitionGroupを見て、コンポーネントのマウント/アンマウントをアニメーション化する良い方法を探してください。このタイプの場合、コンポーネント「タイプ」を各スクリーンの状態オブジェクトのプロパティとして保持し、それを使用してどのタイプのコンポーネントをレンダリングするかを決定することができます。 – jered