Почему my:search-input .функция синхронизации вызывается дважды?

#javascript #vue.js #asynchronous #synchronization #vuetify.js

#javascript #vue.js #асинхронный #синхронизация #vuetify.js

Вопрос:

В моем коде ручка https://codepen.io/aaronk488/pen/MWbKNOq?editors=1011 все работает, но моя функция синхронизации search вызывается дважды, и я не знаю почему. Я добавил условный оператор, чтобы мой код работал, но мне любопытно, есть ли причина, по которой функция синхронизации вызывается дважды.

Вот мой HTML

 <div id="app">
<v-app>
    <v-container >
    <v-row >
        <v-col cols="4" md="4">
        <v-autocomplete
            ref="autocomplete"
            label="Autocomplete"
            :items="components"
v-model="first"
            :search-input.sync="search"
            hint="need to open menu on focus, just like click"                     persistent-hint
                       
        ></v-autocomplete>
          </v-col>
          <v-col cols="4" md="4">
            <v-autocomplete
                         v-model="second"
            ref="autocomplete2"
            label="Autocomplete2"
            :items="components2"
                item-text="name"
  item-value="id"             
                         
                            
            hint="need to open menu on focus, just like click this"                     persistent-hint
        ></v-autocomplete>
        </v-col>
    </v-row>
    </v-container>
</v-app>
</div>
 

и вот мой js

 new Vue({
  el: "#app",
  vuetify: new Vuetify(),
  data: {
    search: null,
    first: "",
    second: "",
        components: [
          'Autocompletes testOne', 'Comboboxes testTwo', 'Forms', 'Inputs', 'Overflow Buttons', 'Selects', 'Selection Controls', 'Sliders', 'Textareas', 'Text Fields',
        ],
            components2: [
          'Autocompletes2', 'Comboboxes2', 'Forms2', 'Inputs2', 'Overflow Buttons2', 'Selects2', 'Selection Controls2', 'Sliders2', 'Textareas2', 'Text Fields2', 
        ],

  },
  watch: {
    search(val){
      if(val){
        console.log(val)
      const temp = val.split(" ");
      console.log(temp)
        // this.components = [];
        // this.components2 = [];
        this.components.push(temp[0]);
        console.log(this.components);
        if(!temp[1]){
          return;
        }
         console.log(temp[1]);
        this.components2.push(temp[1]);
      this.first = temp[0];
      this.second = temp[1];
      console.log(this.second )
      }
      
    },
  },
})
 

и вот вывод на консоль
введите описание изображения здесь

Ответ №1:

Вы меняете свойство, связанное с v-model, на этот поисковый ввод в вашем наблюдателе. Эта линия:

 this.first = temp[0];
 

поскольку это первое свойство связано с v-model, оно изменяет поисковый ввод. Вы заметите, что этого не произойдет, если вы выберете элемент только с одним словом, потому что это единственное слово будет таким же, как temp[0] .