在 React 上使用 dispatch

using dispatch on react

我是 React 新手,我正在尝试使用 react-redux 创建一个注册和登录页面,并使用 mern 堆栈进行调度。

当我调用方法时,函数没有运行。

我有一个登录页面的文件:


    import React from "react";
    import {login} from '../../actions/authActions';
    
    
    export class Login extends React.Component {
        
        constructor(props) {
            super(props);
        }
        
        checkIfElementIsEmpty = (element) => {
            if (!element) {
                return false
            }
            if (element.value.length === 0)
            {
                return false;
            }
            return true;
        }
    
        handleOnClickLogin = () =>
        {
            let usernameElement = document.getElementsByName("loginUsername")[0];
            let passwordElement = document.getElementsByName("loginPassword")[0];
    
            if (!this.checkIfElementIsEmpty(usernameElement))
            {
                usernameElement.style.backgroundColor = "#ff000042";
                return;
            }
            if (!this.checkIfElementIsEmpty(passwordElement))
            {
                passwordElement.style.backgroundColor = "#ff000042";
                return;
            }
            console.log("asd");
            login(usernameElement.value, passwordElement.value);
        }
    
        setColorToDefault = (e) =>{
            e.target.style.backgroundColor = "#f3f3f3";
        }
    
        render() {
            return <div className="base-container" ref={this.props.containerRef}>
                    <div className="header">Login</div>
                    <div className="content">
                        <div className="image">
                            {/* <img src={loginImg}/> */}
                        </div>
                        <div className="form">
                            <div className="form-group">
                                <label htmlFor="username">Username:</label>
                                <input type="text" name="loginUsername" placeholder="username" onFocus={this.setColorToDefault}/>
                            </div>
                            <div className="form-group">
                                <label htmlFor="password">Password:</label>
                                <input type="password" name="loginPassword" placeholder="password" onFocus={this.setColorToDefault}/>
                            </div>
                        </div>
                    </div>
                    <div className="footer">
                        <button type="button" className="btn" onClick={this.handleOnClickLogin}>
                            Login
                        </button>
                    </div>
                </div>
        }
    }

和一个名为“authActions.js”的文件,该文件具有“登录”功能,应该向服务器发送请求并验证登录。


    export const login = (email, password) => (dispatch: Function) => {
        console.log("bbb");
        // Headers
        const config = {
            headers: {
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': "*"
            }
        }
    
      // Request body
      const body = JSON.stringify({ email, password });
    
      axios
        .post('http://${HOST}:${PORT}/api/auth/login', body, config)
        .then(res =>
          dispatch({
            type: LOGIN_SUCCESS,
            payload: res.data
          })
        )
        .catch(err => {
          dispatch(
            returnErrors(err.response.data, err.response.status, 'LOGIN_FAIL')
          );
          dispatch({
            type: LOGIN_FAIL
          });
        });
    }

调用 handleOnClickLogin 时,我只在控制台上看到 'aaa'。 'bbb' 永远不会被打印出来。 为什么会这样,我需要如何正确使用 dispatch 和 react-redux?

您的问题需要更详细的信息,但我会猜测并向您概述它应该是什么样子。

Redux 有一个 connect 方法,该方法基本上会调用您使用 dispatch(和 getState)参数传递给它的函数。所以,给定:login = (email, password) => (dispatch: Function)。您调用 login(email, pass);,它 returns 是一个函数 (dispatch, [getState]) => xxx。 Redux 将通过商店的调度调用它来处理它。

为此,您还需要全局配置 redux、商店、提供商,但我假设您的项目已经这样做了。否则你需要去看看官方文档,它真的很好https://react-redux.js.org/tutorials/connect

但是,如果您是 Redux 的新手并且没有设置所有 connect,使用 Hooks API (还建议在反应中使用 Hooks 而不是 class 组件)。 https://react-redux.js.org/introduction/getting-started#hooks

回到您的代码,您需要的重要部分:

import React from "react";
import { login } from '../../actions/authActions';

import { connect } from 'react-redux';


class MyLoginPage extends React.Component {

    handleOnClickLogin = () => {
     ...
     // calling the login bound by redux
     this.props.doLogin(usernameElement.value, passwordElement.value);
    } 

}

const LoginPageHOC = connect(null, {
  doLogin: login, // changing names for clarity (we could do login: login)
})(MyLoginPage);

export const LoginPage = LoginPageHOC; // use the HOC instead of the class