reactjs - 如何解决 'this navigator has both navigation and container props'错误

标签 reactjs react-native react-redux react-navigation

使用react-navigator时,我收到错误提示

this navigator has both navigation and container props. so it is unclear if it should own its own state. Remove props :'completedOrders,isLoading,hasError,getCompletedOrders'. if the navigator should get its state from the navigation prop. If the navigator should maintain its own state, do not pass navigation props

如何解决这个问题?我想将 CompletedOrders 传递给 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 connect 的第三个参数)和 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);

P.S.:没有用mapDispatchToProps检查它,但认为它也应该有效。

关于reactjs - 如何解决 'this navigator has both navigation and container props'错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50589857/

相关文章:

ios - 如何构建 react native v0.45 项目到 ios 版本

javascript - 搜索引擎索引如何为 JavaScript Web 应用程序(如 REACT)工作?

javascript - React/Redux 使用选择器选择过滤和排序

javascript - 将数据流 react 到一个单独的组件文件中

ios - 通过 iPhone IOS 测试 React Native

reactjs - 从 MongoDB 检索相关元素

javascript - 在函数上切换背景颜色 - ReactJS

javascript - Next.js with Typescript : Invalid hook call. Hooks 只能在函数组件的主体内部调用

android - React Native - 位置 "absolute"在 Android 中不工作

react-native - 如何在原生 react 中制作像 TabBarIOS 这样的 Android 的标签栏?