Vue2自定义指令改变DOM值后未刷新data中绑定属性的值

Posted 古宝只

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue2自定义指令改变DOM值后未刷新data中绑定属性的值相关的知识,希望对你有一定的参考价值。

标签(空格分隔): Vue


自定义指令用于过滤输入框,只允许输入数字:

Vue.directive(\'numberOnly\', {
    bind: function (el, binding) {
        el.handler = function () {
            el.value = el.value.replace(/[^\\d]/g, \'\');
        }
        el.addEventListener(\'input\', el.handler);
    },
    unbind: function (el) {
        el.removeEventListener(\'input\', el.handler);
    }
});

在DOM中使用如下所示:

<input type="text" name="image-code" class="input" placeholder="图片验证码" autocomplete="off" v-model="imageCode" v-number-only />

此时可以实现在输入框中只能输入数字,输入其它字符不予显示。但是在提交表单的时候使用this.imageCode却发现,字符中有一个刚才试验的非数字字符,如图所示:

vue-custom-directive

这该怎么办呢?通过阅读文档,我目前使用传递自定义指令value属性的方法来data中的属性赋值。使用这个方法,可以不绑定v-mode="",当然绑定了也没什么区别:

Vue.directive(\'numberOnly\', {
    bind: function (el, binding) {
        el.handler = function () {
            el.value = el.value.replace(/[^\\d]/g, \'\');

            // 手动刷新data中绑定的属性
            binding.value.set[binding.value.name] = el.value;
        }
        el.addEventListener(\'input\', el.handler);
    },
    unbind: function (el) {
        el.removeEventListener(\'input\', el.handler);
    }
});

此时在DOM中就需要传递两个属性:

<input type="text" name="image-code" class="input" placeholder="图片验证码" autocomplete="off" v-model="imageCode" v-number-only="{ set: this, name: \'imageCode\' }" />

这样this.imageCode当中就不会出现非数字字符串了。

你可能想说,直接在set中指定this.imageCode,然后在自定义指令中binding.value.set = el.value;,不就可以了嘛。然而经过测试这样是起不到作用的。

这个方案并不优雅,如果有其它解决方案,还望不吝赐教。

以上是关于Vue2自定义指令改变DOM值后未刷新data中绑定属性的值的主要内容,如果未能解决你的问题,请参考以下文章

Vue2.0笔记——自定义指令

Vue2:自定义指令,如 v-if

Vue2.0 - 自定义指令 vue-directive

Vue2.x Todo之自定义指令实现自动聚焦的方法

vue2自定义指令-加载指令v-loading和占位图指令v-showimg

vue.js 侦听DOM结构改变,要不要自己写一个自定义指令