简体   繁体   English

来自mapStateToProps的ReactJS + Redux道具不会在调度操作上刷新

[英]ReactJS + Redux props from mapStateToProps do not refresh on dispatching action

After dispatching action props do not changed. 调度动作后,道具不会改变。 My redux container: 我的redux容器:

class ConnectedAppContent extends React.Component {
    render() {
        return (
            <div id="content">
                <Router>
                    <Switch>
                        <PropsRoute path="/login" component={LoginForm} doLogin={this.props.doLogin} />
                        <PrivateRoute path="/scan" redirectTo="/login" component={Scanner} token={this.props.token} />
                        <PrivateRoute path="/result" redirectTo="/login" component={ParsedQRCode} token={this.props.token} />
                    </Switch>
                </Router>
            </div>
        );
    }
}

const mapStateToProps = state => {
    return {
        token: state.token,
        parsedQRCode: state.parsedQRCode
    }
}

const mapDispatchToProps = dispatch => ({
    doLogin: token => dispatch(doLogin(token))
});

export const AppContent = connect(mapStateToProps, mapDispatchToProps)(ConnectedAppContent);

And main App component, wrapped into Provider : 主要的App组件,包含在Provider

export class App extends React.Component {
    render() {
        return (
            <div className='container'>
                <AppHeader />
                <AppContent />
                <AppFooter />
            </div>
        );
    }
}

ReactDOM.render(
    <Provider store={store}>
        <App/>
    </Provider>,
    document.querySelector('.wrapper')
)

What I should do for props updating? 我应该做什么道具更新? Props are binded with initial state but do not refresh after doLogin . 道具与初始状态绑定,但在doLogin之后不刷新。

UPDATED 更新

My reducer: 我的减速机:

const initialState = {
    token: null
}

export const loginReducer = (state = initialState, action) => {
    switch (action.type) {
        case DO_LOGIN:
            return {...state, token: action.payload}
        default:
            return state;
    }
}

And doLogin action: doLogin行动:

export const doLogin = token => ({
    type: DO_LOGIN,
    payload: token
})

And PrivateRoute component (I got it from here ): PrivateRoute组件(我从这里得到它):

export const PrivateRoute = ({ component, redirectTo, ...rest }) => {
    // rest.token is undefined here, even after dispatching doLogin
    return (
        <Route {...rest} render={routeProps => {
            return !!rest.token ? (
                renderMergedProps(component, routeProps, rest)
            ) : (
                <Redirect to={{
                    pathname: redirectTo,
                    state: { from: routeProps.location }
                }}/>
            );
        }}/>
    );
};

And PropsRoute (also from here ): PropsRoute (也来自这里 ):

export const PropsRoute = ({ component, ...rest }) => {
    return (
        <Route {...rest} render={routeProps => {
            return renderMergedProps(component, routeProps, rest);
        }}/>
    );
}

Ah, caught the culprit: (It should be loginReducer's token) 啊,抓住了罪魁祸首:(应该是loginReducer的令牌)

const mapStateToProps = state => {
    return {
        token: state.loginReducer.token,

I assume that you are expecting the prop token value on the Scanner component that you are binding to routes, in which case React router does not pass props to childrens. 我假设您期望Scanner组件上的prop token值绑定到路由,在这种情况下,React路由器不会将props传递给子节点。

I would discourage you to pass props to routes and instead make all your routes components container components, but if for some reason you think this wont be an issue than one way of passing props to children in router is : 我不鼓励你把道具传递给路线,而是让你所有的路线组成容器组件,但如果由于某种原因你认为这不是一个问题,而不是路由器中的道具传递道具的一种方式是:

<PrivateRoute path="/scan" redirectTo="/login" component={() => <Scanner token={this.props.token}>}/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM