React对象属性分配仅在第一次时有效

时间:2019-03-11 17:35:47

标签: javascript reactjs object state

对于以下代码,参数是js对象,其结构初始化如下:

statePiece = {
  field_name: { disabled: false, exampleValue: "arbitrary" },
  field_name2: {
    /* ... */
  },
  field_nameN: {
    /* ... */
  }
};

userField = "field_name_string";

sesarValues = {
  format: "one2one",
  selectedField: "latitude",
  disabledSelf: true,
  addField: 0
};

此函数正常工作,并在第一次修改特定的statePiece时将修改后的returnTemp返回为statePiece.field_name

export let setUserField = (statePiece, userField, sesarValues) => {
  console.log("set user field", userField, "set mappval", sesarValues);

  var temp = { ...statePiece }; //(this.state.fields[each].mappedTo != null) ? (this.state.fields[userField].mappedTo) : [];
  var XUnit = statePiece[userField];

  if (typeof userField != "string") {
    console.log("not string");
    for (var each of userField) {
      if (sesarValues) {
        temp[each].mappedTo = sesarValues.selectedField;
        temp[each].disabled = true;
      } else {
        temp[each].disabled = !temp[each].disabled;
        delete temp[each].mappedTo;
      }
    }
  } else {
    //is string
    console.log("is string");
    console.log(XUnit);

    if (sesarValues) {
      if (XUnit.disabled === true) XUnit.disabled = false;
      console.log("1");
      console.log(XUnit);

      XUnit.disabled = true;
      console.log(XUnit);
      XUnit.mappedTo = sesarValues.selectedField;
    } else {
      console.log("2");
      temp[userField].disabled = !temp[userField].disabled;
      delete temp[userField].mappedTo;
    }
  }
  let returnTemp = { ...temp, [userField]: XUnit };
  console.log("set UF debug ", returnTemp);
  console.log(returnTemp["FACILITY_CODE"]);
  return returnTemp;
};

但是在此之后,更改statePiece.userField.mappedTo值将无法更改对象属性。或者至少永久更改它。当我控制台记录returnTemp变量时,我看到该条目丢失了它的mappedTo条目(应该发生),而没有被新的userField取代。

但是,当我console.log(returnTemp[userField])时,它会显示带有预期的mappedTo键的输入值:值对。

不知道这是怎么回事。

1 个答案:

答案 0 :(得分:0)

根据userField的用法,我可以得出它可能是ArrayString

但是您对以下表达式做了一些奇怪的事情:

var XUnit = statePiece[userField];

鉴于userFieldString,上面的表达式很好。 但是,如果是数组,则XUnit将是undefined

如果在下一行中userFieldArray的情况下也进行相同的操作,则意味着您将userField.toString()设置为映射到undefined的键。

let returnTemp = { ...temp, [userField]: XUnit };

我要分配XUnit,条件是检查userFieldString并返回temp

else {
    //is string
    var XUnit = statePiece[userField];
    //...
}
return temp;