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, время: 07:15. |