【问题标题】:How to set data properties to value returned from Vuex getter如何将数据属性设置为从 Vuex getter 返回的值
【发布时间】:2017-12-03 17:26:40
【问题描述】:

我有一个 Vue 组件,它将根据用户之前在前一个组件中单击的内容来显示数据。当他们最初点击时,我设置了“当前”索引。然后当他们进入下一页时,我有一个吸气剂,它将查看数据数组并返回“当前”数据。

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

问题是我不知道如何将 getter 返回的值设置为数据函数值,以便它们可以与 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函数正确返回currentArea

【问题讨论】:

    标签: data-binding vue.js vuex


    【解决方案1】:

    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 方法中直接返回this.$store.getters.currentArea

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

    【讨论】:

    • 绝妙的答案,它现在工作得很好。感谢您的帮助!
    • 如果相反,this.$store.getters.currentArea 预计会发生变化?
    • @MatteoPiazza 然后使用计算属性。 vuejs.org/v2/guide/computed.html
    • 为什么挂载没有创建?你能补充一些解释吗?
    【解决方案2】:

    @thanksd:谢谢你的回答。 我正在研究将状态存储在 vuex 中的场景,暂时将不完整的状态发送到组件,然后通过 fetch 进行更新。 并且应该可以在表单中进行编辑。

    我的解决方案是在 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 开关):

    &lt;el-switch v-model="itemDetail.property"&gt;&lt;/el-switch&gt;

    对我来说(但我对 Vue 还很陌生),这似乎是一个很好且可行的折衷方案。

    【讨论】:

    • 这已经困扰了我一个星期,而你的答案终于有所帮助 - 非常感谢!
    • 这也是我想出的解决方案,但我并不觉得这是最好的解决方案,直到我在这里找到它。感谢您成为我的安全毯
    猜你喜欢
    • 2021-09-30
    • 2023-03-10
    • 2019-07-31
    • 2021-05-04
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多