当前位置: 首页 > 知识库问答 >
问题:

Redux连接元件在减速器状态改变时不重新显示

严瀚昂
2023-03-14

这是我的减速器代码

const authReducer = (
  state = {
    isAuthenticated: !AuthService.isTokenExpired(),
    isFetching: false,
    profile: AuthService.getProfile(),
    error: null
  },
  action
) => {

  switch (action.type) {    
   case types.LOGOUT_SUCCESS:
   return Object.assign({}, state, {
      isAuthenticated: false,
      isFetching: false,
      profile: {},
      error: null
    })
    default:
      return state;
  }
export default combineReducers({
    apiDataReducer,
    auth: authReducer
});
  import rootReducer from './reducers/combineReducers';
    import reduxImmutableStateInvariant from 'redux-immutable-state-invariant';
    imp

ort thunk from 'redux-thunk';

const middleware = process.env.NODE_ENV !== 'production' ?  [reduxImmutableStateInvariant(), thunk] :  [thunk];

export let store = createStore(rootReducer, applyMiddleware(...middleware));

render(
  <Provider store={store}>
    <Router>
      <App />
    </Router>
  </Provider>,
  document.getElementById('root')
);
  import React, { Component } from 'react';

    import { connect } from 'react-redux';
    import { withRouter } from 'react-router-dom';
    import * as authActions from '../../actions/basicActions';
    import HeaderView from './HeaderView';
    //import authReducer from './reducers/authReducer';


    const mapStateToProps = ({ auth }) => ({
      auth
      });

      const mapDispatchToProps = dispatch => ({
        loginRequest: () => dispatch(authActions.loginRequest()),
        logoutSuccess: () => dispatch(authActions.logoutSuccess())
      });

      export default withRouter(
        connect(mapStateToProps, mapDispatchToProps)(HeaderView)
      );
  handleLogoutClick = () => {
    this.props.logoutSuccess();
    this.props.history.push({ pathname: '/' });
  };

  render() {

    const { auth } = this.props;
    return (
      <div>
        {auth.isAuthenticated ? (
          <div>
            <div>
              <table>
                <tbody>

                      <label>
                        <aonClick={this.handleLogoutClick}> Log Out </a>
                      </label>
                    </td>
                  </tr>
                </tbody>
              </table>
            </div>
            <nav className="navbar navbar-default">
              <ul className="nav navbar-nav">
                <li key="1" id="1" onClick={this.handleClick}><Link to={'/page2'}>page2</Link></li>
              </ul>
            </nav>
          </div>
        ) : (
            <label className="Note">
              logged in{' '} <a onClick={this.handleLoginClick}> Log In </a>
              {' '} to continue.
                </label>
          )}
      </div>
    );
  }

这是我的容器组件,其中reducer auth中的状态变化没有反映SomeContainer.js

const mapStateToProps = ({ auth }) => ({
  auth
  });

  const mapDispatchToProps = dispatch => ({
  });

  export default connect(mapStateToProps, mapDispatchToProps)(SomeContainer);

当在HeaderView.js中单击LOGOUTSUCCESS操作时,会调用LOGOUTSUCCESS操作,并且reducer'auth'更改了object中“is authenticated”的值,但该更改不会调用连接容器的“map stateToProps”函数,即使在注销之后,reducer'auth'的值也是相同的,即true。

共有1个答案

冉德元
2023-03-14

因为当从父组件发生道具更改时,子组件不会重新呈现。您可以将connectHoC视为HeaderView组件的父级。有关重新呈现条件的更多信息,请检查此问题。

您需要使用ComponentWillReceiveProps更改状态。在HeaderView.js文件中:

constructor(props) {
      super(props);
      this.state = {
         isAuthenticated = false
      }
}

componentWillReceiveProps(nextProps) {
     if(nextProps.auth.isAuthenticated !== this.props.auth.isAuthenticated) {
        this.setState({isAuthenticated: nextProps.auth.isAuthenticated});
     }
}

handleLogoutClick = () => {
    this.props.logoutSuccess();
    this.props.history.push({ pathname: '/' });
  };

render() {

    const { isAuthenticated } = this.state;
    return (
      <div>
        {isAuthenticated ? (
          <div>
            <div>
              <table>
                <tbody>

                      <label>
                        <aonClick={this.handleLogoutClick}> Log Out </a>
                      </label>
                    </td>
                  </tr>
                </tbody>
              </table>
            </div>
            <nav className="navbar navbar-default">
              <ul className="nav navbar-nav">
                <li key="1" id="1" onClick={this.handleClick}><Link to={'/page2'}>page2</Link></li>
              </ul>
            </nav>
          </div>
        ) : (
            <label className="Note">
              logged in{' '} <a onClick={this.handleLoginClick}> Log In </a>
              {' '} to continue.
                </label>
          )}
      </div>
    );
  }
 类似资料:
  • 我正在尝试使用React Redux。我遇到了这样一种情况:一个连接的组件(Coordinates.jsx)嵌套在另一个连接的组件(Canvas.jsx)中。 源代码https://github.com/RinatRezyapov/Vault-13.git(纱线安装,然后纱线开始) 在父组件画布中。jsx I在componentDidMount()中调度一个操作,该操作不可变地更改状态。 帆布js

  • 问题内容: 我要说的是今天要学习react和redux,但是我不知道如何在状态更改后强制组件重新渲染。 这是我的代码: 我可以触发更新的唯一方法是使用 在构造函数内部,以便我手动触发组件的更新状态以强制重新渲染。 但是如何链接存储状态和组件状态? 问题答案: 仅当组件的状态或道具发生更改时,组件才会重新渲染。您不是依靠this.state或this.props,而是直接在render函数中获取存储

  • 本文向大家介绍AngularJS改变元素显示状态,包括了AngularJS改变元素显示状态的使用技巧和注意事项,需要的朋友参考一下 前言 本文描述使用AngularJS提供的ng-show和ng-hide指令实现自动监听某布尔型变量来改变元素显示状态。 控制html元素显示和隐藏有n种方法:html的hidden、css的display、jQuery的hide()和show()、bootstrap

  • 我有一个基于url的react组件,它应该导入一些数据,然后在另一个子组件中显示。当页面首次加载时,它将初始数据作为组件状态加载到中。至于进一步的url更改,它们将在export default class Info()中处理。组成部分{ 我的问题是,尽管switch语句中有状态更新,但组件不会重新渲染。我不知道我的方法有什么问题。有人能帮我吗?谢谢 编辑:这是使用而不是的代码:

  • 我有一个组件连接到我的商店。该组件发送操作并正确更改状态(请参阅日志)。但我的组件应该显示此状态更改。但它不会重播。 下面是我的代码: 最后,我的组件希望在状态更改后更新state和rerender: 这样您就可以看到状态正确地改变了。但在此之后,我希望组件再次呈现(控制台和文本标记中的“rendering...”显示true而不是false) 我看不出有什么错误。你能帮帮我吗?

  • 状态保存在MyPayments组件中(它是本地状态--尽管您可以看到连接的组件,但我几乎不使用Redux)。 它具有以下结构: 数组作为道具传递给子组件(连接的)-您可以在上面的屏幕截图中看到它。我认为连接的组件将它进一步传递到组件。但是...