Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Vue.directive(el.addEventListener) + v-model (https://javascript.ru/forum/css-html/81808-vue-directive-el-addeventlistener-v-model.html)

fori 31.01.2021 18:05

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 чтоб именно ета директива запускалась всего один раз, а переменная обновлялась...

Aetae 31.01.2021 18:18

А докуменацию почитать?
В данном случае тебе, очевидно, нужен bind хук.

fori 31.01.2021 18:40

Спасибо, могу ли я попросить пример как использовать bind, например в случае директив я использовал v-my, как ето будет выглядить в bind
Простите за глупые вопросы, но очень-новичкам даже документация иногда не по зубам))

рони 31.01.2021 19:28

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>

рони 31.01.2021 19:42

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>

Vlasenko Fedor 02.02.2021 13:54

<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) если события нужны

рони 02.02.2021 14:16

Vlasenko Fedor,
:thanks:


Часовой пояс GMT +3, время: 11:51.