Vue.directive(el.addEventListener) + v-model
Здравствуйте, я столкнулся с проблемой, что в случае одновременного использования директивы вешающей слушатель и v-model — Vue.js при каждом изменении переменной заново ставит слушатель.
Пример <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <input id="vue" type="text" v-model="variable" v-my> <script> Vue.directive('my', function (el) { el.addEventListener('input', event => { alert(el.value); }, true); }); var vue = new Vue({ el: '#vue', data: { variable: "", } }) </script> алерт должен выводится один раз, но изза того что vue ставит много слушателей со временем алертов много. Для решения можно использовать v-once, но в таком случае перестает обновлятся переменная. Можно ли поставить какой-то атрибут на v-my чтоб именно ета директива запускалась всего один раз, а переменная обновлялась... |
А докуменацию почитать?
В данном случае тебе, очевидно, нужен bind хук. |
Спасибо, могу ли я попросить пример как использовать bind, например в случае директив я использовал v-my, как ето будет выглядить в bind
Простите за глупые вопросы, но очень-новичкам даже документация иногда не по зубам)) |
fori,
:-? <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <input id="vue" type="text" v-model="variable" v-my> <script> Vue.directive('my', { bind:function (el) { el.addEventListener('input', event => { alert(el.value); }, true); } }); var vue = new Vue({ el: '#vue', data: { variable: "", } }) </script> |
fori,
или так локально <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <input id="vue" type="text" v-model="variable" v-my> <script> var vue = new Vue({ el: '#vue', data: { variable: "", }, directives: { my: { bind: function(el) { el.addEventListener('input', event => { alert(el.value); }, true) } } } }) </script> |
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <input id="vue" type="text" v-model="variable"> <script> var vue = new Vue({ el: '#vue', data: {}, computed: { variable: { get() { }, set(value) { alert(value) } } } }) </script> Почему не делать это в сетере модели ? :blink: addEventListener здесь как костыль, (v-on:input, @input) если события нужны |
Vlasenko Fedor,
:thanks: |
Часовой пояс GMT +3, время: 10:55. |