到昨天為止,基本的畫面已經完成了~
今天會著重在程式邏輯,要來做 [輸入帳號] 及 [輸入密碼] 的表單驗證部分
因為還沒做到串接後端,所以都先使用假資料來驗證
輸入帳號跟輸入密碼做的邏輯判斷其實差不多,先來處理輸入帳號的部分,後面做輸入密碼就直接大絕招xD
開啟上次做完的 /components/KeyinUser.vue 輸入帳號頁開始吧~
將 [繼續] 按鈕加上click事件:
<v-btn
v-text="`繼續`"
@click="verifyUser">
</v-btn>
按鈕主要的動作會是:
流程大致會是這樣~!!
做一個假的驗證資料放到data中:
data() {
return {
...,
fakedata: {
accountId: "aa1234", //假帳號
username: "Maëlyne Roux", //假姓名
},
};
},
驗證帳號的事件內容:
verifyUser() {
if (this.$refs.form.validate()) {
}
},
this.$refs.form.validate()
這段用到Vuetify-Forms表單組件驗證提交的部分
簡單說明一下,this.$refs.form
負責抓到 ref
值為 form 的表單元件,再做 validate()
驗證的動作,validate()
會將表單中 所有的 表單內容(包含輸入框、單選、多選等等)根據對應的 rules 規則來驗證
前端驗證通過後,就要呼叫後端API做帳號驗證
這邊先簡單判斷輸入值有沒有和假資料相同就好:
if (this.$refs.form.validate()) {
if (this.myAccountId === this.fakedata.accountId) {
//如果帳號成功,要做的事
} else {
//如果帳號失敗,要做的事
}
}
前面分析過假設帳號驗證成功,要做「將回覆的資訊存到data,並跳轉頁面到輸入密碼」
這裡做了兩件事:
.sync
+ $emit
的方式來操作this.$emit("update:username", this.fakedata.username);
$router.push
來處理this.$router.push({ name: "KeyinPswd" });
目前帳號驗證內容長這樣:
if (this.$refs.form.validate()) {
if (this.myAccountId === this.fakedata.accountId) {
this.$emit("update:username", this.fakedata.username);
this.$router.push({ name: "KeyinPswd" });
} else {
//如果帳號失敗,要做的事
}
}
帳號驗證失敗的部份,後端需要回傳失敗原因,前端則將這個原因呈現上去
這裡會需要再寫一個規則:
usernameRules: [
...,
(v) => this.textFieldError || this.errorMessages,
],
帳號驗證失敗時就可以這樣寫:
this.textFieldError = true;
this.errorMessages = "帳號錯誤";
錯誤內容寫成method來呼叫:
setTextFieldError(textFieldError, errorMessages) {
this.textFieldError = textFieldError;
this.errorMessages = errorMessages;
},
最後帳號驗證內容長這樣:
if (this.$refs.form.validate()) {
if (this.myAccountId === this.fakedata.accountId) {
this.$emit("update:username", this.fakedata.username);
this.$router.push({ name: "KeyinPswd" });
} else {
this.setTextFieldError(false, "帳號錯誤");
}
}
最後在輸入框輸入資料時,把錯誤消除掉,不然錯誤永遠出現還蠻奇怪的xD
<v-text-field
...
label="輸入您的帳號"
@keyup="setTextFieldError(true, '')"
></v-text-field>
順便加上一個方便的指令 @keyup.enter
,作用是當按下 [Enter] 時,觸發驗證事件
因為我自己很習慣輸入完就直接Enter
<v-text-field
...
label="輸入您的帳號"
@keyup.enter.prevent="verifyUser"
></v-text-field>
由於 @keyup.enter
會觸發表單的 submit 事件,所以 v-form 要再加上 @submit.prevent
就可以阻止表單觸發:
<v-form ref="form" @submit.prevent>
...
</v-form>
輸入帳號的表單驗證就完成囉~
看看最後結果畫面~
輸入密碼和輸入帳號的寫法相去不遠~
一樣先放個假密碼:
data() {
return {
...,
fakedata: {
password: "aa9876",
},
};
},
[繼續] 按鈕加上click事件:
<v-btn
v-text="`繼續`"
@click="verifyPswd">
</v-btn>
驗證成功就導回首頁,失敗就跳出提示訊息:
methods: {
verifyPswd() {
if (this.$refs.form.validate()) {
if (this.myPassword === this.fakedata.password) {
this.$router.push({ name: "Index" });
} else {
this.setTextFieldError(false, "密碼錯誤");
}
}
},
setTextFieldError(textFieldError, errorMessages) {
this.textFieldError = textFieldError;
this.errorMessages = errorMessages;
},
},
規則的部份也要加上:
passwordRules: [
...,
(v) => this.textFieldError || this.errorMessages,
],
加上輸入時消除錯誤,以及 [Enter] 事件:
<v-text-field
label="輸入您的密碼"
...
@keyup="setTextFieldError(true, '')"
@keyup.enter.prevent="verifyPswd"
></v-text-field>
記得表單加上 @submit.prevent
阻止 submit 事件:
<v-form ref="form" @submit.prevent>
...
</v-form>
這樣就完成囉~
知道大絕招是什麼了嗎xD
看看最後結果畫面~
今日重點:
this.$refs.form.validate()
觸發表單驗證@keyup.enter
按下 [Enter] 觸發事件@submit.prevent
防止表單觸發 submit 事件今天的進度算是把前端第一階段完成了~
昨天太忙碌結果忘記發文 賽程中斷了...好難過QQ
不過還是會盡量持續30天賽程發文
有需要改進或是任何意見建議歡迎下面留言~