【问题标题】:How to set state object values into redux store如何将状态对象值设置到 redux 存储中
【发布时间】:2020-04-25 10:27:23
【问题描述】:

我的表单中有 2 个输入文本框。在其更改处理程序中,我将它们各自的值设置为状态对象。但是我想将这两个值存储到 redux 存储中,以便我可以在多个组件上使用它。无论如何,我可以将这两个输入值存储到 state 和 redux 存储中。以下是我的登录组件代码。提前致谢。

import React from "react";
import { connect } from "react-redux";
import * as loginAction from "../redux/actions/LoginAction";


class Login extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      username: "",//want to have this value in redux store so that I can use it in multiple components
      password: "",
      errorUsername: null,
      errorPassword: null,
    };

    this.handleValidation = this.handleValidation.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }
  //assign textbox values to props
  handleChange = (e) => {
    this.setState({
      [e.target.name]: [e.target.value],
    });
  };
  //handle input validation
  handleValidation = (event) => {
    if (!this.state.username) {
      this.setState({ errorUsername: "Please enter User Name" });
      event.preventDefault();
    }

    if (!this.state.password) {
      this.setState({ errorPassword: "Please enter Password" });
      event.preventDefault();
    }

    if (this.state.password && this.state.username) {
      this.setState({ errorUsername: null, errorPassword: null });
      let postData = {
        username: this.state.username[0],//want to have this value in redux store so that I can use it in multiple components
        password: this.state.password[0],
      };

      event.preventDefault();
      //dispatching an action
      this.props.dispatch(loginAction.checkLogin(postData, this.props.history));
    }
  };

  render() {
    return (
      <div className="d-flex flex-column">
        <div className="d-flex globalStyle">
          <div className="w-100 justify-content-start p-5">
            <div className="p-10 bg-white">
              <div className="Login">
                <form>
                  <div className="d-flex flex-column">
                    <div>Login</div>
                    <div className="d-flex flex-row">
                      <div>
                        <b>User name</b>
                      </div>
                    </div>

                    <div>
                      <input
                        type="username"
                        name="username"
                        className="inputText"
                        id="exampleInputUserName"
                        value={this.props.userName}
                        onChange={this.handleChange}
                        placeholder="Enter User Name"
                      ></input>
                    </div>

                    <div className="text-danger d-flex flex-row p-2 ml-2">
                      {this.state.errorUsername && (
                        <div>{this.state.errorUsername}</div>
                      )}
                    </div>

                    <div className="d-flex flex-row">
                      <div>
                        <b>Password</b>
                      </div>
                    </div>

                    <div className="d-flex flex-row p-2 ml-2">
                      <input
                        type="password"
                        name="password"
                        className="inputText"
                        value={this.props.password}
                        onChange={this.handleChange}
                        placeholder="Enter Password"
                      ></input>
                    </div>
                    <div className="text-danger d-flex flex-row p-2 ml-2">
                      {this.state.errorPassword && (
                        <div>{this.state.errorPassword}</div>
                      )}
                    </div>
                    <div className="d-flex flex-row  justify-content-around p-2 ml-2">
                      <button
                        type="submit"
                        onClick={this.handleValidation}
                        className="button-style"
                      >
                        Login
                      </button>
                    </div>
                  </div>
                  <div>
                    <br></br>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    userDetails: state.userDetails,
  };
}

export default connect(mapStateToProps)(Login);

mu登录动作代码是

const getUserDetailsSuccess = (userDetails) => ({
  type: "GET_DETAILS",
  userDetails,
});

export const checkLogin = (loginData, history) => {
  const url = `login`;
  return (dispatch) => {
    return service
      .post(url, loginData)
      .then((res) => {
        const userDetails = res.data.response_message;
        dispatch(getUserDetailsSuccess(userDetails));
      })
      .catch((error) => {
        throw error;
      });
  };
};

我的 Reducer 代码是

function loginReducer(state = { userDetails: {} }, action) {
  switch (action.type) {
    case "GET_DETAILS":
      return { userDetails: action.userDetails };
    default:
      return state;
  }
}

export default loginReducer;

我的代码运行良好,没有任何问题。

【问题讨论】:

  • 这能回答你的问题吗? How does action-reducer chain work in react-redux
  • @norbitrial,不清楚。我也将这 2 个输入框的值发送给操作。如何从减速器中取回并存储到存储中..
  • 你能把提到的和相关的代码sn-p分享到你的场景吗?谢谢!
  • @norbitrial 代码已添加到上面的问题中。谢谢

标签: reactjs react-redux state react-props


【解决方案1】:

只需将loginData 添加到您的调度中


const getUserDetailsSuccess = (userDetails, loginData) => ({
    type: "GET_DETAILS",
    userDetails,
    loginData
 });

export const checkLogin = (loginData, history) => {
 const url = `login`;
 return (dispatch) => {
   return service
     .post(url, loginData)
     .then((res) => {
       const userDetails = res.data.response_message;
       dispatch(getUserDetailsSuccess(userDetails, loginData));
     })
     .catch((error) => {
       throw error;
     });
  };
 };

在reducer中action.loginData将是你想要的内容(不知道你想如何存储它)


     function loginReducer(state = { userDetails: {} }, action) {
       switch (action.type) {
        case "GET_DETAILS":
           return { userDetails: { ...action.userDetails, ...action.loginData } };
        default:
          return state;
      }
     }

     export default loginReducer;

【讨论】:

  • 没有它,我的代码也可以正常工作。我想要的是将用户名值存储在 redux 商店中。
  • 如果你可以从 UI 组件中调度,是什么阻止你在那里调度状态?
  • 几周以来,我在反应和工作方面非常陌生。我将如何分派状态并将其存储在 redux 商店中。任何代码示例或链接对我有帮助?
  • 一切正常,只是您不知道如何进行两个操作? state.userDetails.username 不是还没有用户名吗?
  • 没有。在 API 响应中,我只得到用户组和身份验证令牌。没有我要发送的用户名。
猜你喜欢
  • 1970-01-01
  • 2018-01-14
  • 2018-05-03
  • 2021-07-22
  • 1970-01-01
  • 2017-04-03
  • 2020-07-06
  • 1970-01-01
相关资源
最近更新 更多