Redux reducers 将嵌套对象添加到状态
Redux reducers adding nested objects to state
在使用 React/Redux 为我的应用程序制作 UI 时,我的头撞到了墙上。问题是,当我的动作被客户端变异状态触发时,它会将我正在改变的状态片段变成一个嵌套对象。
在这种情况下,我试图将我的状态 loginForm
更改为 "login"
或 "signUp"
。当我启动我的动作时,道具 loginForm
(从状态传递到我的组件)看起来像这样:this.props.loginForm.loginForm = "login"
。
客户端代码:
import React from "react";
import LoginForm from "../minor/LoginForm";
const Login = React.createClass({
displayForm(){
if (this.props.loginForm === "login"){
return <span>Login</span>
} else if (this.props.loginForm === "signUp"){
return <span>Sign Up</span>
} else {
console.log("meh")
}
},
renderLogin(){
this.props.chooseForm("login");
},
renderSignUp(){
this.props.chooseForm("signUp");
},
render(){
return(
<div className="loginBox">
<h1>Slots</h1>
<button onClick={this.renderLogin} name="login" >Login</button>
<button onClick={this.renderSignUp} name="signUp" >Sign Up</button>
{this.displayForm()}
</div>
)
}
});
export default Login;
userActions.js
export function chooseForm(form){
console.log("choosing form")
return {
type: "CHOOSE_FORM",
form
}
}
userReducer.js
export function loginForm(state=null, action){
switch(action.type){
case "CHOOSE_FORM":
return {...state, loginForm: action.form };
default:
return state;
}
}
这里的目的是显示与 this.prop.loginForm
的值关联的正确组件,由于我的上述问题,这是无法实现的。
更新
mainReducer.js(组合减速器)
import {combineReducers} from "redux";
import {routerReducer} from "react-router-redux";
// reducers
import { loginStatus, loginForm }from "./userReducer";
const rootReducer = combineReducers({ loginStatus, loginForm, routing: routerReducer});
export default rootReducer;
在没有看到您的其余代码的情况下,我将进行有根据的猜测,并说这看起来可能是 combinedReducers 文件中的问题。如果您正在使用 combineReducers,请继续阅读...
可能是因为您将 Redux 状态设置为:
loginForm: userReducer
// so the Redux state would be set have a property in it
// 'loginForm' set to {loginForm:'login'}
解决方法:
将您的 combineReducers 修改为:
loginForm: userReducer.loginForm
因为你的 loginForm
reducer 是一个 slice reducer 你应该 return 那片状态的值,而不是整个状态,即你应该 return form
值:
case "CHOOSE_FORM":
return action.form;
在处理这些操作时,将 loginForm
状态键替换为 "login"
或 "signUp"
。
在使用 React/Redux 为我的应用程序制作 UI 时,我的头撞到了墙上。问题是,当我的动作被客户端变异状态触发时,它会将我正在改变的状态片段变成一个嵌套对象。
在这种情况下,我试图将我的状态 loginForm
更改为 "login"
或 "signUp"
。当我启动我的动作时,道具 loginForm
(从状态传递到我的组件)看起来像这样:this.props.loginForm.loginForm = "login"
。
客户端代码:
import React from "react";
import LoginForm from "../minor/LoginForm";
const Login = React.createClass({
displayForm(){
if (this.props.loginForm === "login"){
return <span>Login</span>
} else if (this.props.loginForm === "signUp"){
return <span>Sign Up</span>
} else {
console.log("meh")
}
},
renderLogin(){
this.props.chooseForm("login");
},
renderSignUp(){
this.props.chooseForm("signUp");
},
render(){
return(
<div className="loginBox">
<h1>Slots</h1>
<button onClick={this.renderLogin} name="login" >Login</button>
<button onClick={this.renderSignUp} name="signUp" >Sign Up</button>
{this.displayForm()}
</div>
)
}
});
export default Login;
userActions.js
export function chooseForm(form){
console.log("choosing form")
return {
type: "CHOOSE_FORM",
form
}
}
userReducer.js
export function loginForm(state=null, action){
switch(action.type){
case "CHOOSE_FORM":
return {...state, loginForm: action.form };
default:
return state;
}
}
这里的目的是显示与 this.prop.loginForm
的值关联的正确组件,由于我的上述问题,这是无法实现的。
更新
mainReducer.js(组合减速器)
import {combineReducers} from "redux";
import {routerReducer} from "react-router-redux";
// reducers
import { loginStatus, loginForm }from "./userReducer";
const rootReducer = combineReducers({ loginStatus, loginForm, routing: routerReducer});
export default rootReducer;
在没有看到您的其余代码的情况下,我将进行有根据的猜测,并说这看起来可能是 combinedReducers 文件中的问题。如果您正在使用 combineReducers,请继续阅读...
可能是因为您将 Redux 状态设置为:
loginForm: userReducer
// so the Redux state would be set have a property in it
// 'loginForm' set to {loginForm:'login'}
解决方法:
将您的 combineReducers 修改为:
loginForm: userReducer.loginForm
因为你的 loginForm
reducer 是一个 slice reducer 你应该 return 那片状态的值,而不是整个状态,即你应该 return form
值:
case "CHOOSE_FORM":
return action.form;
在处理这些操作时,将 loginForm
状态键替换为 "login"
或 "signUp"
。