VueJS2 - 计算 property/method 正在设置 Vue.data?

VueJS2 - computed property/method is setting Vue.data?

我一直在使用 Vue 构建表单,我将需要提交的所有数据复制到一个单独的 params 对象,对其进行处理,然后通过 AJAX 提交该对象。一切正常,除了一个烦人的数组似乎直接设置了我的 Vue.data 对象。

这是我的代码:

getParams: function () {
  return {
    organism:           this.organism,
    species_id:         this.speciesID,
    bioinformatics:     this.bioinformatics,
    // ... more params
  }
}

sanitizeParams: function() {
  var params = this.getParams();

  // other validations here (that work fine)     

  if(this.isOther(this.bioinformatics)) {

    console.log(this.bioinformatics) // ['other']
    console.log(params.bioinformatics) // ['other']

    var idx = params.bioinformatics.indexOf('other');
    params.bioinformatics.splice(idx,1);

    console.log(this.bioinformatics) // [] <-- Why does this change?!
    console.log(params.bioinformatics) // []        

    params.bioinformatics.push(this.bioinformaticsOther);
  }
  return params;
},

saveForm: function () {
  var params = this.sanitizeParams();
  if(this.formValidation) {
    // send ajax with correct params
  }
},

Bioinformatics 是一个复选框选择,在其选项中包含 "Other"——这反过来会打开一个输入框,用户可以在其中插入自己的文本。我想要完成的是从 params.data.bioinformatics 数组中删除 'other' 并向其添加 Vue.data.bioinformaticsOther

我的 Vue.data.bioinformatics 也发生了变化! params.bioinformatics.splice 运行后,两个数组都会发生变化,而不仅仅是我的本地参数对象(正如我预期的那样)。这反过来导致我的 UI 停止正常工作,因为 Vue 在数据中存储的选项值不再是 'other'。我开始将这些函数作为计算属性,但我将它们更改为方法以查看是否可以解决问题,但同样的事情发生了(因此得名)。

总的来说,我对 Vue 和 JS 还是很陌生,所以如果这真的很明显,我很抱歉,但我真的傻眼了一段时间(特别是因为我的其他非数组选项使用相同的方法工作得很好)。

很抱歉,如果此描述令人困惑,我会根据需要添加更多数据。

编辑: 在代码中添加了一些 console.log 以便更容易理解问题。还解决了描述中错误的变量名。

我想你的问题是 getParams。如所写,getParams 将 return 一个对象,其中生物信息学通过引用传递。换句话说,params.bioinformaticsdata.bioinformatics 是指向 相同的 数组的指针。因此,当您修改 params.bioinformatics 时,您会看到正在记录的行为。相反,您可能会将生物信息学 属性 作为 副本 而不是参考。

getParams: function () {
  return {
    organism:           this.organism,
    species_id:         this.speciesID,
    bioinformatics:     this.bioinformatics.slice(),
    // ... more params
  }
}