基于类的 Vue 组件不适用于 v-model 和 vuex

Posted

技术标签:

【中文标题】基于类的 Vue 组件不适用于 v-model 和 vuex【英文标题】:Class-based Vue component does not work with v-model and vuex 【发布时间】:2020-12-07 14:39:43 【问题描述】:

我想实现如下:我有一个表单输入,需要将其绑定到vuex中对应存储状态的值。

只要字段中的值通过用户交互发生更改,存储就会被更新后的值覆盖。 每当在 vuex 存储中更新值时,该字段都会显示更新后的值

下面的代码 sn-p 应该可以很好地描述它:

<template>
    <b-form-input
      :id="inputField.id"
      :placeholder="inputField.placeholder"
      :disabled="inputField.disabled"
      v-model="input"
</template>

<script lang="ts">
    import ...

    @Component
    export default class InputWrapper extends Vue 
        @Prop() element!: Input

        inputField: Input = new Input(this.element)

        get input (): string 
            return this.$store.getters.getInputById(this.inputField.id).value
        

        set input (value: string) 
            this.inputField.value = value
            this.$store.commit('setInput', this.inputField)
        
    

</script>

上面的示例将存储用户在 GUI 中所做的每次更改的更新值,但是,如果我在 vuex 中更改相应存储实例的值,该字段仍将显示旧值而不是更新值。

如何实现顶部列表中所述的功能?这对于基于类的组件是否可行?

【问题讨论】:

您在模板中使用了:id="inputField.name",但在脚本中使用了getInputById(this.inputField.id).value。这不是你问题的原因吗? 好点,但不幸的是它不是。 Input 中有 name 和 id。我可以轻松地交换它(已经在编辑中做过),它会导致同样的问题。 【参考方案1】:

您是否已初始化您的商店价值? 具有未初始化的存储值通常会导致非反应性属性,即使在 vuex 存储中也是如此。

【讨论】:

感谢您的回答。实际上我很久以前就解决了这个问题,忘记了这篇文章。我已经重新构建了整个概念,所以很难说这是否是解决方案的一部分。

以上是关于基于类的 Vue 组件不适用于 v-model 和 vuex的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的过渡不适用于 Bootstrap-vue 中的警报 v-model?

如何在 v-model 中为基于类的组件使用 getter 和 setter?

Vue 指令不适用于渲染

在 Vue 3 中,如何使自定义组件与 v-model 一起用于复选框组? [复制]

Vue组件间传值 v-model

Vue 组件:$emitting 不适用于父子组件。我做错了啥?