私の中で反応させ、ネイティブモバイルアプリケーション、私が使用して私のユーザーを認証したいAWS Amplifyソフトウェア認証をして使用して、画面間のナビゲーションが管理するナビゲーションに反応します。私はすべてを「本によって」実装しようとしました。つまり、ドキュメントに従って、私のアプリは概念的に次のようになります。
// import statements skipped
class FirstTabScreen extends React.Component {
render = () => {
{/* access some data passed in screenProps */}
const someData = this.props.screenProps.someData;
{/* TODO: how to access AWS Amplify auth data here ?!? */}
{/* this.props contains screenProps and navigation objects */}
console.log("this.props: ", this.props);
{/* this.props.authState is undefined */}
console.log("this.props.authState: ", this.props.authState);
return <View><Text>First Tab - some data: {someData}</Text></View>
};
}
class SecondTabScreen extends React.Component {
render = () => {
const otherData = this.props.screenProps.otherData;
return <View><Text>Second Tab - other data: {otherData}</Text></View>
};
}
const AppNavigator = createBottomTabNavigator({
FirstTab: { screen: FirstTabScreen },
SecondTab: { screen: SecondTabScreen },
});
const AppContainer = createAppContainer(AppNavigator);
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
someData: null,
otherData: null,
};
}
componentDidMount = () => {
this.setState({ someData: 'some data', otherData: 'other data' });
};
render = () => {
return (
<Authenticator>
<AppContainer
screenProps={{
someData: this.state.someData,
otherData: this.state.otherData,
}}
/>
</Authenticator>
);
};
}
export default App;
上記のコードサンプルは、いくつかの重要な詳細をスキップしています。完全なエキスポスナックを作成しました。
AWS AmplifyAuthenticator
はアプリケーションをラップし、認証データを組み込みコンポーネントで利用できるようにしthis.props.authState
ます。ドキュメントを参照してください。
私の問題は、この認証データにアクセスする方法がわからないことです。たとえばFirstTabScreen
、次のようthis.props
にscreenProps
なりnavigation
ます。そのコンポーネントでは、containsとobjectsですが、this.props.authState
ですundefined
。とAppContainer
とAppNavigator
の間にAuthenticator
及び例えばFirstTabScreen
、私が小道具として認証データを渡すか、他の手段によってそれらを輸送する方法を見ていません。
さらに、すべてのデータをscreenProps
;のすべての組み込みコンポーネントに渡すだけです。これは機能しますが、すべての画面にすべてのデータが必要なわけではありません。実際に必要なデータのみを渡すにはどうすればよいですか?ルートにパラメーターを渡すことについては知っていますが、そこにあるすべてのコードサンプルには、ハンドラーでのButton
使用this.props.navigation.navigate(...)
がありonPress
ます。これらの画面にはボタンがなく、ボタンも必要ありません。結局のところ、別のタブに移動するのは、下部のタブナビゲーションバーのタブの目的ですか?!?
誰かが親切に私のためにこれにいくつかの光を当てることができますか?
使用screeProp
は推奨されていませんreact navigation v3
TabNavigatorなどのナビゲーションをコンポーネント内にネストすることはもはや推奨されていないと思います。V3でこのようなケースを適切に処理する方法がよくわかりません。最近、V1からV3にアップグレードしたかったのですが、ネストされたナビゲーターをどうするかについて十分な情報が見つからなかったため、アップグレードをあきらめました。
esipaviciusからの別のアイデア
タブナビゲーターを含むスタックナビゲーターに画面をラップしないでください。たぶん、あなたは使うことはできます
navigationAction
setState
かsetParams
とparams
し、navigator
キーを押します。あなたがdispatch
それをすることができるとき。また、ディスパッチした画面のパラメータを使用して、状態を自動的に変更します。
オプション1-SCREENPROPの使用
class App extends React.Component {
componentDidMount = () => {
this.setState({ someData: 'some data', otherData: 'other data' });
};
render = () => {
return (
<Authenticator>
<AppContainer
screenProps={{ myProp: "test" }}
/>
</Authenticator>
);
};
}
オプション2-REACTCONTEXTAPIの使用
コンテキストAPIを使用して、をラップします<AppContainer>
。
class App extends React.Component {
render = () => {
return (
<FormContext.Provider value={this.state}>
<AppContainer />
</FormContext.Provider>
);
};
}
次に、各画面でそれを消費します。
class FirstTabScreen extends React.Component {
render(){
return(
<FormContext.Consumer>
{ (context) => (
// your logic
)}
</FormContext.Consumer>
};
}
オプション3-タブナビゲーターオブジェクト
TabNavigatorObjectを渡すことができます
createBottomTabNavigator(RouteConfigs, BottomTabNavigatorConfig);
あなたは余分にオプション渡すことができますBottomTabNavigator
ではBottomTabNavigatorConfig
。
const BottomTabNavigator = StackNavigator(routesConfig, BottomTabNavigatorConfig)
BottomTabNavigatorConfigはオプションであり、APIドキュメントを確認できます
{ initialRouteName: 'Home', navigationOptions: .... }
オプション4-親からパラメータを取得する
githubの上で説明したとしてAPIドキュメントには、親コンポーネントを取得し、使用することができますgetParam
。
const parent = navigation.dangerouslyGetParent();
const yourParam = parent.getParam('yourParamName', 'default value')
githubのタブナビゲーターで小道具を渡すことについての多くの議論を見つけることができます
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加