javascript - 连接的属性仅更新一次,不会更新第二次

标签 javascript reactjs redux react-redux redux-form

我正在使用 redux-forms 来处理所有与表单相关的事情。但是 redux-form 和 connect 装饰器都不能很好地协同工作。当提交表单更改我的 redux 存储时,Connect 正在更新我的 showSpinner 属性。但是下次当 redux 存储发生变化时,我的连接属性不会更新。

代码如下:

组件.js

const formSubmit = (values, dispatch) => {
    dispatch(submitLogin(values));
}

const mapStateToProps = (state, ownProps) => {
  return {
    app: state.app,
  }
}

const mapDispatchToProps = (dispatch, ownProps) => {
  return {
        mockSubmit: values => {
            dispatch(submitLogin(values));
        }
  }
}

@connect(mapStateToProps, mapDispatchToProps)
@reduxForm({form: 'loginForm', validate, onSubmit: formSubmit})
class Login extends Component {

  constructor(props) {
    super(props);
  }

  render() {
    const fullWidth = true;
        const self = this;
    return (
      <div>
                <p>{self.props.app.showSpinner.toString()}</p>
                <CircularProgress size={80} thickness={5} style={{display: self.props.app.showSpinner ? "block" : "none"}} />
        <form onSubmit={this.props.handleSubmit}>
          <div className="card-box">
            <div className="head">
              <p>Login</p>
            </div>
            <div className="body">
              <Field name="phone" type="text" component="input" label="Mobile Number"/>
            </div>
          </div>
        </form>
        <Terms/>
      </div>
    )
  }

}
export default Login;

action.js

export function submitLogin(data){
  return dispatch => {
    dispatch(fetchLoginApi(data));
    fetchLogin(data) //a helper method to hit login api
      .then(res => {
        dispatch(verifiedUser(res));
      })
      .catch(err => console.log(err))
  }
}

function fetchLoginApi(data) {
  return{
    type: SUBMIT_LOGIN,
    data
  }
}

function verifiedUser(data) {
  return {
    type: VERIFIED_USER,
    data
  }
}

app.js//在组合 reducer 中,我将此 reducer 添加为应用程序

const initialState = {
  showSpinner: false,
  showAlert: false,
  showConfirm: false,
}

export function app(state = initialState, action) {
  switch(action.type) {

     case SUBMIT_LOGIN:
     return Object.assign(state, {
       showSpinner: true
     });
      break;

    case VERIFIED_USER:
      return Object.assign(state, {
        showSpinner: false
      });
      break;

    default:
      return state;
  }
}

我正在使用 thunk 中间件。所有导入都以正确的方式完成,没有语法错误,并且我使用注释来使用 connect 和 reduxForm 等 HOC 来装饰类。

最佳答案

您错误地实现了app reducer 。它会改变 state 对象,而不是创建一个新对象。

应该是

export function app(state = initialState, action) {
  switch(action.type) {

     case SUBMIT_LOGIN:
     return Object.assign({}, state, { // notice new object as the first arg
       showSpinner: true
     });

    case VERIFIED_USER:
      return Object.assign({}, state, {
        showSpinner: false
      });

    default:
      return state;
  }
}

关于javascript - 连接的属性仅更新一次,不会更新第二次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44774981/

相关文章:

javascript - 这是命名约定还是函数声明

javascript - 使用正则表达式从路径中提取文件名

javascript - react Redux 未捕获错误 : Expected the reducer to be a function

javascript - Redux store不随react状态的变化而变化

javascript - 我可以在 React + Redux 中使用 Props 设置初始状态吗?

javascript - 如何按类和该 div 中的类来定位/选择 div

javascript - 我可以不从渲染器的着色器访问预乘颜色吗

javascript - 当用户导航到其他页面时如何中止挂起的 jquery ajax 请求?

python - 帖子请求中禁止 (403) - django rest-react

nested - Redux 更新嵌套状态数组