【问题标题】:ReactJS + Redux props from mapStateToProps do not refresh on dispatching action来自 mapStateToProps 的 ReactJS + Redux 道具不会在调度动作时刷新
【发布时间】:2019-04-16 11:51:00
【问题描述】:

调度后的动作道具没有改变。我的 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);

还有主要的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')
)

道具更新应该怎么做? Props 与初始状态绑定,但在 doLogin 之后不刷新。

更新

我的减速机:

const initialState = {
    token: null
}

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

还有doLogin 操作:

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

还有PrivateRoute 组件(我从here 得到的):

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 }
                }}/>
            );
        }}/>
    );
};

还有PropsRoute(也来自here):

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

【问题讨论】:

  • 请出示doLogin函数和对应的reducer。
  • 请分享action的reducer,如果你更新token或者parsedQRCode,组件应该更新
  • @RyanC 请查看更新后的问题
  • @EdwinVargas 更新
  • 试试case DO_LOGIN: { console.log('will this appear?') }

标签: javascript reactjs redux react-redux


【解决方案1】:

啊,抓到了罪魁祸首:(应该是loginReducer的token)

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

【讨论】:

  • 当然!谢谢你很配
  • 很高兴为您提供帮助。
【解决方案2】:

我假设你期望你绑定到路由的 Scanner 组件上的 prop token 值,在这种情况下 React 路由器不会将 props 传递给孩子。

我不鼓励您将 props 传递给路由,而是将所有路由组件都设为容器组件,但如果出于某种原因您认为这不是问题,那么在路由器中将 props 传递给子级的一种方法是:

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

【讨论】:

  • 但令牌在我的PrivateRoute 组件中也未定义。我会在几分钟内将其添加到问题中
  • PrivateRoute 组件已添加到问题中
  • 我会尝试...如何发布?我以前从来没有这样做过
  • 感谢您提供有关将道具从Router 传递给儿童的有用信息
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 2019-09-28
  • 2018-02-21
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
相关资源
最近更新 更多