如何将数据属性设置为从 Vuex 返回的值 getter

How to set data properties to value returned from Vuex getter

我有一个 Vue 组件,它将根据用户先前在上一个组件中单击的内容显示数据。当他们最初点击时,我设置了 'current' 索引。然后当他们到达下一页时,我有一个 getter 将查找数据数组和 return 'current' 数据。

他们被重定向到的组件是一个他们可以编辑的表单。我希望能够预先填充 'current' 数据。不是作为占位符,而是作为实际值,以便他们可以直接编辑它。

问题是我不知道如何将 getter 中的值 return 设置为数据函数值,以便它们可以与 v-model 绑定。

HTML

<input type="text" class="form-control" id="nickname1" v-model="name" name="name">
<input type="text" class="form-control" id="address1" placeholder="" v-model="address" name="address" > 
<input type="text" class="form-control" id="city1" placeholder="" v-model="city" name="city" > 

VUE

data: function() {
    return {
        name: this.currentArea.title,
        address: this.currentArea.address,
        city: this.currentArea.city,
        state: this.currentArea.state
    }
},
computed: {
    currentArea() { return this.$store.getters.currentArea }
}

*this.currentArea.title 和 currentArea.title 不起作用。

*如果我绑定占位符,数据显示正确,所以 getter 函数 returning currentArea 正确

data 方法仅在初始化期间触发一次, 设置计算属性之前。因此,从 data 方法中引用 currentArea 将不起作用,因为它在执行时将是 undefined

如果 this.$store.getters.currentArea 预计不会在该组件的生命周期内发生变化,最简单的方法是在 mounted 挂钩中设置一次数据属性:

data() {
  return {
    name: '',
    address: '',
    city: '',
    state: ''
  }
},
mounted() {
  let area = this.$store.getters.currentArea;
  this.name = area.name;
  this.address = area.address;
  this.city = area.city;
  this.state = area.state;       
} 

或者,如果您知道此组件的数据属性将始终与 currentArea 相同,您可以在 data 中简单地 return this.$store.getters.currentArea方法直接:

data() {
  return this.$store.getters.currentArea;
}

@thanksd:谢谢你的回答。 我正在处理状态存储在 vuex 中的场景,暂时将不完整的组件发送到组件,然后通过获取更新。 它应该可以在表单中编辑。

我的解决方案是在 vuex 中用 getter 导出部分状态:

getters: {
  getItemDetail: (state, getters) => (id) => {
    let item = state.openedItems.items.find(i => i.id === id);
    return item ? item.data : null;
  }
}

通过组合数据、计算和监视属性在组件中使用它(并在 lodash 的帮助下深度克隆对象):

data () {
  return {
    itemDetail: null
  };
},
computed: {
  itemData () {
    return this.$store.getters.getItemDetail(this.item.id);
  }
},
watch: {
  itemData (n, o) {
    this.itemDetail = _.cloneDeep(n);
  }
}

最后我将输入绑定到 "itemDetail"(在我的示例中使用 elemen 开关):

<el-switch v-model="itemDetail.property"></el-switch>

对我来说(但我对 Vue 还很陌生),这似乎是一个很好的工作妥协。