92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

首頁

ECharts的resize失效原因以及使用方法

seo達人

很多朋友在開發的過程中要把ECharts圖標做成自適應瀏覽器寬高的效果。于是去翻看ECharts官網發現了resize方法,結果用了之后發現沒用,而且根本不知道什么原因。



解決辦法:

不能給ECharts的容器設置固定的寬高。



寬度要寫百分比

高度要寫vh

然后再搭配resize方法才可以實現根據瀏覽器大小而改變大小的功能



示例代碼:

let ECharts = echarts.init(document.getElementById('wrapBox'));

//ECharts的配置項和數據

let option = {

title: {

text: 'demo'

},

tooltip: {},

legend: {

data: ['dataSource']

},

xAxis: {

data: ['aa', 'bb', 'cc']

},

yAxis: {},

series: [{

name: 'dataSource',

type: 'bar',

data: [2, 5, 6],

}]

};

//配置圖表數據及配置項

ECharts.setOption(option);



//根據瀏覽器大小改變大小

window.onresize = () => {

ECarts.resize();

//如果有多個表變動在下方依次寫下去就可以了

}

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計  圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

vue單頁面標題設置 title

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

推薦使用 vue-wechat-title

vue-wechat-title作用
Vuejs 單頁應用在iOS系統下部分APP的webview中 標題不能通過 document.title = xxx 的方式修改 該插件只為解決該問題而生(兼容安卓)

已測試APP 
微信 
QQ 
支付寶 
淘寶

安裝
npm install vue-wechat-title --save
1
用法
1,在 main.js 中引入
import VueWechatTitle from 'vue-wechat-title'
Vue.use(VueWechatTitle)
1
2
2,在路由文件 index.js 中給每個路由添加 title
// 掛載路由
const router =  new Router({
   mode: 'history',
   routes:[
        {
          path: '/',
          name: 'Index',
          component: Index,
          meta: {
            title: '首頁'   // 標題設置
          }
        },
        {
          path: '/lists',
          name: 'Lists',
          component: Lists,
          meta: {
            title: '列表'  // 標題設置
          }
        }
     ]
});

3,在 app.vue 中修改 router-view 組件
<router-view v-wechat-title='$route.meta.title'></router-view>
1
自定義加載的圖片地址 默認是 ./favicon.ico 可以是相對或者絕對的

<div v-wechat-title="$route.meta.title" img-set="/static/logo.png"></div>
1
ok !重啟看看

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務。

char[] 和 String 類型占用字節大小問題

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

在 C 語言中
1、char a[10] = {"China"} 中,這個 a 占用多少字節?

答:占用 10 個字節。

解析:上面代碼對 a 做了賦值的操作,

a[0]='C' ,a[1]='h' ,a[2]='i' ,a[3]='n' ,a[4]='a' ,a[5]='\0',a[6]='\0',a[7]='\0',a[8]='\0',a[9]='\0'

所以,它占用的是 10 個字節。

2、如果單指 ”China“ ?

答:共 6 個字節。China 占 5 個字節,最后以 '\0' 結束,占 1 個字節。

在 Java 語言中
1、String s = "China"; 占多少字節?

答:占 5 個字節。

System.out.println(Charset.defaultCharset());//獲取ide默認編碼類型
String s = new String("China".getBytes());
byte[] b = s.getBytes();
System.out.println("" + b.length);
 以上代碼,可以輸出 "China" 所占的字節長度為 5

2、String s = "中國"; 占多少字節?

答:如果是 漢字 的情況需要考慮編碼。

(1)GBK 編碼(ide默認)時,每一個漢字占用 2 個字節,那么中國占 4 個字節。

(2)UTF-8 編碼時,每一個漢字占用 3 個字節,那么中國占用 6 個字節。

3、轉碼問題,GBK 轉 UTF-8 時,字節占用會變大嗎?反過來呢?

//獲取的是 UTF-8編碼
System.out.println(Charset.defaultCharset());
String s;
try {
        s = new String("中國".getBytes(),"GBK");
        byte[] b = s.getBytes();
        System.out.println("" + b.length);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
}
如上代碼是:UTF-8 轉 GBK 編碼格式,s 長度從 6 字節變為 9 字節。
s 內容變化:中國 —> 涓浗
因為當前編碼是 UTF-8,轉碼之后變成了 3 個文字,占用 9 個字節。然而,反過來的情況是這樣的:

中國 (gbk) —> ?й? (utf-8)
s 長度從 4字節 變成了 4字節,雖然長度沒發生改變,但是文字已經改變。這里的 ? 占用 1 個字節。

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。

一個 npm 包的坎坷“續命”之生

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

如果說 npm 的大新聞,莫過于之前的 left-pad 撤包事件,event-stream 投毒事件,Ant Design 彩蛋事件。使得很多前端開發者又開始重新思考 npm 生態時候真的存在問題?

今天我們文章的主角是 memwatch,一個用來幫助我們檢查 Node.js 是否存在內存泄漏的庫,和這個庫傳奇的一生。

2012 年 02 月 06 日,一位 Mozilla 的工程師 lloyd 創建了這個庫,并寫了一篇博文“Is My NodeJS Program Leaking?”(我的 Node.js 程序是否存在內存泄漏?)。這個包最初被命名為 gcstats,代碼上傳到了 github。

6 月 27 日,npm 包改名為 memwatch,發布 0.1.1 版。

7 月 4 日,lloyd 為這個庫添加了開源許可協議:WTFPL,發布 0.1.2 版。很多人對這個開源許可協議可能比較陌生,WTFPL 的全稱是 Do What The Fuck You Want To Public License,中文譯名:你他媽的想干嘛就干嘛公共許可證。也許就是這份協議開啟了 memwatch 庫不尋常的一生。

2013 年 3 月 14 日,作者 lloyd 提交了最后一次代碼,發布了 0.2.2 版本。支持的 Node.js 版本為 0.6.0。隨后這個庫再也沒有更新過。

從作者的博文和推文可以看到,作者在 2014 年離開了 Mozilla。而從作者的 github 動態更可以看出,作者應該是轉入了 golang 陣營。

2014 年 6 月 28 日,作者的一位前同事 deepak1556 fork 了這個庫,增加了對 Node.js 0.11 的支持,并發起了合并請求。但是作者并沒有回復,也沒有合并此次請求。此時距離原作者放棄這個庫也已經過去一年多了。

2015 年 2 月 7 日,marcominetti 又 fork 了 deepak1556 的庫,增加了對 Node.js 0.12 的支持,并向原庫發起了合并請求,同樣沒有得到作者的任何回復。于是 marcominetti 決定自立門戶,于是將 memwatch 改名為 memwatch-next 發布到了 npm。

2017 年 1 月 27 日,如同前兩位維護者一樣,marcominetti 也最終放棄了繼續更新這個庫。到此時,此庫支持的 Node.js 版本為 4、5、6。

2018 年 5 月 6 日,eduardbcom 又 fork 了 marcominetti 的庫,增加了 Node.js 9 的支持,并且放棄了對 Node.js 9 以下所有版本的支持。改名為 node-memwatch 并發布到了 npm。隨后再也沒有更新過代碼。

2018 年 7 月 17 日,一位開發者 dyatko 又 fork 了 eduardbcom 的庫,增加了對 Node.js 8 的支持,并向原庫發起了合并請求,同樣沒有得到作者的任何回復。

但在此次 pr 的評論中,另一位開發者說,airbnb 也 fork 了 marcominetti 的庫,并改名為 @airbnb/node-memwatch 發布到了 npm。

有了大廠接手,也算是這個庫最終的歸宿吧。


藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。

waterfull——ajax分析

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

把項目放在wampserver的www目錄下,啟動wampserver,并且瀏覽器打開后手動修改url為localhost

index.js=》getData():

ajax.js以及index。js對它的調用:

ajax的參數:method、data、url都是字符串

index.js =》getData()=》調用ajax

ajax('GET', 'http://localhost/web/ajax/waterfall2/src/js/getPics.php', addDom, 'cpage=' + num, true)

并且url是localhost下——localhost/web/ajax/waterfall2/src/js/getPics.php

不是直接圖片資源地址

圖片資源地址寫在php中,只管調用就行

data:

ajax調用是data是這樣的=》'cpage=' + num

 

測試用的data.txt:

一個數組里有很多對象,每個對象都是一張圖片的全部信息,每條信息都是json.stringify格式

所以測試用ajax的callback這樣寫:

function addDom(data) {
    console.log(JSON.parse(data));
}

這個data不是自己定義的,是xhr.responseText,是接口的數據

這個data是callback的參數

回調函數的data參數和使用方法:

xhr.onreadystatechange = function() {

////////狀態改變
        if(xhr.readyState == 4) {
            if(xhr.status == 200) {
                callback(xhr.responseText);

////////滿足兩個條件時,callback才獲取數據成功,才能用數據做些什么


            }else {
                console.log('error');
            }
        }
    }

ajax()中callback是參數,而callback的定義和對數據的操作通常在ajax()調用之后

例如:

(1)

ajax('GET', 'http://localhost/web/ajax/waterfall2/src/js/data.txt', addDom, 'cpage=2', true);
function addDom(data) {
    console.log(JSON.parse(data));
}

如此簡單明了

(2)

function getData() {
//         if(!flag) {
//             flag = true;
//             ajax('GET', 'http://localhost/web/ajax/waterfall2/src/js/getPics.php', addDom, 'cpage=' + num, true)
//             num++;
//         }
//     }
//     getData();
//     function addDom(data) {

……

}

回來…………

ajax中的data在本例中是字符串'cpage=' + num  或者 'cpage=2'這種

get中作用:

xhr.open(method, url + '?' + data + '&timer=' + timer, flag);

post中作用:

xhr.send(data);

話說回來…………

都是獲取數據,data.txt和getPics.php區別:

一個只有第2頁的地址,一個是動態獲取很多頁數據

反正就那么傳吧  

而ajax

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

Vue教程(組件-切換案例)

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

前面介紹了Vue中組件的創建方式和data及methods屬性,本文我們來做一個Vue組件的切換案例,效果如下:

這個效果相信大家都能搞定,本文希望通過這個案例來加深下組件的使用,

Vue 組件切換案例
基礎頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue-2.4.0.js"></script>
</head>
<body>
    <div id="app">

    </div>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {

            },
            methods: {
                
            }
        })
    </script>
</body>
</html>


一、通過v-if控制實現
首先我們通過前面介紹的v-if標簽來實現下這種效果

1.創建組件
創建我們需要的兩個全局組件,并通過標簽使用。

<div id="app">

    <login></login>
    <register ></register>
</div>
<script>

    // 創建登錄的組件
    Vue.component("login",{
        template: "<h3>這是一個登錄LOGIN組件</h3>"
    })
    // 創建注冊的組件
    Vue.component("register",{
        template: "<h3>這是一個注冊組件</h3>"
    })

    var vm = new Vue({
        el: "#app",
        data: {

        },
        methods: {
            
        }
    })
</script>

2.控制顯示
添加鏈接標簽,通過 v-if 和 v-else 標簽來控制顯示和隱藏,如下



效果



完整代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue-2.4.0.js"></script>
</head>
<body>
    <div id="app">
        <a href="" @click.prevent="flag=true">登錄</a>
        <a href="" @click.prevent="flag=false">注冊</a>
        <!--注意: v-if v-else-if v-else 使用^_^ -->
        <login v-if="flag"></login>
        <register v-else></register>
    </div>
    <script>

        // 創建登錄的組件
        Vue.component("login",{
            template: "<h3>這是一個登錄LOGIN組件</h3>"
        })
        // 創建注冊的組件
        Vue.component("register",{
            template: "<h3>這是一個注冊組件</h3>"
        })
        var vm = new Vue({
            el: "#app",
            data: {
                flag: false
            },
            methods: {}
        })
    </script>
</body>
</html>

二、通過component標簽來實現
除了上面介紹的這種方式以外我們還可以通過Vue組件中給我們提供的一個component標簽來實現



Vue提供了 component 來展示對應名稱的組件,component 是一個占位符, :is 屬性,可以用來指定要展示的組件的名稱

效果



完整代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./lib/vue-2.4.0.js"></script>
</head>
<body>
    <div id="app">
            <a href="" @click.prevent="comName='login'">登錄</a>
            <a href="" @click.prevent="comName='register'">注冊</a>

            <component :is="comName"></component>
    </div>
    <script>

        // 創建登錄的組件
        Vue.component("login",{
            template: "<h3>這是一個登錄LOGIN組件</h3>"
        })
        // 創建注冊的組件
        Vue.component("register",{
            template: "<h3>這是一個注冊組件</h3>"
        })

        var vm = new Vue({
            el: "#app",
            data: {
                comName: "login"
            },
            methods: {

            }
        })
    </script>
</body>
</html>

35
36
37
38
39
組件切換-動畫
前面我們介紹了 動畫 的使用,那么剛好我們可以在切換的時候把動畫效果給加上。
添加動畫樣式:

<style>
    .v-enter,
    .v-leave-to{
        opacity: 0;
        transform: translateX(150px) ;
    }

    .v-enter-active,
    .v-leave-active{
        transition: all 1s ease;
    }
</style>

組件包裹 標簽



效果



我們發現動畫切換的時候兩個是一塊執行的,這時我們可以在 transition 標簽添加一個 mode屬性 來設置動畫的模式



搞定~

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務。


XJ項目關于新增保險時輸入各類保險金額后計算總和插入到總費用后查詢顯示

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

第一種情況
新增框內既有各類保險金額,也有保險總費用。當輸入一類保險金額時,保險總費用自動累加顯示,點擊保存之后將所有數據插入數據庫。然后查詢查詢顯示在結果列表即可。如下圖:

第一種情況可以在前端js中寫一個計費方法。獲取每個不同類的保險金額,值取到之后在點擊保存之前將變量中的值賦值給保險總費用,然后點擊保存。代碼如下(js中計費的方法寫在代碼一開始中的method{}中,也就是新增,查詢,刪除,修改下方即可):

//計費方法
Vehicle_sum:function(){
var sum  = /^[0-9]\d{0,5}$/;
var trafficCompulsoryInsuranceCost=$("#vehicleInsurance_add_trafficCompulsoryInsuranceCost").textbox('getValue');
trafficCompulsoryInsuranceCost=parseInt(trafficCompulsoryInsuranceCost);
if(!trafficCompulsoryInsuranceCost == ''){
if(!sum.test(trafficCompulsoryInsuranceCost)){
Message.error("請輸入正確的保險!");
return;
}
}
var commercialInsuranceCost=$("#vehicleInsurance_add_commercialInsuranceCost").textbox('getValue');
commercialInsuranceCost=parseInt(commercialInsuranceCost);
if(!commercialInsuranceCost == ''){
if(!sum.test(commercialInsuranceCost)){
Message.error("請輸入正確的保險!");
return;
}
}
var carrierInsuranceCost=$("#vehicleInsurance_add_carrierInsuranceCost").textbox('getValue');
carrierInsuranceCost=parseInt(carrierInsuranceCost);
if(!carrierInsuranceCost == ''){
if(!sum.test(carrierInsuranceCost)){
Message.error("請輸入正確的保險!");
return;
}
}
var vehicleAndVesselTaxCost=$("#vehicleInsurance_add_vehicleAndVesselTaxCost").textbox('getValue');
vehicleAndVesselTaxCost=parseInt(vehicleAndVesselTaxCost);
if(!vehicleAndVesselTaxCost == ''){
if(!sum.test(vehicleAndVesselTaxCost)){
Message.error("請輸入正確的保險!");
return;
}
}
var total = trafficCompulsoryInsuranceCost+commercialInsuranceCost+carrierInsuranceCost+vehicleAndVesselTaxCost;
$("#vehicleInsurance_add_totalCost").textbox("setValue",total);
},

第二種情況
新增的表單中只有各種類別的保險費用,并沒有保險費用合計的字段。意思是在新增時只輸入各種類別的保險金額,后臺拿到各種類型的保險金額之后,在后臺將各類保險金額累加,用set方法給totalcost(保險總費用)賦值,插入數據庫中。查詢是從數據庫查詢顯示在結果列表即可。如下圖


第二種情況可以在后臺中寫一個計費的累加方法。用BigDecimal的add方法進行累加。首先實例化一個BigDecimal的對象totalCost,賦一個初始值為0,然后用保險的對象insurance的get方法獲取各種保險的金額,然后用totalCost.add方法將獲取每個不同類的保險金額一次加到totalCost中,然后將totalCost用insurance的set方法set到保險總費用的字段中,然后進行插入操作。代碼如下(后臺中計費的方法寫在Service中的新增方法中):

/**
* 車輛保險新增
* 陳通
* @param insurance
* @param request
* @return
* @throws IOException
*/
public Result insertVehicleInsurance(VehicleInsurance insurance,HttpServletRequest request) throws IOException{
Result result = Result.getInstance();
insurance.setKeyID(IDGenerator.uuid());
//計費方法開始
BigDecimal totalCost = new BigDecimal("0");
        if(insurance.getTrafficCompulsoryInsuranceCost()!=null){
        totalCost=totalCost.add(insurance.getTrafficCompulsoryInsuranceCost());
        }
        if(insurance.getCommercialInsuranceCost()!=null){
        totalCost=totalCost.add(insurance.getCommercialInsuranceCost());
        }
        if(insurance.getCarrierInsuranceCost()!=null){
        totalCost=totalCost.add(insurance.getCarrierInsuranceCost());
        }
        if(insurance.getVehicleAndVesselTaxCost()!=null){
        totalCost=totalCost.add(insurance.getVehicleAndVesselTaxCost());
        }
        insurance.setTotalCost(totalCost);
        //計費方法結束
//插入車輛保險信息,返回受影響的行數
int count=vehicleInsuranceDao.insertVehicleInsurance(insurance);
//插入附件
sysFileService.saveFile(insurance.getKeyID(), Enums.FILE_CATALOG.INSURANCEFILE.getValue(), request);
if (count>0) {
result.setFlag(true);
result.setMessage("車輛保險新增成功!");
}else{
result.setFlag(false);
result.setMessage("車輛保險新增失敗!");
}
return result;
}

以上是兩種計費方法(前臺和后臺)。
--------------------- 
作者:ct_?? 
來源:CSDN 
原文:https://blog.csdn.net/weixin_40418595/article/details/94736305 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

柯里化、原生bind、防抖節流函數、實現promise

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

多參數柯里
原生bind
實現promise
防抖節流函數
多參數柯里化

參數fn可以是function(a,b,c){},也可以是function(a,b,c,d,f){}

// 支持多參數傳遞
function progressCurrying(fn, args) {

    var _this = this
    var len = fn.length;
    var args = args || [];
    return function() {
        var _args = Array.prototype.slice.call(arguments).concat(args);
        // 如果參數個數小于最初的fn.length,則遞歸調用,繼續收集參數
        if (_args.length < len) {
            return progressCurrying.call(_this, fn, _args);
        }

        // 參數收集完畢,則執行fn
        return fn.apply(this, _args);
    }
}

原生js實現bind

Function.prototype.myBind = function(Othis){
  if(typeof this !== "function"){
    return new TypeError("not a function");
  }
  let _this = this;
  let args = [...arguments].slice(1);
  let func = function(){};
  let fBound = function () {
    return _this.apply(this instanceof func ?this:Othis,[...arguments].concat(args));
  }
  func.prototype = _this.prototype;
  fBound.prototype = new func();
  return fBound;
}

防抖函數

//每wait時間內執行一次,若期間被觸發,則重新執行
function debounce(func,wait) {
  var timeout ;
  return function(){
    let args = [...arguments];
    let _this = this;
    if(timeout){
      clearTimeout(timeout);
    }
    timeout = setTimeout(function() {
      func.apply(_this,args);
    }, wait);
  }
}

節流函數

//每wait時間執行一次
function throttle(func,wait){
  var timeStart = 0 ;
  return function(){
    let _this = this;
    let args = [...arguments];
    let now = Date().now();
    if(now - timeStart >wait){
      func.apply(_this,args);
      timeStart = now;
    }
  }
}

實現一個promise

    function _Promise(func){
        this.status = 'pending'
        this.result = '' ;
        func(this.resolve.bind(this),this.reject.bind(this));
    }
    _Promise.prototype.resolve = function(result){
        if(this.status == 'pending'){
            this.status = 'fullfilled';
            this.result = result;
        }
    }
    _Promise.prototype.reject = function(error){
        if(this.status == 'pending'){
            this.status = 'rejected';
            this.result = error;
        }
    }
    _Promise.prototype.then = function(preResolve,preReject){
        let _isPromise ;
        if(this.status == 'fullfilled'){
            _isPromise = preResolve(this.result);
        }else if(this.status == 'rejected' && arguments[1]){
             _isPromise = preReject(this.result);
        }
        return _isPromise instanceof _Promise ? _isPromise:this;
    }

實現一個promise.all()

 function promiseAll(promiseArray){
        //首先參數一定是一個數組
        //然后此函數返回的是一個promise,如果全部成功,則返回結果的數組,只要有一個失敗,則返回失敗的結果
        return new Promise(function (resolve,reject){
            if(!Array.isArray(promiseArray)){
                return reject(new TypeError("not a function"));
            }
            let resolveNum = 0;
            let arrNum = promiseArray.length;
            let resolveResult = [];
            for(let i=0; i<arrNum ;i++){
                (function (i){
                    Promise.resolve(promiseArray[i]).then(function(result){
                        resolveNum ++;
                        resolveResult.push(result);
                        if(resolveNum == arrNum){
                            return resolve(resolveResult);
                        }
                    },function(error){
                        return reject(error);
                    })
                })(i);
            }
        }) //返回的promise結束
        
    }
藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 、平面設計服務。

前端性能優化

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

減少頁面加載時間的方法:
1.壓縮html css js等文件
2.減少DNS解析
3.減少DOM元素,對于相關操作可以緩存節點
4.改變頁面元素樣式時盡量操作className,而不是頻繁使用xxx.style.(其實還有很多這種DOM修改操作的細節比如opacity替代visibility ,多個DOM統一操作(雖然V8會有緩存優化) ,先將DOM離線,即display:none;修改后顯示 ,不要把DOM放在已給循環中作為循環變量 ,不要使用table )
5.避免不必要的重定向
6.合并js css及圖片,減少請求數量
7.使用CDN
8.合理利用緩存
9…

關于CDN?
https://zhuanlan.zhihu.com/p/39028766

CDN中文名“內容分發網路”,作用是減少傳播時延,找最近的節點。CDN本質就一個是緩存,只是這個緩存離你特別近,不管是作為用戶還是開發人員都能從中享受一點福利。
CDN的優點
1.訪問加速
2.減輕服務器負載
3.抗住攻擊
CDN的缺點
1.只能對靜態資源加速
2.內容更新時需要分發到其他節點
3.代價高昂
與傳統網站訪問方式的不同
傳統的網站會直接解析域名獲得IP地址然后發送請求
使用了CDN的網站則增加了緩存層,解析域名→獲取對應CNAME域名→對獲取的域名進行解析得到緩存服務器的IP地址,將用戶的訪問請求引導到最優的緩存節點而不是源站。

總結:通過權威DNS服務器來實現最優節點的選擇,通過緩存來減少源站的壓力。主要應用于靜態網頁、大文件的下載等等。
應用與踩坑

緩存設置
max-age在Cache-Control中經常用于緩存的控制,可是max-age設置的緩存會應用于一個請求經過的每一級,如果我們希望CDN不緩存那么久,要怎么辦呢?那就是s-maxage,它用于設置代理服務器的緩存時間,會覆蓋max-age的設置,這樣我們可以把max-age用于本地緩存,把s-maxage用于CDN緩存時間,避免臟數據的產生。

緩存命中率
對于一個緩存而言,還有一點非常重要,就是你的緩存到底有沒有用,衡量這個東西的就是緩存命中率。如果只是靜態資源,在刷新緩存之后,可能導致命中率下降,因此CDN的資源不適合經常刷新,換句話說,如果一個請求結果會經常進行變更,那么CDN基本就沒有什么存在的意義了。

判斷是否命中緩存
還要考慮的一件事是:這個資源是否命中了CDN,是否是因為CDN導致的問題。

在各大廠商的CDN返回的數據中都會有一個X-Cache,上面內容是Hit或者Miss,還會加上諸如Memory或者Disk的縮寫表示內存還是磁盤,如果出現Upstream或者Miss則表示沒有命中。

資源預熱
緩存設計中,預熱是很重要的環節,在最初剛開始啟動CDN的時候,CDN上并沒有緩存數據,此刻大量的請求全部打向源站,肯定會把源站打掛,預熱就是實現緩存熱門數據,這樣在業務上線時,CDN上已經有所需的數據了

藍藍設計m.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 、平面設計服務

vue父子組件互相傳值

seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

一、父組件給子組件傳值

1、父組件調用子組件的時候,綁定動態屬性

/*傳值可以是值“title”、是方法“run”、是組件“this”*/
<v-header :title="title" :run="run" :home="this"></v-header>
1
2
2、在子組件里面通過props接受父組件傳過來的數據

<script>
    export default{
props:['title','run','home']
}
</script>

二、父組件主動獲取子組件的數據和方法

1、調用子組件的時候定義一個ref

<v-header ref="header"></v-header>
1
2、在父組件里面通過以下方式獲取屬性和方法

this.$refs.header.屬性
this.$refs.header.方法

三、子組件主動獲取父組件的數據和方法

this.$parent.數據
this.$parent.方法

四、非父子組建傳值

1、新建一個js文件 然后引入vue 實例化vue最后暴露這個實例

VueEvent.js

import Vue from 'vue';
var VueEvent = new Vue();
export default VueEvent;

2、在要廣播的地方引入剛才定義的實例,并進行廣播

home.vue

<script>
import VueEvent from './VueEvent.js';
    export default{
        methods:{
            emitNews(){
                /*廣播數據*/
                VueEvent.$emit('to-news',this.數據)
            }
        }
}
</script>

3、在要接收數據的地方接受廣播

news.vue

<script>
import VueEvent from './VueEvent.js';
    export default{
        /*在生命周期函數里寫,編譯的時候就調用*/
        mounted(){
            /*接受廣播*/
            VueEvent.$on('to-news',function(data){
                console.log(data);
            })
        }
}
</script>


日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
奇米一区二区三区| 久久噜噜噜精品国产亚洲综合| 亚洲女人天堂网| 国产不卡一区视频| 欧美不卡在线一区二区三区| 最新久久zyz资源站| 色系列之999| 亚洲免费高清视频| 日韩中文字幕高清在线观看| 亚洲电影免费观看高清| 亚洲天堂电影| 成年人在线免费观看| 亚洲成av人片在www色猫咪| 国产97色在线| 欧美xxxx18国产| 中文字幕一区二区三区乱码图片| 亚洲色图丝袜| 91久久精品国产91久久性色| 自拍自偷一区二区三区| 亚洲色大成网站www久久九九| 亚洲天堂av在线| 亚洲欧美日本伦理| 亚洲精品a级片| 欧美成年人视频网站| 91在线播放国产| 欧美xxxhd| 国产精品久久久久久久久久妞妞| 久久久视频免费观看| 国产精品国产三级国产普通话蜜臀| 欧美在线观看视频| 视频一区二区在线| 中文字幕在线播放网址| 欧美aa视频| 色偷偷88888欧美精品久久久| 国产精品福利电影一区二区三区四区| 国产男女猛烈无遮挡91| 在线观看av一区二区| 日本亚洲一区二区| 激情在线视频播放| 国产成人精品亚洲精品| 99热精品一区二区| 成熟亚洲日本毛茸茸凸凹| 伊人久久大香线蕉综合影院首页| 欧美色视频日本高清在线观看| 欧美日韩国产在线播放网站| 看亚洲a级一级毛片| 久久九九电影| 欧美三级视频| 1769在线观看| 国产成人精品一区二区| 红桃视频欧美| 久久久久久久久电影| 色综合五月天| 久久久久毛片免费观看| 91在线码无精品| 成人精品三级| 91九色美女在线视频| 色婷婷国产精品综合在线观看| 日韩一区二区三区免费| 91久久黄色| 欧美高清dvd| 99视频精品全部免费在线| 欧美国产丝袜视频| 男女激情视频一区| 99在线视频播放| 国产亚洲欧美日韩俺去了| 一区二区三区四区激情| 美女一区视频| 91片黄在线观看| 一区二区高清视频在线观看| 久久99高清| 激情成人在线视频| 在线精品国产亚洲| 精品自拍视频在线观看| 国产欧美精品国产国产专区| 日本三级韩国三级久久| 久久青青色综合| 国产精品日韩久久久| 亚洲国产成人久久| 久久天天综合| 亚洲综合伊人久久大杳蕉| zzjj国产精品一区二区| 牛牛精品在线视频| 国产精华一区| 欧美黑人巨大精品一区二区| 亚洲区免费影片| 亚洲春色在线视频| 国模少妇一区二区三区| 天天影视欧美综合在线观看| 九热爱视频精品视频| 日本不卡二三区| 91网站免费看| 久久激情综合| 91美女福利视频| 8050国产精品久久久久久| 欧美激情第一页在线观看| 国产精品porn| 欧美性xxxxx极品少妇| 亚洲最大的免费| 国产成人99久久亚洲综合精品| 99视频免费在线观看| 欧美日韩成人一区二区| 国产伦精品一区二区三区免费优势| 九9re精品视频在线观看re6| 亚洲伊人观看| 9色在线视频网站| 亚洲摸摸操操av| 99视频精品全部免费在线视频| 欧美精选一区| 国产视频亚洲精品| 亚洲精品国产第一综合99久久| 久久激情视频久久| 制服丝袜亚洲播放| 91深夜福利视频| 天天色天天射综合网| 国产精品久久一级| 欧美喷潮久久久xxxxx| 97成人超碰免| 久久看人人摘| 激情av综合| 黑人中文字幕一区二区三区| 福利视频在线播放| 国产亚洲欧洲高清一区| 第四色男人最爱上成人网| kk眼镜猥琐国模调教系列一区二区| 日韩高清在线播放| 亚洲同性gay激情无套| 国产精品自产拍在线观看| 国产一区二区三区四区在线观看| 国产欧美久久一区二区| 色呦呦在线资源| 欧美激情一区二区三区成人| 国产精品久久久久久久久久久久| 激情久久一区二区| 亚洲狠狠爱一区二区三区| 欧美激情一区二区久久久| 日韩免费看片| 日韩在线观看免费高清完整版| 色视频在线免费观看| 免费成人av资源网| 色av综合在线| 男人的天堂久久| 亚洲国产综合视频在线观看| 欧美一级高清大全免费观看| 免费毛片一区二区三区久久久| 成人精品gif动图一区| 亚洲中午字幕| 黄色成人免费网| 91一区二区三区在线| 欧美国产专区| 国产成人综合网| 久久国产精品一区二区| 爱爱爱免费视频在线观看| 日韩午夜电影在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品456| 亚洲欧洲国产精品久久| 羞羞色午夜精品一区二区三区| 卡通欧美亚洲| 综合毛片免费视频| 91精品视频大全| 欧美激情xxxx| 亚洲无线观看| 亚洲一区二区三区在线免费|