0%

什麼是 localStorage ?

它可以將網頁中的資料儲存在本地端中。
也就是說它可以將用戶的瀏覽資料存在本地端的瀏覽器中。

localStorage的重要特性

目前瀏覽器中都會把localStorage的值型別限定為string型別
因為,以上這個特性,導致我們在存取資料到localStorage或取出資料時,需要做一些轉換。

以上這張圖的流程,簡易的說明了在localStorage資料的傳遞轉換的過程,以下是程式碼實現的內容

以上,這幾行程式碼就是先將陣列形式的原始資料轉成string型別。
接著,將這個轉換成string型別的原始資料,存入localStorage中。
再來,用getItem將這個string型別的原始資料取出來。
最後,再將這個string型別的資列轉回陣列形式。
最終,我們就可以用取用JSON格式資料的方式來取用內部的資料囉~~~

那你可以用開發者介面中的Application選項中,有一個localStorage的選項,你點開應該就可以看到你在這個網站上儲存的localStorage的資料囉~~
reference:
程式前沿文章

data-* - 透過 dataset 讀取自訂資料

你可以看到,我們為li標籤裡面新增了data-*之類的標籤,
並在js中利用dataset.data標籤名稱,來取得相關的data-*內的值。

另外,data-*for迴圈的運用

你可以看到我們用for迴圈的方式,來動態產生li的內容。 接著,透過dataset來擷取data-whatever的內容囉。

splice - 刪除 array 資料

1
2
3
var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
var removed = myFish.splice(3, 1);
console.log(myFish); ['angel', 'clown', 'drum', 'sturgeon']

上面這個範例就是從索引3開始,然後,刪除一個元素。

localStorage作業

這邊的作業是結合了localStorage功能的todolist。
所以,我的作業是下面這樣。

addEventListener - 事件監聽

addEventListener的括號裡面總共要填入三個引數
第一個: 你想使用的事件,比如: 'click' 點擊事件
第二個: 填入匿名function(),就是你想要做的事情
第三個: 填入false (目前,這堂課還沒講為什麼)

1
2
3
4
5
在Javascript檔案中
var btn = document.querySelector('.btn');
btn.addEventListener( 'click', function(e){
alert('Hello');
}, false);

以上這個範例的addEventListener的作用就是,使用click事件,當觸發click事件的時候,就會跳出Hello的提示訊息。

綁定事件的語法差異-傳統onclick事件 v.s addEventListener

若使用onclick事件

1
2
3
4
5
6
7
8
var btn = document.querySelector('.btn');
btn.onclick = function(){
alert('Hello-1');
}

btn.onclick = function(){
alert('Hello-2');
}

以上,我們將btn元件綁定兩個onclick事件,但最終當我們點擊btn出現的結果會是Hello-2,即第二個函式的結果,這個就是onclick事件的缺點,當你同時對同一個元件綁定多個onclick事件的時候,最終的結果,只會出現最後那一個函式的內容。

addEventListener可同時綁定多個事件

而這也是為什麼有addEventListener的這個功能,因為它可以讓只能綁定一個事件的缺點消失。

像上面這個例子,就可以將btn物件綁定兩個click事件,當我們點擊btn時,會先跳出Hello-1接著才跳租Hello-2。

Event Bubbling、Event Capturing 差異

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---HTML---
<body class="body">
<ul>
<li><a href="#" class="btn">1234</a></li>
<li><a href="#" class="btn">1234</a></li>
</ul>
</body>

---Javascript---
var btn = document.querySelector('.btn');
btn.addEventListener('click',function(e){
alert('btn');
},false);

var body = document.querySelector('.body');
body.addEventListener('click',function(e){
alert('body');
},false);

以上範例,當你點擊btn元件的時候,瀏覽器會先跳出btn,接著,跳出body,會造成這樣的原因,是因為你點擊btn的同時,也會點擊到body的區域。
而在addEventListener的最後一個引數false就跟事件觸發的順序有關,
引數是false : 代表瀏覽器會從指定元素往外找,直到找到document為止,而這也是為什麼上面這個例子會先出現btn後,才接著出現body,因為,他會先去尋找指定元素btn,跳出btn訊息,接著往外找會找到body,跳出body訊息。
引數是true: 代表瀏覽器會從最外層往內找,直到找到指定元素為止,
所以,若改成true的話,以上面這個範例,就會先出現body訊息,接著,才會出現btn訊息。

而以上這兩種狀況分別有各自的術語來代表這些狀況
A. 從指定元素,往外找到document為止 -> Event Capturing(事件擷取)
B. 從外層往內找到指定元素為止 -> Event Bubbling(事件冒泡)

stopPropagation - 中止冒泡事件

如果,我們想要避免當我們按下指定元素之後,
還會再跳出其他外層元素的相關事件內容的話,我們就要在指定元素中,呼叫stopPropagation

1
2
3
4
5
6
7
8
9
10
11
var btn = document.querySelector('.btn');
btn.addEventListener('click',function(e){
e.stopPropagation(); // 記得在function中加入引數e
alert('btn');
},false);

var body = document.querySelector('.body');
body.addEventListener('click',function(e){
e.stopPropagation();
alert('body');
},false);

以上範例,當你點擊btn的時候,
只會出現btn的內容,而沒有再出現body的內容了,
都是因為你再指定元素btn的函式裡面加了e.stopPropagation()的原因,
瀏覽器只會執行那個被監聽元素的內容。

preventDefault - 取消預設觸發行為

通常都用來取消a連結的預設行為
例:
在HTML檔案中

1
2
3
4
5
6
7
8
9
10
11
12
13
<a href="#" class="btn">btn</a>
<a href="www.google.com" class="btn_1">btn_1</a>

在Javscript檔案中
var btn = document.querySelector('.btn');
btn.addEventListener('click',function(e){
e.preventDefault();
},false);

var btn_1 = document.querySelector('.btn_1');
btn_1.addEventListener('click',function(e){
e.preventDefault();
},false);

由以上這個例子,
我們分別在btn和btn_1的監聽事件裡面加入了preventDefault()
所以,當我點擊了btn網頁就不會回到最上方,而是留在原本瀏覽器的位置。
而點擊了btn_1,也不會跳轉到連結的google網頁。

注意!!!!!!!!!!! preventDefault()stopPropagation()的作用,不要搞混囉~~~~

e.target - 了解目前所在元素位置

當你在指定元素的監聽事件裡面,丟e.target就可以得知,當下使用者點擊的是這個指定元素範圍內的哪一個標籤元素
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---HTML---
<div class="header">
<ul>
<li><a href="#"></a></li>
</ul>
</div>

---Javascript---
var el = document.querySelector('header');

el.addEventListener('click',function(e){
console.log(e.target);
concole.log(e.target.nodeName);
},false);

以上面的範例為例,指定元素是header元件,而在header元件區域內有ul, li, a這三種標籤,
當我點擊a的時候,console.log會記錄出<a href="#"></a>,即a標籤
而第二個標籤,會記錄出A,即a連結的節點名稱。
其他的ulli以此類推。

change - 表單內容更動內容時觸發

當我們有一個表單元件,我們在監聽事件裡面會丟入change,表示當該表單元素有更動的時候,執行你想要執行的函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
---HTML---
<select id="areaID">
<option value="前鎮區">前鎮區</option>
<option value="員林市">員林市</option>
</select>

---Javescript---
var el = document.querySelector('#areaID');

function updataList(e){
// do something
}
el.addEventListener('change',updateList,false);

以上的範例,就是當areaID那個表單有更動的時候,就會觸發他的監聽事件,而該監聽事件就會去執行updataList這個函式囉。

而這個功能跟for迴圈結合的範例

以上這個’change’和for迴圈的並用,就是利用list表單有更動的時候,在.name_list裡面顯示出在data陣列裡面area名稱跟option的value的值一樣的name名稱。

keyCode - 點擊鍵盤,射發火箭!

這一個單元教了,keydown這個事件,

以上這個範例,你可以看到我們先擷取到使用者在該網頁的body有按下按鈕,此時,就是keydown事件,接著,透過監聽事件去callback goRocket這個函式,
接著,switch的判斷式,判斷這個event的keyCode是多少,即擷取使用者是按下哪個鈕,若有滿足則跑case裡面的效果。

blur - 離開焦點時進行事件觸發

這個章節,利用input欄位來展示blur的功能,
當使用者將鼠標從input欄位一離開時,就會觸發blur事件,
間接的該input欄位的監聽事件會call back某個函式,
而該函式就可以檢查使用者是否有在該input欄位填入資料,
或者,填入正確型態的資料(像是:應該填入數字 但是 填入字串),進而跳出相對應的提示訊息來提示使用者。

以上範例,就是當使用者離開該input欄位的話,沒有輸入任何東西,會是空字串,則跳出提示訊息囉~~

mousemove - 當滑鼠滑入指定內容時觸發

這章教了,當你對一個物件使用mousemove事件的話,當你的鼠標移入該物件區域時,則會觸發mousemove的事件,並隨即觸發你想要在addEventListener要callback的函式。
而這個事件的應用,可以用在像遊戲的電流急急棒中,當你的鼠標碰到某個區域時,遊戲就會通知你碰到了~~~
例:

1
2
3
4
5
6
7
8
在HTML檔案中
<div class="box"></div>

在Javascript檔案中
var box = document.querySelector('.box');
box.addEventListener('mousemove',function(){
alert('你輸了');
},false);

網頁座標 - 了解 screen、page、client 箇中差異

這個章節利用’mousemove’這個事件,來擷取鼠標的座標,進而介紹
screen, page, client 之間的差別。
screenX, Y: 代表你的鼠標在當前瀏覽器畫面中的鼠標座標(有包含滾動軸和工具列)
pageX, Y: 代表你在網頁內鼠標的實際座標
clientX, Y: 代表鼠標在當網頁內鼠標的座標
你應該會發現我特別,寫瀏覽器畫面和網頁內 這兩個狀態,還有當前的網頁頁面,這些狀態要特別注意

網頁座標 - 應用篇

這一小節,蠻有趣的,學到的擷取鼠標座標應用在這,
將原本的鼠標圖案,換成卡通人物的圖案,並搭配擷取鼠標座標的功能,
來達成在網頁畫面上面卡通人物的圖案會跟著我們鼠標的移動一起移動。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在HTML檔案中
<body>
<div>
<img src="img/pic.png" class="cursor_img" alt="" width="100px;">
</div>
</body>

在css檔案中
.cursor_img{
position: fixed;
}

在Javascript檔案中
var body = document.body;
var img = document.querySelector('.cursor_img');

body.addEventListener('mousemove',function(e){
img.style.left = e.clientX;
img.style.top = e.clientY;
},false);

你可以注意到在CSS檔案中,我們把那個卡通人物的圖案的CSS屬性position設為fixed,
為的是要讓這個卡通人物的圖片能固定在網頁的畫面中,
而沒有特別去設定它的left或top的座標,是因為要用javascript來去動態的設定這個卡通人物的left和top的座標。
另外,注意!!!!!!
你要特別去注意它在Javascript中該卡通人物圖案座標的設定方法,
還要特別寫’px’這樣才能將它的座標位置設進去。

事件監聽優化篇 - 從父元素來監聽子元素內容

這一小節有講到一個特別重要的特性
就是querySelector只會去撈父元素裡面的第一筆資料。
而這個特性會導致,某些子元素不是父元素的第一筆資料,而不會被監聽到。
故我們利用直接監聽該父元素,接著,再用判斷式判斷該事件的nodeName,來看是否是我們想要監聽到的子元素。

以上的例子,可以看到在Javascript中是去監聽父元素.list,而不是直接去監聽子元素.list li。接著,在裡面有個判別nodeName的判斷式,
是為了防止當使用者點到li以外的內容,會記錄我們不想要的內容,故以此來防止。

瀏覽器功能簡介

BOM (Browser Object Model)
我們可以利用BOM元件來了解瀏覽器的資訊。
注意!! 通常我們都是擷取網頁的資訊,但是,
BOM元件是可以得知瀏覽器的資訊,像是,使用者目前是不是有網際網路連線的狀態。

回上頁功能實作

這個小節就介紹History這個BOM元件的功能。
在HTML檔案裏面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
---HTML---
<a href="b_page.html">到下一頁</a>
<a href="#" id="next">到下一頁(JS版本)</a>

---JavaScript---
<script>
document.getElementById('.next').onclick = function(){
window.history.forward();
}
</script>

---在b_page.html中---
<a href=#" id="back">回到上一頁</a>

<script>
document.getElementById("back").onclick = function(){
window.history.back();
}
</script>

以上的範例你可以看到在Javascrip中使用的BOM元件是history,
並使用了history的back()forward(),兩種指令,分別代表回到上一頁和前往下一頁的功能。

透過 JS 設計列印功能

在這一小節中,介紹了三種功能,

  1. 分別為呼叫列印功能 window.print();
  2. 擷取瀏覽器location資訊功能 location;
    其中,location有一個href,當你在這個屬性裡面塞入你想要移動到的頁面網址,
    你就可以移動到那個網頁喔~~
    1
    location.href = "https://www.google.com/";
  3. 移動到特定網頁的功能window.open("https://www.google.com/");open裡面就塞你想移動到哪個網頁

動態擷取瀏覽器高度 - innerHeight

這一小節的innerHeight的功能,
用在當設計師希望最開頭的banner能一直佔滿瀏覽器當下的畫面,
不管使用者將瀏覽器縮小或放大,除非使用者往下滑離開那個banner的區域範圍。

當使用者縮小或放大瀏覽器時,網頁的當下畫面高度值會改變,
此時,就可以用innerHeight來擷取到改變完後的網頁畫面的高度值,
並將這個高度值塞到banner區塊的高度屬性內,如此,就能達成囉~~

由以上的例子可以看到,
在javascript檔案中,利用當瀏覽器觸發onresize的事件時,
就會將網頁的高度塞給banner的高度,如此,就可以動態的改變banner的大小,
進而達到banner不管瀏覽器被放大或縮小,都可以占滿網頁版面的效果。

querySelector - 選擇單一元素

1
2
3
4
5
6
7
8
9
10
11
---HTML---
<div class="title"></div>
<div id="content"></div>

---JavaScript---
let el = document.querySelector('.title');
let el2 = document.querySelector('#content');


el.textContent = '123';
el2.textContent = '123456';

你就可以看到,我們除了可以用getElementById來選取DOM元素之外,我們也可以用querySelector來選取
目標DOM元素,而且idclassName都可以選擇。

querySelectorAll - 可重複選取多個元素

要注意的是querySelectorAll回傳的是一個NodeList的類陣列。

你可以看到我們透過querySelectorAll來取得span標籤的類陣列。

並透過ES6 寫法來將類陣列的內容淺複製到真正的陣列裡面。
如此,才能讓這個新的陣列來進行只有陣列才能用的方法囉。

setAttribute - 增加標籤屬性 v.s getAttribute - 取得標籤屬性內容

上面這個例子,我們可以透過setAttribute 來為一個a連結新增href的屬性,並為這個屬性塞入值。
接著,再用getAttribute來取得這個a連結的href屬性的內容。

插入 HTML 標籤的兩種方法

innerHTML

方法: 組完字串之後,傳進語法進行渲染
優點: 效能快
缺點: 資安風險

createElement

方法: 以DOM節點處理
優點: 安全性高
缺點: 效能差

innerHTML

a. 以上這個範例你可以看到我們透過innerHTML來為.container裡面塞入了子節點。
b. 注意~~我們將class的名稱加入innerHTML的內容裡面時,如果以最外面用單引號的時候,你裡面就要用雙引號喔,不然,這段字串會組不起來。

innerHTML會清除原本的內容

c. 你可以看到原本.container裡面有一個Hello的內容,在我們用innerHTML來將子節點塞入之後,它是會直接被清掉的喔。

innerHTML 傳統寫法v.s字版字面值

另外,我們想要在innerHTML的字串裡面塞入變數的話有兩種寫法
ex:

1
2
3
4
5
6
7
---傳統寫法---
let el = document.querySelector('.container');
let link = "https://www.google.com/";
el.innerHTML = '<a href="'+link+'">按鈕</a>';

---字版字面值---
el.innerHTML = `<a href=${link}>按鈕</a>`;

你可以看到以上的差別,傳統的寫法的意思是前面的字串是<a href=", 中間的變數內容是https://www.google.com/ ,後面的
字串是">按鈕</a>,所以,整體結果組出來才會是<a href="https://www.google.com/">按鈕</a>的效果。

那在字版字面值的寫法,
只要外面要反引號包起來,然後,變數的部分用${}包起來就可以達成跟上面的一樣效果囉~

innerHTML 與 for 迴圈

以上這個範例你可以看到,我們透過for迴圈將str變數的內容一直塞入各元素的連絡電話的內容,
等到塞完之後,再利用innerHTML來將這段組好的字串塞進去,就可以得到畫面上的效果囉。

createElement 寫法

以上這個範例你可以看到我們先透過createElement創出一個li的節點,
並在途中利用setAttributetextContent來為這個新節點塞入內容和屬性,最後,再用appendChild
來為父元素塞入這個新創出來的子節點。

XSS 跨網站指令碼注意事項(Cross-site scripting)

innerHTML 不建議用在送出表單的部分

因為,如果在送出表單部分使用innerHTML,惡意使用者很可能會蓄意的
加入一些js的語法,來駭入你的網站。
所以,innerHTML是建議用在內部從遠端抓到可信任資料的時候,並要將這些資料渲染到
畫面上時,才建議使用innerHTML

所以,這種時候,在安全性上,使用createElement的語法就比較可以避免以上這種攻擊。

那以上這種攻擊,就有一種術語叫做XSS攻擊,跨網站式的攻擊。

event(事件)

當你在function裡面丟入一個引數e,此時,當我們跟該元件互動的時候,
瀏覽器會將我們跟該元件互動的資訊(像是: 鼠標點擊的座標…等等),並將這些資訊存到這個引數e裡,此時,我們就能透過解析這個e所帶的資訊,來設計我們希望的相對應的互動了~
例:

1
2
3
4
5
6
7
8
在html檔案中
<input type="button" value="點擊" class="btn">

在Javascript檔案中
var el = document.querySelector('.btn');
el.onclick = function(e){
console.log(e);
}

根據以上的例子,當我們點擊那個input的按鈕的時候,會觸發它的onclick事件,這個時候,因為我們有丟入引數e,所以,瀏覽器會將我們跟那個按鈕互動的相關資訊,都記在e裡面。

JSON VIEW chrome 插件

那你到高雄市政府開放資料網中
你可以看到很多資料的格式,那這邊我們就會選JSON格式的資料來做使用。

json view

在課堂上有提供一個可以讓json資料易於閱讀的工具json view ,安裝完之後,
這個擴充的功能,會自動地將這些json資料排列成易於閱讀的排版。

擷取 JSON 格式流程

step1.
今天雖然你安裝的json view可以幫你將線上的json的資料排列的易於觀看,但是,這會導致資料不夠精準。
所以,當我們想要將這些json資料複製到我們本地端使用的話,還是建議用沒有使用json view排版的資料的狀態來下載下來。
你可以透過用無痕模式來達到這樣的效果。

step2.
你就將複製下來的json內容,先存到一個靜態的陣列裡面,再用console.log看看你可不可以正確的存取到這個json內的資料囉。

你可以看到,上面這個例子就是去接台中市開放的api資料,並用console.log把特定的屬性值印出來。

比較運算子:嚴謹模式 ===

當等號兩邊的數值 和 資料型別都要完全相等的時候,
才會回傳true
ex:

1
2
3
console.log(false == 0); // true
console.log(false === 0); // false
console.log(false === false); // true

以上可以看到===== 的差別囉,就要自己判斷什麼時機要用
嚴謹模式的===囉。

邏輯運算子: &&、||、!

&&|| 運算子實際上是回傳兩指定運算元之一,
因此用於非布林型態值時,它可能會回傳一個非布林型態的值。 邏輯運算子將在下表中被詳細解釋。

&& 的部分

如果前面的運算式可以被轉為false的話,就回傳運算式1。
否則,就回傳運算式2。
ex:

1
2
3
4
console.log(true && true);    // 回傳true
console.log('Cat' && 'Dog'); // 回傳Dog
console.log(false && true); // 回傳false
console.log('Cat' && false); // 回傳false

|| 的部分

如果前面的運算式可以被轉為true的話,就回傳運算式1。
否則,就回傳運算式2。
ex:

1
2
3
4
console.log('Cat' || 'Dog');  // 回傳Cat
console.log( false || 'Dog'); // 回傳Dog
console.log(false || false); // 回傳false
console.log(true || 'Dog'); // 回傳true

安裝運行 Vue Cli 3.0

vue3 和 vue2的差異

最大的差異就在於vue3有介面可以直接點,不用在自己輸入command line來安裝或運行你的程式碼的環境了。

首先,如果你有先安裝過較舊的版本的vue-cli的話,你就要先把它們卸載掉。
接著,再輸入指令npm install -g @vue/cli來安裝3.0版本的vue-cli,
安裝完成後,你可以透過vue --versoin來確認是否vue已經是第3.0版本以上囉。

那在vue 3.0以上,就可以選擇用command或gui的方式,來創建你的專案喔。
那課程這邊會先用command line的方式來進行創建。

閱讀全文 »

表單驗證補充

在課程中原本是用第二版的vee-validate,
那在第二版是透過vue的指令和html的屬性來驗證。
課堂上有提供安裝與指令步驟
那新版的vee-validate有很大的不同,就是新版是用元件的方式來進行驗證。
step1.
先輸入指令npm uninstall vee-validate,將vee-validate給卸載。
step2.
接著輸入npm install vee-validate --save,來安裝新版的vee-validate套件。
step3.
接著,你運行vue的環境,此時,會跳出一些錯誤,我們先不管它。
step4.
接下來,到main.js檔案中做一些調整。
我們先將原本引入vee-validate的內容給刪掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
---main.js---
import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import Loading from 'vue-loading-overlay'; // 引入overlay元件
import 'vue-loading-overlay/dist/vue-loading.css'; // 引入overlay元件
import 'bootstrap'
import App from './App'
import router from './router'
import './bus'
import currencyFilter from './filters/currency'
//import VeeValidate from 'vee-validate'; // 原本的vee-validate內容拿掉
//import zhTWValidate from 'vee-validate/dist/locale/zh_TW' // 原本的vee-validate內容拿掉
import zhTW from 'vee-validate/dist/locale/zh_TW'
import VueI18n from 'vue-i18n'

Vue.use(VueAxios, axios)
//Vue.use(VeeValidate); // 原本的vee-validate內容拿掉
//VeeValidate.Validator.localize('zh_TW', zhTWValidate); // 原本的vee-validate內容拿掉
Vue.config.productionTip = false
Vue.component('Loading', Loading); // 啟用overlay元件
Vue.filter('currency', currencyFilter); // 啟用fiter元件


// Vue.use(VeeValidate, {
// events: 'input|blur', //這是為了讓使用者離開該欄位時觸發驗證
// i18n,
// dictionary: {
// zhTW
// }
// })

你可以看到,我們把引入檔案和創建vee-validate元件的內容給註解掉了。
它們是屬於舊版的驗證。

閱讀全文 »

套用價格的 Filter 技巧

step1.
首先,我們先在src資料夾中,新增一個資料夾叫filters,
接著,我們在這個資料夾裡面新增一個currency.js的檔案。
在這個js檔案裡面,貼上網上提供的千分號程式碼。

1
2
3
4
5
6
7
8
---currency.js---
export default function (num) {
const n = Number(num);
return `$${n.toFixed(0).replace(/./g, (c, i, a) => {
const currency = (i && c !== '.' && ((a.length - i) % 3 === 0) ? `, ${c}`.replace(/\s/g, '') : c);
return currency;
})}`;
}

step2.
接下來,因為我們想要在全域的狀態下啟用這個currency.js的檔案,
所以,我們要將這個檔案注入main.js檔案中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---main.js---
import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import Loading from 'vue-loading-overlay'; // 引入overlay元件
import 'vue-loading-overlay/dist/vue-loading.css'; // 引入overlay元件
import 'bootstrap'
import App from './App'
import router from './router'
import './bus'
import currencyFilter from './filters/currency' // 引入currency.js

Vue.use(VueAxios, axios)
Vue.config.productionTip = false
Vue.component('Loading', Loading); // 啟用overlay元件
Vue.filter('currency', currencyFilter); // 啟用fiter元件-千分號效果

注意一下,這邊的curreny是用vue的filter的方式去註冊的喔。

閱讀全文 »

這邊紀錄的內容是專門撰寫有關使用者在使用的shopping的頁面,
跟之前紀錄的管理者在使用的狀態是不一樣的喔~~

Dashboard 新增模擬購物頁面 - 新增卡片式產品列表

step1.
首先,先在pages資料夾中,新建一個CustomerOrder的元件檔。
step2.
在index.js中引入這個CustomerOrder元件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
---index.js檔案---
import CustomerOrder from '@/components/pages/CustomerOrder' // 引入CustomerOrder元件
Vue.use(Router)

export default new Router({
routes: [
{
path:'*',
redirect:'login'
},
{
path:'/login',
name: 'Login',
component: Login
},
{
path: '/admin',
name: 'HelloWorld',
component: DashBoard,
meta: { requiresAuth: true },
children:[
{
path:'products',
name: 'Products',
component: Products,
meta: { requiresAuth: true },
},
{
path:'order',
name: 'order',
component: Order,
meta: { requiresAuth: true },
},
{
path:'coupon',
name: 'coupon',
component: Coupon,
meta: { requiresAuth: true },
}
]
},
{ // 引入 CustomerOrder的路徑
path: '/',
name: 'HelloWorld',
component: DashBoard,
children:[
{
path:'customer_order',
name: 'CustomerOrder',
component: CustomerOrder,
},
]
},
]
});

這邊要注意一下CustomerOrder的路徑,它就不是掛在admin後面,是直接首頁的後面,
而且這個頁面也不需要驗證就可以登入進去,因為,它是使用者在用的頁面。
不過,要特別注意的是,它也是屬於DahBoard的巢狀router之一喔。

閱讀全文 »