【问题标题】:Why doesn't this update my state, it should? React Redux为什么这不更新我的状态,它应该?反应还原
【发布时间】:2023-03-27 04:59:01
【问题描述】:

我有一个更新状态的函数,并且我使用模拟函数来更新同样可以正常工作的函数,但是由于某种原因,这并没有更新状态...我对这个问题视而不见.. 这是来自 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);
  })
}

从操作发送的参数中的所有值都是正确的。{}所以函数 get 是正确的信息。

位于状态内部的文档的 mongoDB Schema(我不包括所有道具,只包括相关的。):

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});

【问题讨论】:

  • 用括号 ({...}) 分隔 ifelse 语句的正文,您会发现问题所在。
  • 我做到了,但我仍然没有看到问题:/

标签: javascript reactjs redux react-redux


【解决方案1】:

因为你没有返回状态

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
    }

【讨论】:

  • 是的,这是一个愚蠢的错误,但它仍然不起作用:/ 它没有重新呈现更改
  • 添加你传入函数changeUi(state的状态
  • 请安慰您的状态并发布
  • 你不会因此变得更聪明,它是巨大的。那里还有一些敏感信息。我正在开发的应用程序只能由有限数量的人访问
【解决方案2】:

如果您不返回,请在 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 来改变 state

【讨论】:

  • 是的,这是一个愚蠢的错误,谢谢,但它仍然不起作用:/ 它没有重新呈现更改
【解决方案3】:

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

但是感谢你提醒我关于不可变对象的事情 :) 干杯!

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 2020-11-05
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多