reactjs - 为什么状态变化没有进入减速器?
问题描述
我在名为 this.props.onUserLogin 的文件中有一个名为 Login.js 的文件,并传递了用户身份验证令牌。我可以通过控制台日志验证我是否从 api 调用中获取令牌。当我到达减速器时,我以某种方式失去了状态的价值。我也可以使用控制台日志来验证这一点。我试图弄清楚为什么我的 state.loginToken 在减速器中是空的。
登录.js
import React, {Component} from 'react';
import * as actionTypes from '../Store/actions';
import UserInfoButton from '../UserInfoButton/UserInfoButton';
import { connect } from 'react-redux';
const axios = require('axios');
class Login extends Component {
constructor(props) {
super(props);
this.state = {
email: '',
password: '',
};
}
handleChange = (event) => {
const target = event.target;
const value = target.value;
const name = target.name;
this.setState({
[name]: value
})
}
handleLogin = (event) => {
axios.post('http://127.0.0.1:8000/api/user/token/', {
email: this.state.email,
password: this.state.password,
}).then( (response) => {
console.log('response: ' + response.data.token);
this.props.onUserLogin(response.data.token);
})
.catch( (error) => {
console.log(error)
})
event.preventDefault();
}
render() {
const isLoggedIn = this.props.loginToken;
let userButton;
if(isLoggedIn) {
userButton = <UserInfoButton/>
} else {
userButton = "";
}
return (
<div>
<form onSubmit={this.handleLogin}>
Email:<br/>
<input type="text" value={this.state.email} onChange={this.handleChange} name="email"/><br/>
Password:<br/>
<input type="password" value={this.state.password} onChange={this.handleChange} name="password"/><br/>
<br/>
<input type="submit" value="Submit"></input>
</form>
<div>{this.props.loginToken}</div>
<br/>
<div>{userButton}</div>
</div>
)
}
}
const mapStateToProps = state => {
return {
loginToken: state.loginToken
};
}
const mapDispatchToProps = dispatch => {
return {
onUserLogin: (userToken) => dispatch( { type: actionTypes.USER_LOGIN_ACTION, loginToken: userToken } ),
};
}
export default connect(mapStateToProps,mapDispatchToProps)(Login);
减速器.js
import * as actionTypes from './actions';
const initialState = {
loginToken: '',
}
const reducer = (state = initialState, action) => {
switch(action.type) {
case actionTypes.USER_LOGIN_ACTION:
console.log('action: ' + state.loginToken);
return {
...state,
loginToken: state.loginToken,
}
default:
return state;
}
};
export default reducer;
解决方案
基本上是减速器内部的一个错字 - 您正在寻找loginToken
内部state
而不是action
.
case actionTypes.USER_LOGIN_ACTION:
console.log('action: ' + action.loginToken); // not state.loginToken
return {
...state,
loginToken: action.loginToken, // not state.loginToken
}
推荐阅读
- go - 我可以将卷挂载到 Katib Experiment 吗?
- tensorflow - 用 ECG 数据拟合 LSTM 网络不起作用
- java - 是否有一个 Java 内置类会阻塞直到事件发生并且可以被中断以引发异常?
- android - Unity Sprite Sheet 在 Android 设备上呈锯齿状
- actions-on-google - Google Nest Hub 无法播放 HLS,但 HLS 网址在 HTML 中有效
- python - 如何将正常的“打印”与“打印”分开?
- python - Pytorch:使用 nn.Embedding 编码分类特征
- java - mapstruct 1.3.1FINAL:@Mapper(componentModel = "spring") 不支持自定义 bean 名称引用 mapstruct/mapstruct#1427
- javascript - 不同数组项的所有可能组合,新数组中的不同大小
- c++ - octave 独立,示例报告对 `octave::feval 错误的未定义引用