源碼php
微信小程序練手 Demo,基本功能css
查詢手機歸屬地html
根據歷史記錄查詢git
手機位數校驗github
界面預覽json
新建一個空白項目小程序
AppID 可選擇無微信小程序
不選擇中建立 quick start 項目,而是建立空白項目,方便加深理解api
首先,建立全局配置文件 app.json
數組
/app.json { "pages":[ "pages/index/index" ] }
定義了首頁的路徑,保存以後,將會自動生成 index
的目錄
pages └── index ├── index.js // 頁面業務邏輯 ├── index.json // 頁面配置 ├── index.wxml // 頁面視圖 └── index.wxss // 頁面樣式
如今,還缺乏一個應用的入口文件,用來註冊小程序
/app.js App({ })
到這一步,小程序初始化就完成了。
下圖來源於小程序設計指南,咱們但願作出來的東西效果能與該圖較爲接近
首先,咱們來爲頁面添加頂部導航文字
/pages/index/index.json { "navigationBarTitleText": "手機歸屬地查詢" }
接下里是查詢模塊
/pages/index/index.wxml <!--查詢--> <view> <text>請輸入查詢內容</text> <input type="number" bindinput="bindPhoneInput" value="{{ phoneNumber }}"/> <button type="primary" bindtap="queryPhoneInfo" disabled="{{ disabled }}">查詢</button> </view>
說明
bindinput
用於綁定鍵盤輸入事件,意味着用戶輸入後,觸發 bindPhoneInput
函數
bindtap
用於綁定點擊事件,意味着用戶點擊按鈕後,出發 queryPhoneInfo
函數
按鈕是否可點擊取決於 disabled
的值;
接下里是具體的功能實現,首先,咱們把手機歸屬地查詢的功能放在全局業務文件 app.js
中,方便不一樣頁面使用
/app.js App({ /** * 獲取手機歸屬地信息 */ getPhoneInfo(phoneNum, callback) { wx.request({ url: 'https://www.iteblog.com/api/mobile.php?mobile=' + phoneNum, header: { 'content-type': 'application/json' }, success: function (res) { callback(res.data); } }) } })
說明
使用小程序提供的 wx.request
發送請求;
該函數接受兩個參數,一個是手機號,另一個則是用來處理查詢結果的回調函數
在頁面裏面實現剛纔定義的兩個事件
/pages/index/index.js var app = getApp(); Page({ /** * 頁面的初始數據 */ data: { phoneNumber: null, // 查找的手機號 phoneInfo: null, // 查詢結果 disabled: true // 默認不可查詢 }, /** * 鍵盤輸入手機號事件處理 */ bindPhoneInput(event){ this.setData({ phoneNumber: event.detail.value, // 綁定用戶輸入的手機號 phoneInfo: null // 清空過往查詢結果 }) this.setDisabled(); }, /** * 驗證手機是否爲 11 位 */ setDisabled() { this.setData({ disabled: (this.data.phoneNumber && this.data.phoneNumber.toString().length === 11) ? false : true }) }, /** * 用戶點擊查詢處理 */ queryPhoneInfo() { app.getPhoneInfo(this.data.phoneNumber, data => this.setData({ phoneInfo: data })); } })
說明
data 用於管理該頁面的數據;
this.setData()
方法用於設置 data 的屬性,若是直接使用 this.data.phoneInfo
沒法改變頁面狀態;
在頁面中調用 app
的方法,須要先使用 getApp
進行實例化,而後經過實例來訪問方法;
接下來在視圖裏面顯示查詢結果
/pages/index/index.wxml <!--查詢--> <!--查詢結果--> <view> <view wx:if="{{ phoneInfo }}"> <text>查詢結果爲:</text> <!--手機號存在--> <text wx:if="{{phoneInfo.ret === 0}}"> {{phoneInfo.operator}}{{phoneInfo.province}}{{phoneInfo.city}} </text> <!--手機號不存在--> <text wx:else> {{phoneInfo.msg}} </text> </view> </view>
說明 - 使用 wx:if
與 wx:else
能夠方便的根據查詢結果來切換視圖
最後是最近功能記錄的功能實現,首先是視圖
<!--最近搜索--> <view> <text>最近搜索</text> <view> <view wx:for="{{ historyList }}" bindtap="selectHistory" data-number="{{item}}"> {{item}} </view> </view> </view>
說明:
遍歷 historyList
數組
用戶點擊某一記錄時候,觸發 selectHistory
事件
將每條手機號保存到 data-number
中,selectHistory
就能夠獲取對應的手機號了
業務邏輯
// pages/index/index.js var app = getApp(); Page({ /** * 頁面的初始數據 */ data: { phoneNumber: null, // 查找的手機號 phoneInfo: null, // 查詢結果 historyList: [], // 查詢歷史 disabled: true }, /** * 鍵盤輸入手機號事件處理 */ bindPhoneInput(event){ this.setData({ phoneNumber: event.detail.value, // 綁定用戶輸入的手機號 phoneInfo: null // 清空過往查詢結果 }) this.setDisabled(); }, /** * 驗證手機是否爲 11 位 */ setDisabled() { this.setData({ disabled: (this.data.phoneNumber && this.data.phoneNumber.toString().length === 11) ? false : true }) }, /** * 用戶點擊查詢處理 */ queryPhoneInfo() { app.getPhoneInfo(this.data.phoneNumber, data => this.setData({ phoneInfo: data })); this.addQueryHistory(this.data.phoneNumber); // 添加搜索記錄 }, /** * 將搜索記錄添加到緩存 */ addQueryHistory(phoneNumber) { var historyList = wx.getStorageSync('historyList') || []; if (historyList.indexOf(phoneNumber) === -1) { historyList.unshift(phoneNumber); wx.setStorageSync('historyList', historyList); } this.setData({ historyList: historyList }) }, /** * 頁面加載後,從緩存中讀取最近搜索列表 */ onLoad: function () { this.setData({ historyList: wx.getStorageSync('historyList') || [] }) }, /** * 用戶點擊記錄以後,將其添加到輸入框中 */ selectHistory(event) { this.setData({ phoneNumber: event.currentTarget.dataset.number, disabled: false }) } })
最後,只須要美化下界面便可。
視圖
<!--查詢--> <view class="querySection"> <text class="help-text">請輸入查詢內容</text> <input class="queryInput" type="number" bindinput="bindPhoneInput" value="{{ phoneNumber }}"/> <button class="queryBtn" type="primary" bindtap="queryPhoneInfo" disabled="{{ disabled }}">查詢</button> </view> <!--查詢結果--> <view> <view wx:if="{{ phoneInfo }}"> <text class="help-text">查詢結果爲:</text> <!--手機號存在--> <text wx:if="{{phoneInfo.ret === 0}}"> {{phoneInfo.operator}}{{phoneInfo.province}}{{phoneInfo.city}} </text> <!--手機號不存在--> <text wx:else> {{phoneInfo.msg}} </text> </view> </view> <!--最近搜索--> <view> <text class="help-text">最近搜索</text> <view class="items"> <view class="item" wx:for="{{ historyList }}" bindtap="selectHistory" data-number="{{item}}"> {{item}} </view> </view> </view>
樣式
/* pages/index/index.wxss */ page { background-color: #EFEFF4; font-family: -apple-system-font,Helvetica Neue,Helvetica,sans-serif; } .querySection { display: flex; flex-direction: column; margin-top: 35px; } .help-text { font-size:14pt; color:#888888; margin-left:15px; } .queryInput { width:100%; background-color: #FFFFFF; height: 75px; margin:10px auto; } .queryBtn { margin:15px; } .items { display: flex; flex-wrap: wrap; } .item { margin:20px; background-color: #D2D2D2; padding: 13px; color:#FFFFFF; border-radius:20px; } .queryRst { margin:20px; }