這期我們分享如下: 1.計算金額的小數點怎麼才能精準呢? 2.如何才是正確的比較浮點數的姿勢呢? 3.日曆的天數怎麼算呢? 4.JS切麵編程之AOP 5.文本的省略號怎麼用css實現? 6.超出文本的省略號怎麼用js實現? 7.Vue載入變數會閃屏,怎麼破?不怕,我有“v-cloak”! 8.Vue ...
這期我們分享如下:
1.計算金額的小數點怎麼才能精準呢?
2.如何才是正確的比較浮點數的姿勢呢?
3.日曆的天數怎麼算呢?
4.JS切麵編程之AOP
5.文本的省略號怎麼用css實現?
6.超出文本的省略號怎麼用js實現?
7.Vue載入變數會閃屏,怎麼破?不怕,我有“v-cloak”!
8.Vue 中為什麼使用nextTick,此機制又是如何運作的?
9.Vue重構-動態組件的創建
---------------------------------------------------我啥也沒說---------------------------------------------------
閑話不多說,開!始!上!乾!貨!
1.計算金額的小數點怎麼才能精準呢?
現實開發當中,我們總是會遇到金額計算問題,
我們本以為js中0.1+0.2=0.3,結果0.300000000000000004(喵喵喵?我是誰?我在哪 ?怎麼多出這麼多小尾巴?),
所以我們顯示金額數值的時候,經常會不准,測試經常會提這樣有多個小數點的bug,
遇到這樣的問題我們該怎麼辦?
解決辦法:
把小數先裝成整數計算。比如(0.1*100+0.2*100)/100 = 0.3 ,正確 ✔。
原因:為什麼0.1+0.2!=0.3?
這是因為電腦的計算原因就是先把數值轉成二進位,再進行計算,
所以電腦無法把0.1轉成一個有限位數的二進位,而是轉成一個跟0.1相近的二進位,
所以0.1和0.2求和(或者求積)會出現偏差。
總結:js當中只要涉及到小數點的計算,都必須先轉成整數進行計算。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝孫愛祥老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.如何才是正確的比較浮點數的姿勢呢?
之前已經講過由於電腦將數值轉換成二進位進行比較,
下例中計算結果與預期並不一致:
var a = 0.1 + 0.2, b = 0.5 - 0.2; a === b // false
那麼如何才是正確的比較浮點數的姿勢呢?(假裝很認真的思考。。)
可以通過比較機器精度,確定浮點數是否相等
if(!Number.EPSILON) { Number.EPSILON = Math.pow(2, -52); } function numberCloseEnoughToEqual(n1, n2) { return Math.abs(n1 - n2) < Number.EPSILON; } var a = 0.1 + 0.2, b = 0.5 - 0.2; numberCloseEnoughToEqual(a, b); //true
需要特別說明的是Number.EPSILON是ES6提供的常量,(敲黑板!)
可以用來設置浮點運算允許的誤差值,
Number.EPSILON屬性的值接近於 2.2204460492503130808472633361816E-16,或者 2-52。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝嚴明坤老師情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.日曆的天數怎麼算呢?
這次分享內容是項目日曆需求,計算某月有多少天的計算代碼方法,源碼見附件。希望對小伙伴們有用(筆芯.gif)。
不善言辭,上代碼!!!
Function getLastDay(year,month) { var new_year = year; //取當前的年份 var new_month = month++;//取下一個月的第一天,方便計算(最後一天不固定) if (month > 12) //如果當前大於12月,則年份轉到下一年 { new_month -= 12; //月份減 new_year++; //年份增 } var new_date = new Date(new_year, new_month, 1); //取當年當月中的第一天 var date_count = (new Date(new_date.getTime() - 1000 * 60 * 60 * 24)).getDate();//獲取當月的天數 var last_date = new Date(new_date.getTime() - 1000 * 60 * 60 * 24);//獲得當月最後一天的日期 return date_count; }
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝唐雪峰老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4.JS切麵編程之AOP
我什麼也不說,你看了就會懂,就是這麼自信(自信的微笑.jpg)!
<div> 用戶名:<input id="username" type="text"/> 密碼: <input id="password" type="password"/> <input id="submitBtn" type="button" value="提交"></button> </div>
<script type="text/javascript"> //後端開發中的AOP思想,同樣可以應用在前端開發中 Function.prototype.before = function( beforefn ){ // 保存原函數的引用 var __self = this; return function(){ // 執行新函數,新函數在原函數之前執行,且保證this 不被劫持,新函數接受的參數 beforefn.apply( this, arguments ); // 執行原函數並返回原函數的執行結果, return __self.apply( this, arguments ); } } //同理 Function.prototype.after = function( afterfn ){ var __self = this; return function(){ var ret = __self.apply( this, arguments ); afterfn.apply( this, arguments ); return ret; } }; </script>
<script> //應用場景 var username = document.getElementById( 'username' ), password = document.getElementById( 'password' ), submitBtn = document.getElementById( 'submitBtn' ); Function.prototype.before = function( beforefn ){ var __self = this; return function(){ if ( beforefn.apply( this, arguments ) === false ){ // beforefn 返回false 的情況直接return,不再執行後面的原函數 return; } return __self.apply( this, arguments ); } } var validata = function(){ if ( username.value === '' ){ alert ( '用戶名不能為空' ); return false; } if ( password.value === '' ){ alert ( '密碼不能為空' ); return false; } } var formSubmit = function(){ var param = { username: username.value, password: password.value } ajax( 'http:// xxx.com/login', param ); } formSubmit = formSubmit.before( validata ); submitBtn.onclick = function(){ formSubmit(); } </script>
不信,可以比劃比劃!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝李忠國老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5.文本的省略號怎麼用css實現?
固定寬高,多行實現省略號,嗯,小問題啦~
width:200px; height:50px; overflow : hidden; text-overflow: ellipsis; word-break: break-word display: -webkit-box; -webkit-line-clamp: 2;//自己設置的行數 -webkit-box-orient: vertical;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝於志平老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6.超出文本的省略號怎麼用js實現?
如果不能用css來控制省略號,那就用js啦。
省略號君,我!們!不!怕!
html:
<div class="dome">偷偷ce試 一下 enmmmmm</div>
js:
tips:
str: 要截取的字元串
length:要截取的長度,這裡我們取了18個
insert:截取後,剩下字元用“...”替換
//計算字元長度
function GetLeng(str){
var realLength = 0, len = str.length, charCode = -1;
for (var i = 0; i < len; i++) {
charCode = str.charCodeAt(i);
if (charCode >= 0 && charCode <= 128) realLength += 1;
else realLength += 2;
}
return realLength;
}
//截取方法
function CutStr(str,length,insert){
if(!str) return "";
if(length<= 0) return "";
if(!insert) insert = "";
var templen=0;
for(var i=0;i<str.length;i++){
if(str.charCodeAt(i)>255){
templen+=2;
}else{
templen++
}
if(templen == length){
return str.substring(0,i+1)+insert;
}else if(templen >length){
return str.substring(0,i)+insert;
}
}
return str;
}
//小使身手
var domeText=$(".dome").text(),
domeTextLength = GetLeng(domeText);
if(domeTextLength>18){
$(".dome").text(CutStr(domeText, 18, '...'))
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝何玉老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7.Vue載入變數會閃屏,怎麼破?不怕,我有“v-cloak”!
在使用vue綁定數據的時候,渲染頁面時會出現變數閃爍(啊,閃到我的卡姿蘭大了眼睛!)
例如
<div class="#app"> <p>{{value.name}}</p> </div>
在載入的時候會看到
{{value.name}}
在頁面出現,過了幾秒之後才會渲染數據,
在vue中有個指令可以解決這個問題,v-cloak
那麼,v-cloak要放在什麼位置呢?
是不是每個需要渲染數據的標簽都要添加這個指令?(敲黑板,劃重點啦!)
經過試驗發現,v-cloak並不需要添加到每個標簽,只要在el掛載的標簽上添加就可以,這個指令可以隱藏未編譯的Mustache 標簽直到實例準備完畢。
<div class="#app" v-cloak> <p>{{value.name}}</p> </div>
而且,在css裡面要添加
[v-cloak] {
display: none;
}
這樣就可以防止頁面閃爍了。
但是有的時候會不起作用,可能的原因有二:
1、v-cloak的display屬性被層級更高的給覆蓋掉了,所以要提高層級
[v-cloak] { display: none !important; }
2、樣式放在了@import引入的css文件中
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝於志平老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8.Vue中為什麼使用nextTick,此機制又是如何運作的?
1、定義[nextTick、事件迴圈]
Vue官網對它的解釋是:在下次 DOM 更新迴圈結束之後執行延遲回調。在修改數據之後立即使用這個方法,獲取更新後的 DOM。
我認為這樣解釋更簡單易懂:在同一事件迴圈中的數據變化後,DOM完成更新,立即執行nextTick(callback)內的回調。
2、應用場景:
在Vue生命周期的created()鉤子函數進行的DOM操作一定要放在Vue.nextTick()的回調函數中;
3、瞭解nextTick中定義的三個重要變數:
callbacks:用來存儲所有需要執行的回調函數;
pending:用來標誌是否正在執行回調函數;
timerFunc:用來觸發執行回調函數;
4、其次瞭解nextTickHandler()函數:
先判斷是否原生支持promise,如果支持,則利用promise來觸發執行回調函數;
否則,如果支持MutationObserver,則實例化一個觀察者對象,觀察文本節點發生變化時,觸發執行所有回調函數。
如果都不支持,則利用setTimeout設置延時為0。
5、nextTick實際運用實例
<ul id="demo"> <li v-for="item in list">{{item}}</div> </ul> new Vue({ el:'#demo', data:{ list=[0,1,2,3,4,5,6,7,8,9,10] }, methods:{ push:function(){ this.list.push(11); this.nextTick(function(){ alert('數據已經更新') }); this.$nextTick(function(){ alert('v-for渲染已經完成') }) } }})
或者:
this.$http.post(apiUrl) .then((response) => { if (response.data.success) { this.topFocus.data = response.data.data; this.$nextTick(function(){ //渲染完畢 }); } }).catch(function(response) { console.log(response); });
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝許亞男老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9.Vue重構-動態組件的創建
1、component 和is配合使用
通過使用保留的 元素,並對其 is 特性進行動態綁定,你可以在同一個掛載點動態切換多個組件:
實例如下:
var vm = new Vue({ el: '#example', data: { currentView: 'home' }, components: { home: { /* ... */ }, posts: { /* ... */ }, archive: { /* ... */ } } }) <component v-bind:is="currentView"> <!-- 組件在 vm.currentview 變化時改變! --> </component>
2、方法二:通過render方法創建
<script> export default { data() { return { }; }, render: function(createElement) { let _type = bi.chart.data.type; let _attr = bi.chart.components[_type]["attr"]; return createElement(_attr, { props: { } }); } }; </script>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~感謝許亞男老師熱情分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
哇哦!這麼多小伙伴分享,驚喜不驚喜~
好啦,這一期我們就到這裡,期待下一次分享。
-------------------------------------------------我是版本信息分界線-------------------------------------------------
主編:何玉
時間:20180601
刊數:東航電商前端技術周刊第一期
感謝小伙伴分享,若侵權,請聯繫我們,謝謝。
-----------------------------------------------嗯 別拉了 我是有底線的-----------------------------------------------