我有一个更新状态的函数,并且我已经使用了模拟函数来更新可以正常工作的函数,但是由于某种原因,它不能更新状态...我一直盯着自己看这个问题.. 这是来自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});
答案 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 ...
但是感谢您提醒我关于不变对象的事情:) 欢呼!