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

Я пытался выяснить, как получить доступ как к элементу 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)"

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

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

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

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

А вы пробовали <select v-on:change = "locationChanged($event, pickup)">? Источник – stackoverflow.com/questions/40956671/…

Mr Rethman 17.02.2019 21:58

Возможный дубликат Передача события и аргумента v-on в Vue.js

tony19 18.02.2019 02:13
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
2
249
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Другой вопрос в 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, привели меня к неидиоматическому подходу в моем вопросе, а не к тому, как я было бы его решил если бы я начал изучать разработку интерфейса с 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;
        }
    },
});

Другие вопросы по теме