Идиоматический способ передачи и события, и локальной переменной vue в связанную функцию - PullRequest
0 голосов
/ 17 февраля 2019

Я пытался выяснить, как получить доступ к элементу v-for и исходным данным о событии к связанной функции для события в vue.js, но не смог найти его в документации.

Что я хочу:

<div class="card pickup" v-for="pickup in pickups">
        <select v-on:change="locationChanged">

с locationChanged вызовом следующего метода в моем объекте vue:

vuePickup = new Vue({
    el: '#pickups',
    data: {
        pickups: pickups,
    },
    methods: {
        locationChanged: (event, pickup) => {
            pickup.newLocation = event.target.value == -1;
        }
    },
});

, который требует доступа к обоим рассматриваемым элементами объект, который был привязан к этой части v-модели.

По умолчанию, используя v-on:change="locationChanged", вызывается locationChanged с событием, и элемент может быть достигнут через event.target, но я не смог 'Не могу найти способ доступа к объекту pickup, с которым я связывал конкретный элемент.

Использование v-on:change="locationChanged(pickup)" вместо этого вызывает locationChanged для вызова с нужной мне моделью, но затем я теряю ссылку на рассматриваемый HTML-элемент.

То, что я в итоге делал, это настройкадо локальной функции в самой модели, чтобы переслать значения:

v-on:change="e => locationChanged(e, pickup)"

, которая предоставляет мне необходимую информацию.

Однако я чувствую, что это неправильный подход, так как а) я не смог найти его в документации и б) он не самый удобный для пользователя.

@ Лоулесс указал мнена существующий вопрос от другого пользователя, который в общих чертах задавался вопросом, как получить доступ к событию (по сравнению с моей целью доступа к цели события, т.е. к элементу, вызвавшему событие), но мой вопрос о идиоматическомподход здесь остается, так как это очень простой вопрос (обратные вызовы для перечисляемых элементов), и тем не менее оба решения (мое и связанный вопрос) не очень очевидны и не рассматриваются в руководстве vue.js.

Есть либолее идиоматический подход, предпочитаемый сообществом vue.js?

1 Ответ

0 голосов
/ 23 февраля 2019

Другой вопрос о StackOverflow (на который указал мне @Lawless) задавал тот же вопрос, с которого я начал (а именно, как получить доступ к данным события в привязке для перечисляемого элемента, а не одногосвязан с объектом верхнего уровня vue.js), предоставляя другой, более прямой (но даже еще более загадочный) подход к достижению того же самого.

Напомним, начиная с элемента HTML, созданного привязанным vue.jsк объекту vuejs, полученному с помощью перечисления

<div class="card pickup" v-for="pickup in pickups">
        <select v-on:change="locationChanged">
            ...
        </select>
</div>

Как получить доступ как к вспомогательному объекту (здесь pickup), так и к ссылке на элемент select, чтобы вы могли запросить его новое значение и действовать соответственно.

Мой подход состоял в том, чтобы воспользоваться тем, что vuejs передает событие по умолчанию, и обойти тот факт, что vuejs подавляет параметр события, если вы явно предоставили локальный объект в качестве параметра в обратном вызове, используялямбда:

<div class="card pickup" v-for="pickup in pickups">
        <select v-on:change="e => locationChanged(e, pickup)">
            ...
        </select>
</div>

Явное добавление интересующего меня элемента в обратный вызовСтоимость дополнительного вызова функции / уровня косвенности.

Предыдущий ответ предоставил решение, которое использует явно определенную переменную vuejs $event, которая всегда переводится на нативныйСобытие браузера, которое можно напрямую использовать в дополнение к любым другим переменным, которые вы хотите записать, что делает решение похожим на это:

<div class="card pickup" v-for="pickup in pickups">
        <select v-on:change="locationChanged($event, pickup)">
            ...
        </select>
</div>

, которое требует более глубоких знаний vuejs, но избегает закрытия.

Тем не менее, я продолжал искать, потому что не чувствовал, что это решение соответствует духу vuejs (и все, что я когда-либо слышал, это то, что все бредят о том, насколько классны документы vuejs, но этого ответа явно не было, носкорее нужно было соединить вместе).

Кажется, я столкнулся с распространенным случаем узнать, чего я хочу, но не как туда добраться ... и мои предыдущие знания предметной области, которые исключали vuejs, привели меня к-идиоматический подход в моем вопросе, а не то, как я решил бы t если бы я начал изучать разработку интерфейса с vue.js, в первую очередь.

В конце я нашел очевидный ответ, который искал, ответ, который чувствовал, что это был правильный "путь vuejs"сделать это и правильное идиоматическое решение моего первоначального вопроса:

Проблема в том, что я смешал стандартную интроспекцию JS / DOM с моделью vuejs, и возникло трение при переходе между двумя (дырявые абстракции ивсе).Я хотел иметь собственный дескриптор элемента select вместе с объектом vuejs (pickup), когда я должен был использовать vuejs исключительно для выполнения того, что мне было нужно, в конечном итоге путем привязки элемента select к vuejs.объект / свойство и ссылка на него прямо в моем связанном обратном вызове:

<div class="card pickup" v-for="pickup in pickups">
        <select v-model:pickup.location v-on:change="locationChanged(pickup)">
            ...
        </select>
</div>

Теперь, когда элемент select привязан к свойству location моей модели vuejs, я могу напрямую запросить его состояние / значение вмой locationChanged обработчик и передает мой pickup объект без необходимости использования $event или замыкания:

let vuePickup = new Vue({
    el: '#pickups',
    data: {
        pickups: pickups,
    },
    methods: {
        locationChanged: (pickup) => {
            pickup.newLocation = pickup.location == -1;
        }
    },
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...