Vue наблюдает за изменением нескольких привязок в выпадающем обновлении

#javascript #html #vue.js #vuejs2 #vue-component

#javascript #HTML #vue.js #vuejs2 #vue-компонент

Вопрос:

Мне требуется выпадающий список поиска, в котором я должен иметь возможность отслеживать несколько изменений данных. В настоящее время у меня есть это в моем html:

 <input list="allUsernames" type="text" v-model="selectedUser">
<datalist id="allUsernames">
  <option v-for="(user, index) in allUsers" 
   :id="user.USERID" 
   :value="user.USERNAME" 
   :email="user.EMAIL">
  </option>
</datalist>
 

Мой тег данных скрипта выглядит следующим образом:

 data(){
  return{
    allUsers: [],
    selectedUserID: '',
    selectedUserEmail: '',
    selectedUser: '',
  }
}
 

allUsers заполняется вызовом SQL, содержащим USERID , USERNAME и EMAIL .

Я хочу, чтобы a watch мог получить :id и :email часть тега option, но прямо сейчас я могу получить значение только по умолчанию:

 watch: {
  selectedUser(val, oldval)
  {
    console.log('this only returns the :value binding:'   val);
    //how do I get :id and :email values?
  }
},
 

Я хочу установить selectedUserID и selectedUserEmail на основе сделанного выбора опции выпадающего списка, используя vbindings :id and :email (чтобы я получал значения user.USERID and user.EMAIL ), как мне это сделать?

Ответ №1:

Вы можете сделать это более аккуратно, используя только v-model данные, и наблюдение не требуется:

 data(){
  return{
    allUsers: [],
    selectedUser: ''
  }
}
 

value Для параметров требуется только привязка:

 <option v-for="(user, index) in allUsers" :value="user.USERNAME"></option>
 

Используйте вычисляемый для отслеживания полного объекта выбранного пользователя:

 computed: {
  selected() {
    return this.allUsers.find(user => user.USERNAME === this.selectedUser);
  }
}
 

selected Вычисляемый относится ко всему объекту выбранного пользователя, поэтому вы можете использовать selected.USERID and selected.EMAIL как в экземпляре, так и в шаблоне.

Вот демонстрация:

 new Vue({
  el: "#app",
  data(){
    return{
      allUsers: [
        { USERID: 1, USERNAME: 'name1', EMAIL: 'email1' },
        { USERID: 2, USERNAME: 'name2', EMAIL: 'email2' },
        { USERID: 3, USERNAME: 'name3', EMAIL: 'email3' },
      ],
      selectedUser: ''
    }
  },
  computed: {
    selected() {
        return this.allUsers.find(user => user.USERNAME === this.selectedUser);
    }
  }
}); 
 .display {
  margin-top: 30px;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <input list="allUsers" type="text" v-model="selectedUser">
  <datalist id="allUsers">
    <option v-for="(user, index) in allUsers" :value="user.USERNAME"></option>
  </datalist>
  
  <div v-if="selected" class="display">
    <div>ID: {{ selected.USERID }}</div>
    <div>EMAIL: {{ selected.EMAIL }}</div>
  </div>
</div> 


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

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

1. Спасибо! Это то, что я искал. Я не понял цели вычисления, но отслеживание полного объекта — это именно то, что мне требовалось 🙂