React Native Navigatorコンポーネント内に作成されたreact-reduxコンテナーコンポーネントがあります。ナビゲータをこのコンテナコンポーネントに小道具として渡し、プレゼンテーションコンポーネント内でボタンを押した後、ナビゲータスタックにオブジェクトをプッシュできるようにします。
私は、react-reduxコンテナコンポーネントが提供する定型コードをすべて手書きで書く必要なしにこれを実行したいと思います(また、react-reduxがここで提供するすべての最適化もお見逃しなく)。
コンテナコンポーネントコードの例:
const mapStateToProps = (state) => {
return {
prop1: state.prop1,
prop2: state.prop2
}
}
const mapDispatchToProps = (dispatch) => {
return {
onSearchPressed: (e) => {
dispatch(submitSearch(navigator)) // This is where I want to use the injected navigator
}
}
}
const SearchViewContainer = connect(
mapStateToProps,
mapDispatchToProps
)(SearchView)
export default SearchViewContainer
そして、ナビゲーターのrenderScene
関数内から次のようなコンポーネントを呼び出したいと思います。
<SearchViewContainer navigator={navigator}/>
上記のコンテナコードでは、mapDispatchToProps
関数内からこの渡されたpropにアクセスできる必要があります。
Redux状態オブジェクトにナビゲーターを保存するのは面倒ではなく、小道具をプレゼンテーションコンポーネントに渡したくありません。
このコンテナコンポーネントに小道具を渡す方法はありますか?あるいは、私が見落としている代替アプローチはありますか?
ありがとう。
mapStateToProps
とmapDispatchToProps
は、両方ともownProps
を2番目の引数として取ります。
[mapStateToProps(state, [ownProps]): stateProps] (Function):
[mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function):
参照 の場合
mapStateToProps(state, ownProps)
に2番目の引数を渡すと、mapStateToPropsのコンポーネントに渡された小道具にアクセスできます。
TypeScriptでこれを行う場合、いくつかの落とし穴がありますので、例を示します。
1つの落とし穴は、dispatchToPropsのみを使用し(状態プロパティをマッピングしない)、状態パラメーターを省略しないことが重要です(アンダースコアプレフィックスで名前を付けることができます)。
別の落とし穴は、ownPropsパラメーターを、渡された小道具のみを含むインターフェイスを使用して入力する必要があることです。これは、小道具インターフェイスを2つのインターフェイスに分割することで実現できます。
interface MyComponentOwnProps {
value: number;
}
interface MyComponentConnectedProps {
someAction: (x: number) => void;
}
export class MyComponent extends React.Component<
MyComponentOwnProps & MyComponentConnectedProps
> {
....// component logic
}
const mapStateToProps = (
_state: AppState,
ownProps: MyComponentOwnProps,
) => ({
value: ownProps.value,
});
const mapDispatchToProps = {
someAction,
};
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);
コンポーネントは、単一のパラメーターを渡すことで宣言できます。
<MyComponent value={event} />
デコレータを使用している場合、以下のコードは、redux接続にデコレータを使用する場合の例を示しています。
@connect(
(state, ownProps) => {
return {
Foo: ownProps.Foo,
}
}
)
export default class Bar extends React.Component {
this.props.Foo
をチェックすると、Bar
コンポーネントが使用された場所から追加された小道具が表示されます。
<Bar Foo={'Baz'} />
この場合、this.props.Foo
は文字列「Baz」になります
これがいくつかのことを明らかにすることを願っています。