React-navigatorを使用すると、次のようにエラーが発生します
このナビゲーターには、ナビゲーションとコンテナの両方の小道具があります。したがって、独自の状態を所有する必要があるかどうかは不明です。小道具を削除します: 'completedOrders、isLoading、hasError、getCompletedOrders'。ナビゲーターがナビゲーションプロップから状態を取得する必要がある場合。ナビゲーターが独自の状態を維持する必要がある場合は、ナビゲーション小道具を渡さないでください
この問題を解決する方法。 completeOrdersをTabnavigator(AdminCompletedOrdersTab)に渡したい。
以下は私のコードです
const AdminCompletedOrdersTab = TabNavigator({
completedOrdersTab: { screen: CompletedOrders },
rejectedOrdersTab: { screen: RejectedOrders },
cancelledOrdersTab: { screen: CancelledOrders }
});
class CompletedOrdersScreen extends Component {
static navigationOptions = {
title: "Completed Orders"
}
componentDidMount() {
this.props.getCompletedOrders(this.props.user);
}
render() {
return(
<AdminCompletedOrdersTab {...this.props}/>
)
}
}
const mapStateToProps = (state) => {
return ({
completedOrders: state.completedOrders.completedOrders,
isLoading: state.completedOrders.isLoading,
hasError: state.completedOrders.hasError
})
}
const mapDispatchToProps = (dispatch) => {
return ({
getCompletedOrders: bindActionCreators(getCompletedOrders, dispatch)
})
}
export default connect(mapStateToProps, mapDispatchToProps)(CompletedOrdersScreen);
回避策それに固執した人のために:このエラーを回避するには、mergeProps(react-redux接続の3番目のパラメーター)とscreenPropsを使用してください。
たとえば、このコードは次のようになります。
const AdminCompletedOrdersTab = TabNavigator({
completedOrdersTab: { screen: CompletedOrders },
rejectedOrdersTab: { screen: RejectedOrders },
cancelledOrdersTab: { screen: CancelledOrders }
});
class CompletedOrdersScreen extends Component {
static navigationOptions = {
title: "Completed Orders"
}
componentDidMount() {
this.props.screenProps.getCompletedOrders(this.props.user);
}
render() {
return(
<AdminCompletedOrdersTab
{...this.props}
{...{/* anything you need from screenProps */}}
/>
)
}
}
const mapStateToProps = (state) => {
return ({
completedOrders: state.completedOrders.completedOrders,
isLoading: state.completedOrders.isLoading,
hasError: state.completedOrders.hasError
})
}
const mapDispatchToProps = (dispatch) => {
return ({
getCompletedOrders: bindActionCreators(getCompletedOrders, dispatch)
})
}
const mergeProps = (state, dispatch, ownProps) => {
return ({
...ownProps,
screenProps: {
...ownProps.screenProps,
...state,
...dispatch,
}
})
}
export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(CompletedOrdersScreen);
追伸:mapDispatchToPropsで確認しませんでしたが、機能するはずだと思います。