【问题标题】:How to export the value of useState hooks如何导出 useState 钩子的值
【发布时间】:2021-07-30 19:19:45
【问题描述】:

我正在尝试在我的组件中使用“useState”挂钩来设置用户名和密码输入字段的值,然后将有效负载(用户名和密码的值)分派到使用 redux 的减速器。

import React, { useEffect, useState } from "react";
import { connect } from "react-redux";
import {signUpUser} from "../SideBar/Redux"
import ReactDOM from "react-dom";
import { CSSTransition } from "react-transition-group";
import "./SignUp.css";

const SignUpModal = (props) => {
  const closeOnEscapeKeyDown = e => {
    if ((e.charCode || e.keyCode) === 27) {
      props.modalClosed();
    }
  };

  useEffect(() => {
    document.body.addEventListener("keydown", closeOnEscapeKeyDown);
    return function cleanup() {
      document.body.removeEventListener("keydown", closeOnEscapeKeyDown);
    };
  }, []);

  const [userNameInput, setUserNameInput] = useState("");
  const [userPasswordInput, setUserPasswordInput] = useState("")

  const userNameHandler = (e) => {
    setUserNameInput(e.target.value)
  }
 
  const userPasswordHandler = (e) => {
    setUserPasswordInput(e.target.value)
  }

  return ReactDOM.createPortal(
    <CSSTransition
      in={props.isSignupModalOpened}
      unmountOnExit
      timeout={{ enter: 0, exit: 300 }}
    >
      <div className="modal" onClick={props.modalClosed}>
        <div className="modal-content" onClick={e => e.stopPropagation()}>
          <div className="modal-header">
            <h4 className="modal-title">Sign Up</h4>
          </div>
          <div className="modal-body">
              <div className = "modal-input-field">
                <div className = "modal-username-field">
                    <p className = "p-username">Username</p>
                    <input tag = "username"
                           placeholder = "eg: muhammet-aldulaimi"
                           onChange = {userNameHandler}
                      /> 
                </div>
                <div className = "modal-password-field">
                    <p className = "p-password">Password</p>
                    <input tag = "password"
                           type = "password"
                           placeholder = "eg: someStrongPassword123"
                           onChange = {userPasswordHandler}
                    /> 
                </div>
              </div>
              <div className = "modal-submit"> 
                <button onClick = {props.userInfoSubmitHandler}
                        className = "modal-submit-button">Submit
                </button>
              </div>

          </div>
          <div className="modal-footer">
            <button className="button" onClick={props.modalClosed} >
              Close
            </button>
          </div>
        </div>
      </div>
    </CSSTransition>,
    document.getElementById("root")
  );
};




const mapStateToProps = (state) => {
    return {
        isModalOpen: state.isModalOpen,
        isSignupModalOpened: state.isSignupModalOpened
    }
}



const mapDispatchToProps = (dispatch) => {
    return {
        modalOpened : () => {
            dispatch({type: "OPEN_MODAL"})
        },
        modalClosed : () => {
            dispatch({type: "CLOSE_MODAL"})
        },
        userInfoSubmitHandler: () => {
            console.log("reached prop successfully")
            console.log(userNameValue, userPasswordValue)
            dispatch(signUpUser({userName: userNameValue, userPassword: userPasswordValue}))
        }
    }
}   

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

我尝试导出变量,但不起作用。将变量分配给另一个变量然后导出它是行不通的。我还尝试将状态变量作为参数传递给我的 prop.userInfoSubmitHandler。那也没用。我不明白为什么这些变量在我的 userInfoSubmitHandler 函数范围内不可用。有什么建议吗?

【问题讨论】:

  • 您能说明您是如何尝试将变量传递给userInfoSubmitHandler 的吗?看起来应该可以。当你尝试这样做时发生了什么?
  • 变量是在 SignUpModal 的范围内定义的,因此它们在它之外不可用,也就是 mapDispatchToProps,它是 SignUpModal 的兄弟。您说您尝试将变量作为参数传递。这应该可行,你能告诉我们你尝试了什么吗?
  • 当我尝试将 localstate userNameInput 和 userPasswordInput 作为参数传递给 userInfoSubmitHandler 函数时,发生了 2 件事。 1- 我有 2 个模式组件,一个登录和一个注册,登录模式组件获取由页面上的按钮触发,注册获取由登录组件中的按钮触发。我控制台记录了函数链,一个日志用于到达道具,另一个日志用于到达减速器。当我单击登录组件以到达注册组件时,控制台日志会触发两次,而当我单击提交按钮时,它不会...
  • ...在应该触发的时候触发。

标签: javascript reactjs redux


【解决方案1】:

您可以尝试将onclick作为参数传递:

<button onClick={() => props.userInfoSubmitHandler(userNameInput, userPasswordInput)}
    className = "modal-submit-button">Submit
</button>

我还看到在变量名称不同的状态下,您没有任何名为 userNameValue 和 userPassworValue 的变量?

【讨论】:

  • 成功了!!!这段代码背后的原因是什么?怎么我直接调用它就不行了?
  • 您正试图在其范围之外访问组件的状态。 'userInfoSubmitHandler' 是 redux 中的一个函数,因此它对组件的状态变量一无所知,这就是为什么必须在组件中传递参数的原因。
  • 不,我已经尝试通过执行以下操作将参数添加到 userInfoSubmitHandler 函数中: () => 道具.userInfoSubmitHandler。你的效果如何?
  • 为此您可以查看 React.js 文档:https://reactjs.org/docs/faq-functions.html
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2021-04-04
  • 1970-01-01
  • 2021-05-20
  • 2020-07-05
  • 1970-01-01
  • 2020-06-03
  • 2020-11-28
相关资源
最近更新 更多