为什么这不更新我的状态,应该更新? React Redux

时间:2018-07-23 11:34:12

标签: javascript reactjs redux react-redux

我有一个更新状态的函数,并且我已经使用了模拟函数来更新可以正常工作的函数,但是由于某种原因,它不能更新状态...我一直盯着自己看这个问题.. 这是来自reducer的电话(到此为止一切正常)

case 'UI_CONTROLL_SUCCESS':
    {
      if(action.answer.controllType)
      state = changeUi(state, action.answer.questionId, action.answer.answerId, action.answer.controllValue, action.answer.controllType);
      else
      return state
    }

它调用函数。这是它调用的函数:

function changeUi(project, questionId, answerId, newValue, whatUi)
{
  console.log(newValue);
  return project.map(item => {
    if(item._id != questionId) {
      return item;
    } else {
      return {...item, answers: item.answers.map(answer => {
          if(answer._id != answerId) {
            return answer
        } else if(answer._id == answerId) {
          if(whatUi == "setAnswerVisibility"){
            return updateObject(answer, { visibility : newValue })}
          else if (whatUi == "setAnswerDisabled"){
            return updateObject(answer, { disabled: newValue })}
          else if (whatUi == "SetAnswerValue"){
            return updateObject(answer, { value: newValue })
          }
          else{
            return answer
          }
        }
        else{
          return answer
        }
      })
    }}
    console.log(item);
  })
}

从action {}发送的参数中的所有值都是正确的。因此,该函数可以获得正确的信息。

存在于州内的文档的mongoDB模式(我不包括所有道具,仅包括相关道具。):

var questionModel = new Schema({
    _id: Schema.Types.ObjectId,
    qpId: Schema.Types.ObjectId,
    answers: [answerModel],
    description: String
});

var answerModel = new Schema({
    _id: Schema.Types.ObjectId,
    questionId: Schema.Types.ObjectId,
    answerText: String,
    value: Schema.Types.Mixed,
    settings: settingsModel,
    });


var settingsModel = new Schema({
    disabled: Boolean, 
    answerType: String,
    visibility: Boolean,
    setVisibilityPaths:[{_id:false, questionId: Schema.Types.ObjectId, answerId: Schema.Types.ObjectId}],
    setDisabledPaths: [{_id:false, questionId: Schema.Types.ObjectId, answerId: Schema.Types.ObjectId}],
    setAnswerValue:[{_id:false, questionId: Schema.Types.ObjectId, answerId: Schema.Types.ObjectId, answerValue: Schema.Types.Mixed}],
    setAnswerVisibility: Boolean,
    setAnswerDisabled: Boolean
}, {id: false});

3 个答案:

答案 0 :(得分:0)

因为您没有返回状态

case 'UI_CONTROLL_SUCCESS':
    {
      if(action.answer.controllType)
      return changeUi(state, action.answer.questionId, action.answer.answerId, action.answer.controllValue, action.answer.controllType);
      else
      return state
    }

答案 1 :(得分:0)

如果您不返回,请在if条件内返回新状态。

case 'UI_CONTROLL_SUCCESS':
    {
      if(action.answer.controllType)
       return {...state, ...changeUi(state, action.answer.questionId, action.answer.answerId, action.answer.controllValue, action.answer.controllType)};
      else
      return state
    }

不要通过将changeUi函数返回值分配给state来改变状态

答案 2 :(得分:0)

我解决了它,这是一个durp错误,我试图更改answer.disabled,但应该是answer.settings.disabled ...

但是感谢您提醒我关于不变对象的事情:) 欢呼!