简体   繁体   English

分配默认道具时状态不会通过redux更改

[英]State does not change via redux when default props is assigned

I'm using redux in my react project. 我在我的React项目中使用redux。 I set initial state in my reducer 我在我的减速器中设置了初始状态

const initialState = {
  isWarning: false,
};

and I have default props in my react component 我的React组件中有默认道具

LoginView.defaultProps = {
  warning: false,
};

and of course I'm destructuring my props in render method 当然,我正在用render方法破坏我的道具

const { warning } = this.props;

here you have code from my component 这里你有我组件的代码

import React, { Component } from 'react';
import styled from 'styled-components';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import axios from '../../axios';
import Input from '../Input/Input';
import LoggedIn from '../LoggedIn/LoggedIn';
import * as actions from '../../store/actions';

const StyledWrapper = styled.div`
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
`;

const StyledTitle = styled.p`
  color: #727272;
  margin: 89px 0 73px 0;
  font-size: 24px;
`;

const StyledButton = styled.button`
  border: none;
  border-radius: 6px;
  background: #1de278;
  height: 48px;
  width: 397px;
  color: #fff;
  font-size: 18px;
  cursor: pointer;

  &:active,
  &:focus {
    outline: none;
  }
`;

class LoginView extends Component {
  state = {
  email: '',
  password: '',
};

onType = event => {
  this.setState({ [event.target.id]: event.target.value });
};

onSubmit = (email, password) => {
  axios
    .post('api/v1/session', {
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
      },
      email,
      password,
    })
    // eslint-disable-next-line react/destructuring-assignment
    .then(() => this.props.history.push('/'))
    .catch(() => this.props.onLoginError(true));
};

render() {
  const { email, password } = this.state;
  const { warning } = this.props;
  return (
    <StyledWrapper>
      {console.log(warning)}
      <StyledTitle>Log in</StyledTitle>
      <Input id="email" placeholderText="Email address" 
          setInputValue={this.onType} />
      <Input
        id="password"
        placeholderText="Password"
        setInputValue={this.onType}
        type="password"
      />
      <LoggedIn />
      <StyledButton onClick={() => this.onSubmit(email, 
        password)}>Login</StyledButton>
    </StyledWrapper>
  );
}
}

const mapStateToProps = state => {
  return { isWarning: state.login.isWarning };
};

const mapDispatchToProps = dispatch => {
  return {
    onLoginError: state => dispatch(actions.setErrorLogin(state)),
  };
};

LoginView.propTypes = {
  warning: PropTypes.bool,
};

LoginView.defaultProps = {
  warning: false,
};

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

Redux dev tools shows my updated state from false to true, but my warning have false value. Redux开发人员工具将我的更新状态从“假”更改为“真”,但是我的警告具有假值。 In my opinion it's something with default props. 我认为这是带有默认道具的东西。 Do you have any ideas what could be a problem? 您有什么想法可能是个问题吗?

The problem is here: 问题在这里:

const mapStateToProps = state => {
  return { isWarning: state.login.isWarning };
};

it's supposed to be 应该是

const mapStateToProps = state => {
  return { warning: state.login.isWarning };
};

Because the component can't find a warning prop it sets it to the default value, so you have to give it the same name. 由于该组件找不到warning道具,因此将其设置为默认值,因此必须给它起相同的名称。

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

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