Доступ к массиву $ refs внутри объекта просмотра экземпляра Vue JS

#javascript #arrays #vuejs2 #vue-component #vuetify.js

#javascript #массивы #vuejs2 #vue-компонент #vuetify.js

Вопрос:

Я создаю Vue JS SPA, и у меня есть таблица данных Vuetify внутри v-app. Я пытаюсь установить переменную внутри объекта наблюдения для вычисляемого свойства filteredItems внутри таблицы данных, но я не уверен, как получить доступ к массиву $ refs внутри экземпляра.

Я знаю, что данные доступны внутри экземпляра с помощью:

 this.$refs['prospectsTable'].filteredItems
  

Однако то же самое ссылочное имя не работает внутри объекта наблюдения. Я пытался:

 $refs['prospectsTable'].filteredItems: function(newItems) {
            console.log(newItems);
        }

amp;

this.$refs['prospectsTable'].filteredItems: function(newItems) {
            console.log(newItems);
        }
  

Как я могу получить доступ к массиву $ refs внутри функции просмотра?

 var p = new Vue({
    el: '#prospectsApp',
    data: () => ({}), 

    watch: function() {
        // How can i access the $refs array inside of the watch function?
        $refs['prospectsTable'].filteredItems: function() {

        }
    }
});




<div id="prospectsApp">
    <v-app id="inspire" v-cloak>
        <v-data-table ref="prospectsTable" v-model="selected" :headers="headers" :items="prospects" :pagination.sync="pagination" select-all item-key="id" class="elevation-1" > 
            <template v-slot:headers="props">
                <tr>
                    <th><v-checkbox :input-value="props.all" color="#c79121" :indeterminate="props.indeterminate" primary hide-details @click.stop="toggleAllSelected"></v-checkbox></th>
                    <th v-for="header in props.headers" :key="header.text"
                        :class="['column sortable', pagination.descending ? 'desc' : 'asc', header.value === pagination.sortBy ? 'active' : '']"
                        @click="changeSort(header.value)">
                        <v-icon small>arrow_upward</v-icon>
                        @{{ header.text }}
                    </th>
                </tr>
            </template>

            <template v-slot:items="props">
                <tr :active="props.selected" @click="props.selected = !props.selected">
                    <td class="text-center align-middle">
                        <v-checkbox :input-value="props.selected" primary hide-details color="#c79121"></v-checkbox>
                    </td>
                    <td class="text-center align-middle">@{{ props.item.id }}</td>
                    <td>
                        <div>@{{ props.item.name }}</div>
                        <div v-show="props.item.contacted" class="label label-success"><span class="fa fa-check-square-o"></span> Contacted!</div>
                    </td>
                    <td>@{{ props.item.foodcat.title }}</td>
                    <td>@{{ props.item.contact_fname }}<span v-if="props.item.contact_lname"> @{{ props.item.contact_lname }}</span><span v-if="props.item.contact_title">, @{{ props.item.contact_title }}</span></td>
                    <td>@{{ props.item.response_notes }}</td>
                    <td class="text-right align-middle">
                        <button class="btn btn-primary btn-sm" @click="updateContacted(props.item.id)" v-show="!props.item.contacted"><span class="fa fa-check-square-o"></span> Mark As Contacted</button>
                        <button class="btn btn-primary btn-sm" @click="editProspect(props.item.id)"><span class="fa fa-edit"></span> Edit Lead</button>
                        <button class="btn btn-danger btn-sm" @click="removeProspect(props.item.id)"><span class="fa fa-trash"></span> Delete Lead</button>
                    </td>
                </tr>
            </template>
            <template slot="no-data">
                <p class="text-xs-center">No Data</p>
            </template>                                
        </v-data-table>
    </v-app>
</div>
  

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

1. вы пробовали import Vue from "vue"; , а затем использовали глобальную Vue.$refs переменную?

Ответ №1:

Лучший способ — добавить наблюдателя к смонтированному. Попробуйте следующий код.

 mounted(){
       this.$watch(
        () => {
            return this.$refs.prospectsTable.filteredItems
        },
      (val) => {
        console.log(val)
        alert('App $watch $refs.counter.i: '   val)
      }
    )
  }
  

Кодовая ссылка — https://codesandbox.io/s/j7wjjypnxw

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

1. Спасибо. Это было полезно мне. Нравится

Ответ №2:

Он может находиться в $ root из-за того, где объявлен его компонент.

Если $refs.prospectsTable не работает, попробуйте $root.$refs.prospectsTable .

Возможно, также это должны быть ключи в наблюдателе в виде строки, вот так:

 watch: {

   '$refs.prospectsTable.filteredItems': function (value) {
       console.log(value);
   }


}