【问题标题】:Cannot update state with react-redux无法使用 react-redux 更新状态
【发布时间】:2020-04-14 20:22:20
【问题描述】:

我想做什么

我想在我的 React 应用程序中使用 Redux 管理两种状态。这两个状态是userName和isLogin,这是一个布尔值,包含用户是否正在登录。

代码

我在为初学者阅读一些网页时编写了代码。

src/components/Login.js

class Login extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      email: '',
      password: '',
    };

    this.handleEmail = this.handleEmail.bind(this);
    this.handlePassword = this.handlePassword.bind(this);
    this.handleMainPage = this.handleMainPage.bind(this);
  }

  handleMainPage(){
    this.props.onSubmit(this.state.email);
  }
  handleEmail(event) {
    this.setState({email: event.target.value});
  }
  handlePassword(event) {
    this.setState({password: event.target.value});
  }


  render() {
    return (
      <Container component="main">
        <CssBaseline />
        <div>
          <Typography component="h1" variant="h5">
            Login
          </Typography>
          <form noValidate>
            <TextField value={this.state.email} onChange={this.handleEmail}/>
            <TextField value={this.state.password} onChange={this.handlePassword} type="password"/>
            <Button onClick={this.handleMainPage}>
              Sign In
            </Button>
          </form>
        </div>
      </Container>
    )
  }
}

export default Login;

src/container/Login.js

import Login from '../components/Login';

import { connect } from 'react-redux';
import { login } from '../actions';

const mapStateToProps = (state, prop) => {
  return {
    userName: state.userName,
    isLogin: state.isLogin,
  }
};

const mapDispatchToProps = (dispatch) => {
  return {
    onSubmit: (username) => {
      dispatch(login(username))
    }
  }
};

let loginForm = connect(mapStateToProps, mapDispatchToProps)(Login);

export default loginForm;

src/reducers/index.js

const defaultState = {
  userName: "",
  isLogin: false,
};

const userStatus = (state=defaultState, action) => {
  switch (action.type) {
    case 'LOGIN':
      return Object.assign({}, {
        userName: action.userName,
        isLogin: action.isLogin,
      });
    default:
      return state;
  }
}

export default userStatus;

src/actions/index.js

export const login = (username) => {
  return {
    type: 'LOGIN',
    userName: username,
    isLogin: true,
  };
}

src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import './index.css';
import App from './App';
import MainWindow from './Main';
import userStatus from './reducers';
import * as serviceWorker from './serviceWorker';

var Routes = (
  <Route path='/' component={App}>
    <Route exact path='/' component={App} />
    <Route path='/login' component={App} />
    <Route path='/signup' component={App} />
    <Route path='/main' component={MainWindow} />
  </Route>
);

let store = createStore(userStatus);

ReactDOM.render(
  <Provider store={ store }>
    <Router>{Routes}</Router>
  </Provider>,
  document.getElementById('root')
);

serviceWorker.unregister();

我检查了 src/reducers/index.js 中的 action.userName 和 action.isLogin 有我在登录表单中输入的值,但是在 src/components/Login.js 中这些值是空的和假的(初始状态) .

如何正确更新这些状态?

【问题讨论】:

  • 您的LOGIN 操作是否已调度?
  • 我想我在 src/container/Login.js 中的 mapDispatchToProps 函数中做。错了吗?
  • 不,看起来不错,但是您是否在 Redux Devtool 中检查了您的操作实际上已被调度?

标签: javascript reactjs redux react-redux


【解决方案1】:

您似乎没有提交表单。您需要一个函数(通常是 handleSubmit)来提交表单。所以是这样的:

<form onSubmit={handleSubmit}>
// ...
  <Button variant="contained" color="secondary" type="submit">
     Add note
  </Button>
</form>

你的 handleSubmit 函数看起来像 -->

const handleSubmit = e => {
// if your input value is truthy, then add input to state
    if (noteText) {
      dispatch({
        type: "ADD_NOTE",
        noteText,
        id: uuid(),
        dateCreated: Date()
      });
    }
    // set input value back to empty string
    setNoteText("");
    // don't let page refresh so your state is saved
    e.preventDefault();
  };

【讨论】:

  • 我想澄清一下,我没有使用 redux,而是使用 useContext、useReducer 和 useState 来模仿 redux
  • 另外看这个可能是你命名对象的问题,因为调度中有一些差异
  • 感谢您的回答。我在按钮上设置了type="submit",并为表单编写了handleSubmit 函数。然后,将this.props.onSubmit 函数移到handleSubmit 中,它起作用了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多