為什么自定義Vue指令會(huì)在未使用的輸入框中生效?

為什么自定義Vue指令會(huì)在未使用的輸入框中生效?

vue自定義指令誤判:看似生效于未使用輸入框

在Vue.JS開(kāi)發(fā)中,自定義指令有時(shí)會(huì)產(chǎn)生意料之外的行為,例如,指令似乎作用于未顯式綁定的元素。本文將分析一個(gè)案例,其中自定義指令用于數(shù)字輸入校驗(yàn),卻意外影響了未綁定指令的輸入框。

問(wèn)題描述

一個(gè)全局指令validatenumber旨在限制輸入框只能輸入數(shù)字:

Vue.directive('validateNumber', {     bind(el, binding, vnode) {         let lastData = null;         el.onkeyup = (e) => {             if (String.fromCharCode(e.keyCode) === 'E' || String.fromCharCode(e.keyCode) === 'KeyE') {                 e.target.value = lastData;                 return false;             } else {                 lastData = e.target.value;             }             e.target.value = e.target.value.replace(/[^d]/ig, '');              let _this = vnode.context;             _this.AccessNestedObject(_this, vnode.data.model.expression, e.target.value);              if (binding.expression && e.target.value) {                 let obj = (new Function("return " + binding.expression))();                 let keys = Object.keys(obj);                 let values = Object.values(obj);                 if (keys[0] === 'min') {                     if (e.target.value < values[1]) {                         e.target.value = values[1];                     }                 }             }              el.dispatchEvent(new Event('input'));         };     } });

該指令應(yīng)用于第一個(gè)輸入框(校驗(yàn)等待時(shí)間):

<el-form-item label="等待時(shí)間" prop="timeInterval">   <el-input id="alarm-rule-time-interval" style="width:100%" type="number" v-model="alertRulesForm.timeInterval" v-validateNumber>     <template slot="append">秒</template>   </el-input> </el-form-item>

然而,第二個(gè)輸入框(空間間隔)未應(yīng)用該指令:

立即學(xué)習(xí)前端免費(fèi)學(xué)習(xí)筆記(深入)”;

<el-form-item label="空間間隔" prop="distanceInterval">   <el-input id="alarm-rule-distance-interval" type="number" v-model="alertRulesForm.distanceInterval">     <template slot="append">米</template>   </el-input> </el-form-item>

令人困惑的是,第二個(gè)輸入框也表現(xiàn)出數(shù)字校驗(yàn)行為,禁止輸入非數(shù)字字符。

問(wèn)題分析

最初的假設(shè)是指令錯(cuò)誤地綁定到了第二個(gè)輸入框。然而,仔細(xì)檢查代碼后發(fā)現(xiàn),第二個(gè)輸入框的onkeyup事件并沒(méi)有被validateNumber指令觸發(fā)。

問(wèn)題的根源在于el-input組件的type=”number”屬性。此屬性本身就限制了輸入,只允許數(shù)字和小數(shù)點(diǎn)。因此,第二個(gè)輸入框的限制并非來(lái)自自定義指令,而是type=”number”的內(nèi)置行為。

這個(gè)案例強(qiáng)調(diào)了在調(diào)試Vue應(yīng)用時(shí),仔細(xì)區(qū)分組件自身屬性和自定義指令行為的重要性。 看似指令生效于未綁定元素的情況,可能源于其他因素的影響,而非指令本身的錯(cuò)誤。

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享