reactjs - 在反应上使用调度
问题描述
我是新手,我正在尝试使用 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”的文件,其函数“login”应该将请求发送到服务器并验证登录。
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);
它会返回一个函数(dispatch, [getState]) => xxx
。Redux 将通过 store 的 dispatch 调用它来处理它。
为此,您还需要全局配置 redux、商店、提供者,但我假设您的项目已经这样做了。否则你需要去官方文档这真的很好https://react-redux.js.org/tutorials/connect
但是,如果您是 Redux 的新手并且没有进行所有connect
设置,那么使用 Hooks API 会更容易(也是推荐的方式)(在 react 中也建议使用 Hooks 而不是类组件)。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
推荐阅读
- java - 协变返回类型最佳实践
- javascript - express.json() 是将请求对象识别为 JSON 对象?
- java - Firebase Auth 帐户已创建,但从未调用过完整的侦听器
- javascript - 列表中的元素在调整大小时不在一起
- sql-server-2012 - 尝试根据 where 中的结果应用逻辑来拉取某些行
- c++ - 类中类的向量,如何只限制1次?
- c++ - 字符串错误还是编译器错误?
- android - 通过 android 模拟器连接到本地运行的 SignalR .netcore 服务器
- javascript - 如何防止在鼠标移动期间单击光线投射的对象?
- javascript - 当我的当前页面关闭时,如何更改不同页面的内容?