【问题标题】:Having trouble wrapping my head around using redux states in React在 React 中使用 redux 状态时遇到麻烦
【发布时间】:2016-12-09 16:37:21
【问题描述】:

**更新

我已将减速器更新为:

const initialState = {
step: 1,
indibiz: "individual",
firstName:"first",
lastName: "last",
email: "email",
choice: "null",
emailNews: "no",
dob: "1",
mobileNumber: "1234567890",
island: "St. Lucia",
industry: "Astronaut",
Skill: "Space Monkey",
createClick: false
}
export default function (state = initialState, action) {
switch (action.type) {
case "SELECT_BUSINESS":
  console.log(state);
  return { ...state, indibiz: action.payloadEvent }
  break;

}
 return state;
}

现在我在 console.log 中看到以下内容,它正在从初始状态记录对象。但是,如果我尝试并在同一组件中记录以下内容: {console.log(this.props.selectindibusi.indibiz)} 然后它返回未定义。不是应该有在reducer中设置的initialValue吗?

**更新结束

我正在使用 react,目前正在尝试学习使用 Redux 并在我正在做的项目中使用它。问题是我觉得我不完全了解减速器。以下是我的减速器索引:

import {combineReducers} from 'redux';
import signupState from './reducer-signup.js';
import TestReducer from './testalertreducer.js';
import Selectindibusi from './reducer-select_indy_biz.js';

const allReducers = combineReducers({
  signupState: signupState,
  selectindibusi: Selectindibusi,
});

在我的 signupState 减速器中,我有:

export default function () {
  return ({
    step: 1,
    indibiz: "individual",
    firstName:"first",
    lastName: "last",
    email: "email",
    choice: "null",
    emailNews: "no",
    dob: "1",
    mobileNumber: "1234567890",
    island: "St. Lucia",
    industry: "Astronaut",
    Skill: "Space Monkey",
    createClick: false
  });
}

下面是动作:

export function selectindibusi(signupState, event) {
  const SELECT_BUSINESS = "random string";
  console.log(signupState);

  return {
    type: "SELECT_BUSINESS",
    payloadState: signupState,
    payloadEvent: event.target.value
  };
}

下面是监听那个动作的reducer:

export default function (state = [], action) {
  switch (action.type) {
    case "SELECT_BUSINESS":
    console.log(state);

    return { ...state, indibiz: action.payloadEvent }
    break;    
  }

  return state;
}

我在下拉菜单上的 onChange 操作中调用此操作,如下所示:

             <select className="formSelector100"  onChange={this.props.selectindibusi.bind(this,this.props.signupState)}>
                <option value="individual">Individual</option>
                <option value="business">Business</option>
              </select></label>

在操作中,我可以控制台记录正在传递的数据。问题是它没有更新 signupState reducer 中的数据,也没有创建我可以访问的新对象。

如果我尝试显示 {this.props.signupState.indibiz} 在我的组件上,该值与减速器中的默认值相同,它不会更新。我觉得我在这里遗漏了一些基本的东西,我将不胜感激。

【问题讨论】:

  • 当你执行 onChange 时,console.log(state); 真的会在你的 reducer 中被触发吗?
  • 是的,下面是响应:reducer-select_indy_biz.js:15 []length: 0__proto__: Array[0]
  • @Leigh 谢谢我自己试图回答这个问题。由于格式的原因,我无法理解 sn-p。会尽量谨慎

标签: reactjs redux


【解决方案1】:

根据您的回复,如果状态的控制台日志返回一个空数组,则:

export default function () {
  return ({
    step: 1,
    indibiz: "individual",
    firstName:"first",
    lastName: "last",
    email: "email",
    choice: "null",
    emailNews: "no",
    dob: "1",
    mobileNumber: "1234567890",
    island: "St. Lucia",
    industry: "Astronaut",
    Skill: "Space Monkey",
    createClick: false
  });
}

没有被设置为状态。你应该怎么做是

const initialState = {
    step: 1,
    indibiz: "individual",
    firstName:"first",
    lastName: "last",
    email: "email",
    choice: "null",
    emailNews: "no",
    dob: "1",
    mobileNumber: "1234567890",
    island: "St. Lucia",
    industry: "Astronaut",
    Skill: "Space Monkey",
    createClick: false
  }

然后在你的 signupState reducer 中

export default function (state = initialState, action) {
  switch (action.type) {
    case "SELECT_BUSINESS":
       console.log(state);
       return { ...state, indibiz: action.payloadEvent }
    break;    
  }

  return state;
}

到目前为止,你如何设置你的 reducer 没有收到正确的初始状态,因此它认为 state 是一个空数组。

【讨论】:

  • 谢谢!但你是说我不应该在 return 中导出 signupState 函数,而是将初始状态对象放在 reducer 中?
  • 我们如何在具体的reducer文件中进行操作,将initialState作为变量放在顶部,然后在下面有实际的reducer函数,即switch语句和相应的reducer。 (state = initialState, action) 只是确保当您第一次关闭所有内容时,它具有最初可以使用的正确状态。
  • 谢谢。我做了那个改变。出于某种原因,当我尝试从该对象访问一个值并控制台记录它时,我得到了未定义。专门尝试记录“console.log(this.props.selectindibusi.indibiz)”
  • 我明白了!你是对的。我继续遇到麻烦,因为当我将值放入减速器时,我为该减速器使用了与操作相同的名称......哇,我是个白痴。谢谢!
  • 呵呵没问题,正如我的导师总是告诉我的那样,如果某些事情不起作用,那可能是一些愚蠢的事情
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2016-11-26
  • 1970-01-01
  • 2021-03-24
  • 2013-11-11
相关资源
最近更新 更多