2018年7月24日 星期二

【JavaScript】陣列合併concat / […groupA,…groupB] / 類陣列的轉換 / 其餘參數


陣列與物件都是儲存值

var a = [1, 2, 3, 4] //a不直接儲存[1, 2, 3, 4],而是[1, 2, 3, 4]的地址
var b=a  // b儲存了[1, 2, 3, 4]的地址
a.push(5) // [1, 2, 3, 4]改變了
console.log(b)  // [1,2,3,4,5]

取陣列

  • 可以把陣列逐一取出然後return
  • 用法:’[…array]’
var a = [1, 2, 3, 4] 
var b=[...a] //把1,2,3,4一個個拿出來,然後return回b
a.push(5) 
console.log(b)  //扔然是[1,2,3,4]

陣列合併:concat 以及 […groupA,…groupB]

  • groupAa.concat(groupB) 和 […groupA,…groupB]的結果是一樣的
var groupA = [1, 2, 3, 4] 
var groupB = [5, 6, 7, 8]

consoel.log(groupAa.concat(groupB))
console.log([...a, ...b])

類陣列轉變成真陣列

<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
var fakearray = document.querySelectorAll("li")
        console.log(fakearray)  //會得到類陣列,可以使用的方法比較少
var reallyarray = [...fakearray] //把類陣列取出,放入新陣列
        console.log(reallyarray)  //得到一個真正的陣列

其餘參數

  • 當參數太多時,可以用…表示
var money = function (a, ...b) { //參數太多了,所以只要a就好,剩下的就放進去b
    console.log(a, b)
}
money(10, 20, 30, 40, 50)

a:10
b:[20,30,40,50]


2018年7月23日 星期一

【JavaScript】陣列的批次處理 ForEach/Map/Filter/ Reduce/ Every/Some/Sort/For in


ForEach函數

  • 用來處理原始的陣列
  • 用法:陣列.forEach(function(item,index){.....})
原始資料:一個調查誰是gay的問卷
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
教授說:「哎呀,這些受訪人數的平均年齡太小了,這不好跟倫理委員會招待,讓他們多10歲吧。」
whoisgay.forEach(function (item, index) {
    item.age += 10;
})

輸出 [{
    name: "neo",
    age: 22,
    gay: true
}, {
    name: "ben",
    age: 30,
    gay: true
}, {
    name: "chen",
    age: 24,
    gay: false
}]

Map函數

  • 陣列轉換器,可以把原始資料A(N筆)一筆ㄧ的轉換資料成B(N筆)
  • Map很棒,可以它不能篩選資料。原始陣列有100筆,新資料就會有100筆。
  • 和ForEach的差別是Map會return
  • 用法:陣列.map(function(item,index){ return .....})
同樣的原始資料:調查誰是gay的問卷
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
教授說:「哎呀這其實是個匿名調查,我們只需要年齡跟性向資料就好。」
➡︎ 用map轉換正個陣列,讓他變成新的沒有名字陣列
var noname = whoisgay.map(function (item, index) {
    return {
        age: item.age,
        gay: item.gay
    }
})

console.log(noname)

輸出:
[ { age: 12, gay: true },
  { age: 20, gay: true },
  { age: 14, gay: false } ]
另一個案例:把陣列平方處理
var array = [1, 2, 3, 4, 5];

var newarray = array.map(function (item, index) {
    return item * item;  //[1,4,9,16,25]
})

Filter函數

  • Filter可以篩選資料,只要return結果是true,它就會把這筆資料塞進去新陣列
  • 用法:陣列.filter(function(item,index){ return true/false})
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
教授又來了,教授說:「哎呀,我們只要研究同性戀的年齡,那些不是同性戀的資料可以不用啦。」
var gayage = whoisgay.filter(function (item, index) {
    if (item.gay) {  //如果是gay
        return true  //就是return true,並把這個item篩進去這個陣列
    }
})

結果(2筆):
[ { name: 'neo', age: 12, gay: true },
  { name: 'ben', age: 20, gay: true } ]

Find函數

  • 找到第一筆符合的資料
  • filter會回傳陣列,但find只會找到第一筆資料
  • 用法:陣列.find(function(item,index){ if ... return item)
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
教授說:「那個啊,我們這個研究做了可以抽獎,嗯...就抽第一個是gay的同學吧。」
var ifgay = whoisgay.find(function (item, index) {
    if (item.gay) {
        return item
    }
})
輸出:{ name: 'neo', age: 12, gay: true }

Every函數

  • 如果每個資料都符合某個標準,回傳true/false
  • 用法:陣列.every(function(item,index){ if ... return 判斷式)
教授說:「那個啊,可以確定一下是不是每個受訪者都成年嗎?」
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
var ifadult = whoisgay.every(function (item, index) {
    return item.age>=20
})
輸出:false

Some函數

  • 如果有至少一筆資料是符合標準,回傳true/false
  • 用法:陣列.some(function(item,index){ return 判斷式)
教授說:「那個啊,我聽說叫neo的人很少,我看一下這些受試者是不是有至少一個叫neo的啊?」
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
var ifneo = whoisgay.some(function (item, index) {
    return item.name == 'neo'
})

輸出:true

Sort排序函數

  • 可以進行資料排序a>b(小到大)a<b(大到小)
  • 用法:陣列.sort(function(a,b){ return a<b)
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
教授說:「我想要讓資料順序,由年齡從小到大排」
whoisgay.sort(function (a, b) {
    return a.age > b.age;
    // 如果為真,就由小排到大
})

輸出:[ { name: 'neo', age: 12, gay: true },
  { name: 'chen', age: 14, gay: false },
  { name: 'ben', age: 20, gay: true } ]

Reduce函數

  • 可以有一個暫存的變數去收集資料
  • 用法:reduce(function (變數, 抓陣列的資料) { return 變數 + 抓陣列的資料}, 初始值)
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
教授:「我想要知道大家的平均年齡:)」
var total = whoisgay.reduce(function (total, item) {
    return total + item.age
}, 0)

var number = whoisgay.length

console.log(total / number)

For in

  • 可以把資料的index撈出來
var whoisgay = [{
    name: "neo",
    age: 12,
    gay: true
}, {
    name: "ben",
    age: 20,
    gay: true
}, {
    name: "chen",
    age: 14,
    gay: false
}]
for (index in whoisgay) {
    console.log(index)
}
輸出:0,1,2

【Bootstrap】nav tabs頁籤的寫法


頁籤的寫法

・輸入群組(input-group):prepend+input+append
・卡片(card):header+body+footer
・頁籤:nav(nav-tabs/card-header-tabs)>li.nav-item>a.nav-link
・列表:list-group>list-group-item
・checkbox:div.form-check>input.form-check-input+span.form-check-label
 <body>

    <div class="container">
        <h1 class="text-muted mt-4">代辦事項</h1>
        <div class="alert alert-secondary">
           <span>輸入你的待辦清單吧!</span>
        </div>
        <!-- 輸入 --> 輸入群組:prepend+input+append
        <div class="input-group">
            <div class="input-group-prepend">
                <span class="input-group-text">代辦事項</span>
            </div>
            <input class="form-control" placeholder="輸入任務">
            <div class="nput-group-append">
                <button class="btn btn-primary">送出</button>
            </div>
        </div>
        <!-- 輸入 -->
        <div class="card">
            <div class="card-header">
                <ul class="nav nav-tabs card-header-tabs">
                    <li class="nav-item ">
                        <a href="" class="nav-link active ">功課</a>
                    </li>
                    <li class="nav-item">
                        <a href="" class="nav-link">任務</a>
                    </li>
                    <li class="nav-item">
                        <a href="" class="nav-link">雜事</a>
                    </li>
                </ul>
            </div>
            <ul class="list-group list-group-flush">
                <li class="list-group-item">
                    <div class="d-flex">
                        <div class="form-check">
                            <input type="checkbox" class="form-check-input">
                            <label for="" class="form-check-label">數學</label>
                        </div>
                        <button class="close ml-auto">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                </li>
                <li class="list-group-item">
                    <div class="d-flex">
                        <div class="form-check">
                            <input type="checkbox" class="form-check-input">
                            <label for="" class="form-check-label">國文</label>
                        </div>
                        <button class="close ml-auto">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                </li>
                <li class="list-group-item">
                    <div class="d-flex">
                        <div class="form-check">
                            <input type="checkbox" class="form-check-input">
                            <label for="" class="form-check-label">嗨</label>
                        </div>
                        <button class="close ml-auto">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                </li>

            </ul>
            <div class="card-footer">表尾</div>
        </div>

    </div>

</body>

2018年7月21日 星期六

【Bootstrap】格線、spacing、flex


格線

  • 結構:・container>row>col>內容(內容不要放在col上)
如果什麼都不寫,從xs~到最大,都是一樣
col是從最小的xs為主(行動優先),至於其他尺寸需要在自己設定。
col-sm 倒下的手機
col-md 平板
col-lg 大螢幕
col-xl 大大螢幕

spacing

m/p方向-0~5
例如:
ml-4
ml-auto

flex

都是寫在外層
<div class="d-flex flex-row justify-content-end">  
//d-flex表示啟動flex排版,flex-row可以不用寫,justify-content-end可以排到右邊
           <div>1</div>
           <div>2</div>
           <div>3</div>
 </div>
  • 啟用flex
在外層寫d-flex
  • flex-direction:row 簡寫成以下
flex-row
flex-row-reverse
flex-column
flex-column-reverse
  • justify-content:flex-start 簡寫成以下
justify-content-start
justify-content-end
justify-content-center
justify-content-between
justify-content-around
  • align-items:flex-start 簡寫成以下
align-items-start
align-items-end
align-items-center
align-items-baseline
align-items-stretch

【Vue】Component區域註冊、全域註冊、x-template


1.區域註冊 (寫在new Vue裡面)

    <div id="app">
        <people v-for="item in data" :people="item"> </people>
    </div>

    var app = new Vue({
        el: '#app',
        data: {
            data: [{
                name: "jack",
                age: 20
            }, {
                name: "neo",
                age: 23
            }, {
                name: "hao",
                age: 25
            }]
        },
        components: {
            'people': {
                template: '<ul><li>{{people.name}}</li><li>{{people.age}}</li></ul>',
                props: ["people"]
            }
        } 寫在這裡,如果有一個新的vue,或是領域之外的東西就無法用
    })

2.全域註冊 Vue.components

    <div id="app">
        <people v-for="item in data" :people="item"> ->接收item的資料傳到[people] </people> 
    </div>

    Vue.component(
         'people': {
                template: '<ul><li>{{people.name}}</li><li>{{people.age}}</li></ul>',
                props: ["people"] 陣列接收資料
            }
        } 全域註冊,就可以隨便用。
    )

   var app = new Vue({
        el: '#app',
        data: {
            data: [{
                name: "jack",
                age: 20
            }, {
                name: "neo",
                age: 23
            }, {
                name: "hao",
                age: 25
            }]
        })

3.使用x-template

把模板放在template太難維護了,放在script好了
    <div id="app">
        <people v-for="item in data" :people="item"> </people>
    </div>

<script type="text/x-template" id="people">
    <ul>
        <li>{{people.name}}</li>
        <li>{{people.age}}</li>
    </ul>
</script>
    Vue.component(
        'people', {
            template: "#people",
            props: ["people"]
        }
    )

   var app = new Vue({
        el: '#app',
        data: {
            data: [{
                name: "jack",
                age: 20
            }, {
                name: "neo",
                age: 23
            }, {
                name: "hao",
                age: 25
            }]
        })

2018年7月20日 星期五

【Vue】生命週期created、mounted、updated、activated


生命週期

beforeCreate
created:建構資料
beforeMount
mounted:掛載元件,然後開始渲染
updated
activated
deactivated:元件消失,但資料不會消失
beforeDestroy
destroyed
html加上 就不會destroyed,而是變成deactivated
要用AJAX至少要等到created階段或是mounted階段

【JavaScript】三元運算符


三元運算符

(判斷式) ? (true運行這個expression1) : (false運行這個expression2)

a == 2 ? b = 'a等於2' : b = 'a不等於2'

a === b ? 0 *如果a==b運行這個:( a > b ? vm.ASC * 1 : vm.ASC * -1) *如果a=/=b運行這個

【Bootstrap】表格


表格基本結構



div.container>table>thead>th*n+tbody>tr>td*n
  • table記得要加 class=”table”
  • table記得要加 class=” table-striped “ 上樣式
  • thead可以加table-dark換顏色
 <div class="container">
            <table class="table table-striped  mt-5">
                <thead class="table-dark">
                    <th>物品</th>
                    <th>價格</th>
                    <th>價值</th>
                </thead>

                <tbody>
                    <tr>
                        <td>冷泡茶</td>
                        <td>100</td>
                        <td>很棒</td>
                    </tr>
                    <tr>
                        <td>毛巾</td>
                        <td>400</td>
                        <td>很棒</td>
                    </tr>
                    <tr>
                        <td>西瓜</td>
                        <td>700</td>
                        <td>還好</td>
                    </tr>
                </tbody>
            </table>
        </div>

【vue】表格排序的寫法:icon的運用+sort()排序

表格排序




範例:https://codepen.io/NishanYeah/pen/YjNPgx

箭頭的的icon

  • 貼入fontawesome css
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.1/css/all.css" crossorigin="anonymous">
  • 複製箭頭icon的標籤放到span當中

<span >
              <i class="fas fa-angle-up"></i>
</span>

  • 製作reverse的class,讓icon可以倒轉180deg

.reverse {
            transform: rotate(180deg)
        }
用:class切換reverse的數值
 <span class="icon" :class="{'reverse':iconreverse_left}">
                            <i class="fas fa-angle-up"></i>
 </span>

sort排序的原理

  • 預設是根據ASCII編碼排序A->Z or 1->9

data.sort(sortgogo)  //如果得到正值就從小排到大,負值就大牌到小
sortgogo = function(a,b){
  return a-b
}

數據排序

 var app = new Vue({
            el: "#app ",
            data: {
                menu: [{
                        name: "川菜",
                        price: 200,
                        discount: 3
                    },
                    {
                        name: "漢堡",
                        price: 70,
                        discount: 5
                    },
                    {
                        name: "冰咖啡",
                        price: 40,
                        discount: 10
                    }, {
                        name: "奶茶",
                        price: 100,
                        discount: 10
                    }, {
                        name: "稀飯",
                        price: 900,
                        discount: 100
                    }, {
                        name: "大奶包",
                        price: 20,
                        discount: 10
                    },
                ],
                iconreverse_right: false,
                iconreverse_left: false,
                pricepriorty: true,
                priceup: true,
                discountup: true

            },
            computed: {
                newarray: function () {
                    var vm = this;
                    pricesort = function (a, b) {
                        if (vm.priceup) {
                            return a.price - b.price
                        } else return b.price - a.price
                    }
                    discountsort = function (a, b) {
                        if (vm.discountup) {
                            return a.discount - b.discount
                        } else return b.discount - a.discount
                    }
                    if (vm.pricepriorty) {
                        return vm.menu.sort(pricesort)
                    } else return vm.menu.sort(discountsort)
                }
            }

        })

三元運算符和[]寫法


<body>
    <div id="app">

        <div class="container mt-5">
            <table class="table table-striped">
                <thead class="thead-dark">
                    <th>商品
                    </th>

                    <th class="click" @click="iconreverse_left=!iconreverse_left,priority='price',ASC=-1*ASC">價格
                        <span class="icon" :class="{'reverse':iconreverse_left}">
                            <i class="fas fa-angle-up"></i>
                        </span>
                    </th>
                    <th class="click" @click="iconreverse_right=!iconreverse_right,priority='discount',ASC=-1*ASC"> 折扣
                        <span class="icon" :class="{'reverse':iconreverse_right}">
                            <i class="fas fa-angle-up"></i>
                        </span>
                    </th>
                </thead>
                <tbody>
                    <tr v-for="item in newarray">
                        <td>{{item.name}}</td>
                        <td>{{item.price}}</td>
                        <td>{{item.discount}}</td>
                    </tr>
                </tbody>
            </table>
        </div>

    </div>
</body>

<script>
    var app = new Vue({
        el: "#app ",
        data: {
            menu: [{
                name: "川菜",
                price: 200,
                discount: 3
            }, {
                name: "漢堡",
                price: 70,
                discount: 5
            }, {
                name: "冰咖啡",
                price: 40,
                discount: 10
            }, {
                name: "奶茶",
                price: 100,
                discount: 10
            }, {
                name: "稀飯",
                price: 900,
                discount: 100
            }, {
                name: "大西瓜",
                price: 20,
                discount: 10
            }, ],
            iconreverse_right: false,
            iconreverse_left: false,
            priority: 'price',
            ASC: 1,

        },
        computed: {
            newarray: function () {
                var vm = this;
                return vm.menu.sort(function (a, b) {
                    var a = a.[vm.priority]
                    var b = b.[vm.priority]
                    return (a === b ? 0 : a > b ? vm.ASC * 1 : vm.ASC * -1)
                });
            }

        }
    })

【JavaScript】用物件Mapping的方法

If的寫法 我們希望當變數是a時就回傳1,變數是b就回傳2,變數是c就會回傳3,一般寫法就是用if,但是這樣會很冗 ​ // IF style var word if(word == 'a'){ word = 1 } else if...