一、項目概述
功能:
- 實現加減乘除
- 去余(%)
- 刪除(Delete)
- 全部清空( C)
html界面要在app.json里面注冊。
不注冊的話會報錯:navigateTo:fail url "pages/index/talkPage" is not in app.json
注冊完畢之后編譯,開發工具會自動為你創建一個對應的js和wxss文件,而且js里面會自動搭好基本函數:
頁面如下:
二、WXML文件編寫
首先我們對計算器頁面進行設計,這里我們主要分為兩部分,上部分和下部,顯示部分分為操作數和操作符。
計算器分為五行四列,最外面為縱向布局,里面為橫向布局。布局通過樣式表操作,
代碼如下:
<view class="result"> <!-- 當前view表示的是顯示部分 --> <view class="result_num">{{num}}</view> <!--顯示操作數 --> <view class="result_op">{{op}}</view> <!--顯示操作符 --> </view> <view class="btns"> <!-- 當前view表示的是操作部分 --> <view> <!--第一行 --> <view hover-class="bg" bindtap="resetBtn">C</view> <view hover-class="bg" bindtap="delBtn">DEL</view> <view hover-class="bg" bindtap="opBtn" data-val="%">%</view> <view hover-class="bg" bindtap="opBtn" data-val="/">÷</view> </view> <view> <!--第二行 --> <view hover-class="bg" bindtap="numBtn" data-val="7">7</view> <view hover-class="bg" bindtap="numBtn" data-val="8">8</view> <view hover-class="bg" bindtap="numBtn" data-val="9">9</view> <view hover-class="bg" bindtap="opBtn" data-val="*">×</view> </view> <view> <!--第三行 --> <view hover-class="bg" bindtap="numBtn" data-val="4">4</view> <view hover-class="bg" bindtap="numBtn" data-val="5">5</view> <view hover-class="bg" bindtap="numBtn" data-val="6">6</view> <view hover-class="bg" bindtap="opBtn" data-val="-">-</view> </view> <view> <!--第四行 --> <view hover-class="bg" bindtap="numBtn" data-val="1">1</view> <view hover-class="bg" bindtap="numBtn" data-val="2">2</view> <view hover-class="bg" bindtap="numBtn" data-val="3">3</view> <view hover-class="bg" bindtap="opBtn" data-val="+">+</view> </view> <view> <!--第五行 --> <view hover-class="bg" bindtap="numBtn" data-val="0">0</view> <view hover-class="bg" bindtap="doBtn">.</view> <view hover-class="bg" bindtap="opBtn" data-val="=">=</view> </view> </view>
三、WXSS文件編寫
這里分兩部分,計算結果展示區,計算按鈕區。可見wxml文件注釋。
這里在補充一點樣式設計:
- display:flex 表示彈性布局,block塊布局(后面接換行符)
flex:1表示占滿剩余空間(flex-grow,flex-shrink,flex-basis的簡寫)默認值為:0,1,auto, 不伸不縮 - flex-direction:容器內元素的排列方向(默認橫向排列)
1.flex-direction:row;沿水平主軸讓元素從左向右排列。此時flex-basis相當於width。
2.flex-direction:colimn;沿垂直主軸從上到下排列。此時flex-basis相當於height
3.flex-direction:roe-reverse;沿水平主軸從右向左排列 - hover-class: 按下去的樣式
- **box-sizing:border-box;**將邊框先計入寬度之內,用於確定准確邊框寬度,任何像素都會影響頁面效果
- align-items:**垂直對齊,**display要設置成flex才能對齊屬性賦值
- justify-content:水平對齊方式
- 樣式表的設置“>”符號:表示嵌套級聯關系
.btns>view>view
view>view - 視口單位
代碼如下:
/* pages/cal/index.wxss */ .result { flex: 1; /* 彈性填充滿*/ background: #f3f6fe; position: relative; } .btns { flex: 1; display: flex; /*彈性顯示結構*/ flex-direction: column; /*縱向顯示*/ font-size: 17pt; border-top: 1rpx solid #ccc; border-left: 1rpx solid #ccc; } page { display: flex; flex-direction: column; height: 100%; } .btns>view { flex: 1; display: flex; flex-direction: row; } .btns>view>view { flex-basis: 25%; border-right: 1rpx solid #ccc; border-bottom: 1rpx solid #ccc; display: flex; align-items: center; justify-content: center; } .btns>view:last-child>view:first-child { flex-basis: 50%; } .bg { background-color: #eee; } .result_num { font-size: 17pt; position: absolute; bottom: 5vh; right: 3vw; } .result_op { font-size: 17pt; position: absolute; bottom: 1vh; right: 3vw; }
四、JS頁面設計
主要實現
代碼如下:
Page({ data: { num: "", //前台頁面顯示的輸入數字或者結果 op: "" //前台頁面顯示的操作符 }, result: null, //裝載計算結果 isClear: true, //是否需要清理前面的數字,true是要清理 numBtn: function(e) { var num = e.target.dataset.val; //獲取你輸入的數字 if (this.isClear || this.data.num == "0") //如果需要清理前面的數字,那么前面的數字就不需要保存 { this.isClear = false; //將清理標志設置為false,以便連續輸入數字 this.setData({ num: num }); } else { this.setData({ num: this.data.num + num //不清理前面的內容,將輸入的內容追加到最后面,這是字符串的連接操作,因為兩邊都是字符串類型 }); } }, opBtn: function(e) { var op = this.data.op; //獲取上一次的操作符 var num = Number(this.data.num); //獲取操作數 this.setData({ op: e.target.dataset.val }); if (this.isClear) //當你連續點擊操作符的時候,操作無效 { return; } this.isClear = true; //設置清理內容標志 if (this.result == null) //講第一次運算設置為當前的操作數 { this.result = num; return; } //運算符的運算 if (op == "+") { // this.result = cals.add(this.result, num); this.result = this.result + num; //數字加,因為num是數字類型 } else if (op == "-") { // this.result = cals.sub(this.result, num); this.result = this.result - num; } else if (op == "*") { // this.result = cals.mul(this.result, num); this.result = this.result * num; } else if (op == "/") { // this.result = cals.div(this.result, num); this.result = this.result / num; } else if (op == "%") { this.result = this.result % num; } this.setData({ num: this.result }); }, doBtn: function(e) { if (this.isClear) //如果直接點擊小數點,則顯示"0." { this.setData({ num: "0." }); this.isClear = false; return; } if (this.data.num.indexOf(".") >= 0) //查詢前面輸入的數字中,是否存在小數點 { return; //如果存在小數點,當前輸入無效 } this.setData({ num: this.data.num + "." }); }, delBtn: function(e) { var num = this.data.num.substr(0, this.data.num.length - 1); this.setData({ num: num == "" ? "0" : num }); }, resetBtn: function(e) { this.result = null; this.isClear = true; this.setData({ num: '0', op: '' }); } })
五、總結
1、計算器最重要注意樣式表,JS。
在JS中要是想數據從前台傳到后台通過事件的方式(e),從后台傳到前台用data的方式。
2、主頁跳轉到計算器頁面
主頁index.wxml,增加一個按鈕:
<button bindtap="OnCalShow" >計算器</button>
在index.js中增增加
OnCalShow() { wx.navigateTo({ url: '/pages/cal/index', }) },
