Компонент Vue Bootsrap не отображается после обновления хранилища Vuex. использование watch и nextTick

#vue.js #bootstrap-4 #vuex #bootstrap-vue

#vue.js #bootstrap-4 #vuex #начальная загрузка-vue

Вопрос:

В приложении vue cli я не могу понять, как сделать повторный рендеринг объекта в компоненте, когда в хранилище Vuex происходят изменения, внесенные другим компонентом. В этом примере я меняю curDocType переменную, но значение b-form-select объекта остается прежним (изначально 0). Не уверен, что проблема в стороне Bootsrap или в Vue.

У меня это в одном component1.vue :

HTML

 <b-form-select v-model="curDocType" :options="options" class="mb-3" v-bind:style="{'background-color': activeColor}">
  

СКРИПТ

 data() {
        return {           
        options: [
                { value: 1, text: 'Sale' },
                { value: 5, text: 'CrMemo' },
                { value: 0, text: 'Quote' },
                { value: 4, text: 'CashIn' },                                  
            ],
        curDocType : this.$store.state.curDocType,
        activeColor : '#9EDE7D' //Red
        }
    },


watch:{
     curDocType(newval,oldval){            
            if (newval == 5) this.activeColor = '#D67373'
            else this.activeColor = '#9EDE7D'
            if (this.$store.state.curOrder == ""){
                this.$store.commit('setcurDocType', newval)
            }else{     
              this.$nextTick(() => {this.curDocType=this.$store.state.curDocType})
            }
         }
       }
  

Теперь у меня есть другой component2.vue , где я вызываю метод, который изменяет curDocType в хранилище Vuex:

 convertOrder(){
        if (this.$store.state.curOrder != ""){
            axios.post(this.ApiBaseUrl   'PosFunctions/QuoteToOrder',
                    JSON.stringify(this.$store.state.curOrder),
                    {headers: {"Content-Type": "application/json"}})            
            .then((response) => {  
                var res = response; 
                this.$store.commit('setcurDocType', 1) //!!IMPORTANT
                this.RecoverSale(response.data.return_value)
                                
            })
        }
    }
  

Store.js :

  setcurDocType (state, DocType) {
      state.curDocType = DocType
    },
  

Версии:

 bootstrap-vue@2.16.0
bootstrap@4.5.2"
vue@2.6.12
  

Ответ №1:

Проблема должна исходить из data(), я не думаю, что вызов $store из него будет работать. (даже вызов «this» в нем является ошибкой, но я не уверен на 100%)

Кроме того, вы не должны устанавливать состояние хранилища в v-model, поскольку состояние хранилища является только «получателем», а v-model — двусторонней привязкой (получатель установщик)

Вы могли бы выполнить вычисленное :

 curDocType : {
    get(){
        return this.$store.state.curDocType
    }
    set(value){
        this.$store.commit('setcurDocType', 1);
    }
}
  

При этом привязка curDocType к v-model выполняется правильно.

Надеюсь, это решит вашу проблему