Компонент Vue на основе класса не работает с v-model и vuex

#typescript #vue-component #vuex #bootstrap-vue #vue-property-decorator

#typescript #vue-компонент #vuex #bootstrap-vue #vue-свойство-декоратор

Вопрос:

Я хочу добиться следующего: у меня есть форма ввода, и мне нужно привязать ее к значению соответствующего сохраненного состояния в vuex.

  • Всякий раз, когда значение в поле изменяется при взаимодействии с пользователем, хранилище перезаписывается обновленным значением.
  • Всякий раз, когда значение обновляется в хранилище vuex, в поле отображается обновленное значение

Следующий фрагмент кода должен описать это довольно хорошо:

 <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>
  

Приведенный выше пример будет сохранять обновленное значение для каждого изменения, которое пользователь вносит в графический интерфейс, однако, если я изменю значение соответствующего сохраненного экземпляра в vuex, в поле все равно будет отображаться старое значение вместо обновленного.

Как я могу достичь упомянутой функциональности, описанной в списке вверху? Возможно ли это каким-либо образом с компонентами на основе класса?

Комментарии:

1. Вы используете его :id="inputField.name" в своем шаблоне, но вы использовали getInputById(this.inputField.id).value в скрипте. Не в этом ли причина вашей проблемы?

2. Хороший момент, но, к сожалению, это не так. Во входных данных есть как имя, так и идентификатор. Я мог бы легко заменить его (уже сделал в edit), и это привело бы к той же проблеме.

Ответ №1:

Вы инициализировали свое значение хранилища? Наличие неинициализированного значения хранилища обычно приводит к нереактивным свойствам даже в хранилище vuex.

Комментарии:

1. Спасибо за ваш ответ. На самом деле я решил это давным-давно и забыл об этом сообщении. Я реструктурировал всю концепцию, поэтому трудно сказать, было ли это частью решения.