在 Vue.js 單文件組件中,兩個密碼輸入框(password、confirm)未包裹在 <form> 中,需在第二個輸入框失去焦點(blur)時驗證兩次輸入是否一致。原代碼嘗試用內聯 onblur="equalcheck()" 調用全局函數,但報 equalcheck is not defined,且直接用 password.value 獲取值在 Vue 環境下不生效。
<div class="form-group">
<input v-model="user.pass" type="password" placeholder="密碼">
</div>
<div class="form-group">
<input v-model="user.confirm" type="password" placeholder="密碼確認" onblur="equalcheck()">
</div>
<script>
// 組件內部結構
module.exports = {
data() { return { user: { pass: '', confirm: '' } } },
methods: { /* 這裡該放驗證邏輯 */ }
}
</script>
onblur="equalcheck()" 會嘗試在全局作用域查找 equalcheck,但該函數定義在組件 methods 或 <script> 內部,不在全局,故報「未定義」。password.value 繞過了 v-model 的雙向綁定,無法觸發響應式更新,且在組件銷毀後可能引用舊 DOM。id,即使用 document.getElementById 也無法定位。@blur 綁定方法<input
v-model="user.pass"
type="password"
id="password"
placeholder="密碼"
@blur="checkPasswordMatch"
>
<input
v-model="user.confirm"
type="password"
id="confirm"
placeholder="密碼確認"
@blur="checkPasswordMatch"
>
<!-- 可選:顯示錯誤提示 -->
<span v-if="passwordError" class="error">兩次輸入的密碼不一致</span>
methods: {
checkPasswordMatch() {
if (this.user.pass !== this.user.confirm) {
this.passwordError = true;
// 可選:清空確認框、聚焦等
// this.user.confirm = '';
// this.$refs.confirmInput.focus();
} else {
this.passwordError = false;
}
}
}
data() {
return {
user: { pass: '', confirm: '' },
passwordError: false
};
}
watch 實時驗證若需輸入過程中即時提示,可監聽 user.confirm:
watch: {
'user.confirm'(newVal) {
this.passwordError = newVal !== this.user.pass;
}
}
@event 或 v-on:event 綁定組件方法。this.user.pass 和 this.user.confirm,無需操作 DOM。ref="confirmInput" 並通過 this.$refs.confirmInput 訪問。v-if/v-show 控制錯誤提示顯示,體驗更佳。遵循 Vue 的響應式數據流,密碼一致性驗證只需幾行代碼,既優雅又健壯。拋棄 jQuery 時代的 DOM 思維,擁抱數據驅動開發。