您當前位置>首頁 » 新聞資訊 » 小(xiǎo)程序相(xiàng)關 >
從(cóng)微(wēi)信小(xiǎo)程序到(dào)鴻蒙js開(kāi)發【08♠©"】——表單組件(jiàn)&注冊登錄模塊 ..'↓.
發表時(shí)間(jiān):2021-2-22
發布人(rén):葵宇科(kē)技(jì)
浏覽次數(shù):105
在微(wēi)信小(xiǎo)程序中,提供了(le)f∑$ orm組件(jiàn),可(kě)以将input、picker、slider、button£✔≠等全部放(fàng)在form中,并設置name屬性實現§£σ(xiàn)類似html的(de)表單提交功能(néng)。
鴻蒙js目前是(shì)沒有(yǒu)form組件(jiàn)的(d≥εe),因此我們需要(yào)在提交時(shí)手動獲取輸入框、選擇框等的(de)值,自(z $ì)行(xíng)構建數(shù)據對(duì)象。
1、登錄模塊
這(zhè)裡(lǐ)接著(zhe)上(shàng)一(yī)篇,通(β≥ αtōng)過dialog組件(jiàn)實現(xiàn)了(le)模态登錄 ππ↔和(hé)注冊的(de)窗(chuāng)口。登錄窗(chuāng)口的(de)效果如€×(rú)下(xià):
每一(yī)行(xíng)中,放(fàng)置圖标和(hé)input輸₽©β入框。input使用(yòng)的(de)是(shì)默認樣式,看(kàn)起來(l$ ' ái)還(hái)是(shì)很(hěn)清爽的(de)。
hml視(shì)圖層:
<dialog id="loginDialog">
<£ <div class="loginDialog">
¥₩ <div cl§&ass="formItem">
≈£×£ <image src="http:€αα↔//www.wxapp-union.com/{{ phone ? (imφ★gUrl +'phone.png') : (imgUrl + 'phone↓♠×1.png') }}"></image>
βπ↕ <input id="phoneInput" type="n ←umber" placeholder="請(qǐng)輸入手機∑∞&(jī)号" onchange="inputPhone"></input>→✘γ∏;
</div>
$α <div class="¥☆πformItem">
∞€ <image src="http://www∑ε≠.wxapp-union.com/{{ pwd ? (imgUrl +'pas≠✔© sword.png') : (imgUrl + 'password1.pn©∏εδg') }}"></image>
§•₽© <input idεφ="pwdInput" type="password" placeholder="請 £α(qǐng)輸入密碼" onchange="inputPwd">$Ω₽></input>
☆★ </div>
♦©↔ <button class="input<ΩBtn" onclick="login">登錄 ☆£÷</button>
≈β </div>
↑γ </dialog>
手機(jī)号的(de)input設置type="number">★¥,在獲取焦點後鍵盤自(zì)動彈出為(wèi)數(shù)字鍵盤。密碼框type="p ♣≠assword",彈出普通(tōng)鍵盤,且輸入的(de)字符會(huì®∏)變為(wèi)圓點,也(yě)可(kě)點擊右側眼睛圖标查看(kࣥ&n)密碼內(nèi)容。
在最開(kāi)始使用(yòng)input時(shí),嘗試使用(yòng)this.$elemΩ∏ ♥ent("id").value獲取,但(dàn)這(zhè)樣是(φπ✔≈shì)獲取不(bù)到(dào)的(de)。
// 登錄
login() {
prompt.showToast({
message: "手機(jī)号: " + this.$element("phoneInput").value +
", 密碼: " + this.$element("pwdInput").value,
duration: 5000
})
}
因此需要(yào)使用(yòng)input的(de)onchange屬©γ性綁定值改變的(de)事(shì)件(jiàn),通(tōng)過e.val×¶←ue取到(dào)改變後的(de)值,并賦給data中的(de)變量。
順便提一(yī)下(xià),今天突然找到(dào)了(le)cons£ole打印日(rì)志(zhì)的(de)查看(kàn)方式。需在最下(xià)方打開(kā¶"i)"HiLog"視(shì)圖,搜索"app Log"後即可(kěΩπ)查看(kàn)。console.log()的(de)內(nèi)¶™¶容需設置日(rì)志(zhì)等級"debug",console.info(<∏σ)則在"info"等級即可(kě)查看(kàn)。
// 手機(jī)号輸入框
inputPhone(e) {
this.phone = e.value;
},
// 密碼輸入框
inputPwd(e) {
this.pwd = e.value;
},
// 登錄
login() {
console.log("手機(jī)号: " + this.phone + "密碼: " + this.pwd);
}
這(zhè)裡(lǐ)能(néng)夠正常獲取輸入框的(de)值了(le),↓×±就(jiù)可(kě)以在點擊按鈕後将值傳給後台服務器(qì),進行(xín÷•<÷g)登錄的(de)校(xiào)驗。按鈕的(de)點∑₩↔γ擊方法通(tōng)過onclick進行(xíng)綁定α₩。
// 登錄
login() {
fetch.fetch({
url: this.url + "/litemall/user/login?phone=" + this.phone + "&pwd=" + this.pwd,
responseType: "json",
success: res => {
let data = http://www.wxapp-union.com/JSON.parse(res.data);
console.info(JSON.stringify(data));
if (0 != data.code) {
prompt.☆§showToast({
message: data.msg,
duration: 3000
})
} else {
let userInfo = data.data;
↕✘ userInfo.age = this.getAge(userInfo.birthday);
this.userInfo = userInfo;
this.$element("loginDialog").close();
}≥
}
})
}
登錄失敗,用(yòng)提示框提示用(yòng)戶失敗原因:
登錄成功,用(yòng)戶信息賦值給頁面并關閉dialog:
這(zhè)裡(lǐ)日(rì)志(zhì)的(de)打印需要≥∑'↔(yào)使用(yòng)JSON.stringify(),否則會(huì)打印"object"Ω≥。
input組件(jiàn)和(hé)button組件(jiàn)都(dōu)提供了(l£∑&βe)豐富的(de)type可(kě)供選擇,具體(tǐ)可(kě)參→€考官方文(wén)檔。
https://developer.harmonyos.com/c₹♣πn/docs/documentation/doc-references/js-comπ↔↑♥ponents-basic-input-0000000000611673
css渲染層:
.loginDialog {
width: 80%;
height: 400px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.formItem {
width: 100%;
height: 100px;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.formItem>image {
width: 70px;
height: 70px;
margin: 0 10px 0 10px;
}
input {
flex: 1;
}
.inputBtn {
width: 200px;
height: 70px;
}
2、注冊模塊
注冊模塊同樣使用(yòng)dialog彈窗(chuāng),內(nèi)容比登錄要(yào)πσ更豐富一(yī)些(xiē):
hml視(shì)圖層:
<dialog id="registerDialoδπφg">
↑∑ <div class="registerDialoΩ≈↕γg">
<δ±↓div class="formItem">
♣$ <image src=">λhttp://www.wxapp-union.com/{{ phone ? (imgUrl +'$®♣↔phone.png') : (imgUrl + 'phone1.png') }}">"γ•</image>
<α¥>;input type="number" placeholderπ€♥="請(qǐng)輸入手機(jī)号" onchange="inputP"₩'εhone"></input>
× φ </div>
β∏✔ <div class="formItem">σ✘©₹;
<image src≤ ÷="http://www.wxapp-union.com/{{ pwd ? (imgU<® βrl +'password.png') : (imgUrl + 'password1.pn¶βg') }}"></image>
ε →≤ <input type="password" ☆♥δ¶placeholder="請(qǐng)輸入密碼" onchange="inputPw♥±✘d"></input>
÷✔ </div>
≈ <div class="formItem"&→gt;
<image ₽→src="http://www.wxapp-union.com/{{ username ? ★™(imgUrl +'username.png') : (imgUrl + 'username →1.png') }}"></image>
δ$≥ <input ₩™λφtype="text" placeholder="請(qǐng)輸入姓名" onchange="i≠β nputUsername"></input>
→ γ€ </div>
∞"$& <div cla ←σss="formItem">
®∑₩& <image src="http://www.wxapφ&>p-union.com/{{ nickname ? (imgUrl¶∑Ω +'nickname.png') : (imgUrl + 'nicknam©δ↔ e1.png') }}"></image>
•♥★© <input ∑₩λtype="text" placeholder="請(qǐn©φ€→g)輸入昵稱" onchange="inputNickname">>αΩ≤;</input>
<Ωγ☆β;/div>
'→≤ <div class="formItem">
<★ <image src="http://www±↑≥.wxapp-union.com/{{ genderVal ? (img≠&Url +'gender.png') : (imgUrl +αΩ→ 'gender1.png') }}"></image>
≠₽
₽φ$ <picker type="text" range="{{ genders }}" ∏×₽onchange="chooseGender">{≠™'{ gender }}</picker>
✔ </div>
☆≤ <div class="formItem">
♦&© <γΩ₩∞image src="http://www.wxapp-union.coδσm/{{ birthdayVal ? (imgUrl +'birthday.png') : "γ©λ(imgUrl + 'birthday1.png') }}"&∞©§→gt;</image>
£© <picker type="dat₽"e" start="1900-1-1" selected="2000-1-×€ 1" onchange="chooseBirthday">{→γ≥♥{ birthday }}</picker>
₽₽ </div>
•± <button class≠×★="inputBtn" onclick="register">注冊</button&→α≈gt;
</div™β>
</dialog>
上(shàng)面四個(gè)依然是(shì)input輸入框,随β後兩個(gè)使用(yòng)了(le)picker選擇框組件(jiàn)。♠←♦&需注意,選擇框組件(jiàn)标記中需放(fàng)置文(≤ε→±wén)本內(nèi)容,通(tōng)過點擊這(zhè)裡(lǐ)的(de)文(wén)本在✘頁面下(xià)方彈出選擇框。
type="text"是(shì)文(wén)本選擇∞₹框,通(tōng)過range屬性綁定一(yī)個(gè)字符串數(shù)組,效果如™™×÷(rú)下(xià):
onchange屬性綁定選擇一(yī)項後的(de)處理(lǐ)方法,e.ne'¶↓wValue是(shì)選項值,e.newSelected是(shì)選項↑¶&下(xià)标。
性别選擇框js邏輯層代碼:
export default {
data: {
...
gender: "點擊選擇性别",
genderVal: "",
genders: ['保密', '男(nán)', '女(nǚ)'],
...
},
...
// 性别選擇器(qì)
chooseGender(e) {
this.gender = e.newValue;
this.genderVal = e.newSelected;
≤↕ε },
...
}
type="date"是(shì)日(rì)期選擇器(qì),可(kě)以通(tōng)過>'>β屬性指定開(kāi)始、結束、當前日(rì)期,通(tōng)過onchange¶δ綁定選擇後的(de)處理(lǐ)方法。效果如(rú)™φ≥£下(xià):
e.year/month/day分(fēn)别為(wèi)選擇的(de)年(nián)/月(yu≈πσ§è)/日(rì),注意month比實際月(yuè)份小(xiǎo)1。
生(shēng)日(rì)選擇框js邏輯層:
export default {
data: {
...
birthday: "點擊選擇生(shēng)日(rì)",
birthdayVal: ""
},
...
// 生(shēng)日(rì)選擇器(qì)
chooseBirthday(e) {
let month = (e.month + 1) + "";
if (month.length == 1) {
month = "0" + month;
}
let day = e.day + "";
if (day.length == 1) {
day = "0" + day;
}
let birthday = e.year + "-" + month + "-" + day;
this.birthday = birthday;
this.birthdayVal = birthday;
},
...
••₹α
}
這(zhè)裡(lǐ)開(kāi)發者工(gōng)具有(yǒu✔↑)一(yī)個(gè)bug,type="date"在提示時(shí)錯(cuò)誤&∑€拼寫成了(le)"data"。
選擇器(qì)還(hái)有(yǒu)time, datetime, m'ulti-text三種,鴻蒙的(de)封裝确實很(hěn)好(hǎo)看(kànφ♣)好(hǎo)用(yòng)。
注冊的(de)方法:
// 注冊
register() {
fetch.fetch({
url: this.url + "/litemall/user/register",
method: "POST",
data: {
username: this.username,
password: this.pwd,
gender: this.genderVal,
birthday: this.birthdayVal,
nickname: this.nickname,
mobile: this.phone
},
header: {
"Content-Type": "application/json;charset=UTγ✘®¥F-8"
},
responseType: "json",
success: res => {
let data = http://www.wxapp-union.com/&✔™≠JSON.parse(res.data);
console.info(JSON.stringify(data));
if (0 != data.code) {
"♦≥¶ prompt.showToast({
message: data.msg,
duration: 3000
});
} else {
prom≤±pt.showToast({
message: "注冊成功",
duration: 3000
});
this.$element("registerDialog").close();
}'γ
}
})
}
還(hái)需要(yào)注意,如(rú)果使用(yòng)γφ↔≥fetch發送請(qǐng)求,且data給的(de)是(shì)一(y•&ī)個(gè)對(duì)象時(shí),請(qǐng)求頭的(de)≤×'Content-Type自(zì)動設置為(wèi)application✘♥/x-www-form-urlencoded。如(rú)果服務器(qì)接收json數(shù)α₹據,則需要(yào)設置請(qǐng)求頭,否則會(huì)報(bào)如(rú)下(±♥↔☆xià)錯(cuò)誤。
Resolved [org.springframework.web.HttpMediaTypeNα♦otSupportedException: Content type 'application/x-www-form-urlenc←₹§εoded;charset=UTF-8' not supported]
注冊一(yī)下(xià):