0%

Vue Router 參數設定

在vue的官方文件中,有針對router的設定做了詳細的介紹,
像是你在router資料夾中的index.js檔中,你為各元件所設定的name, path這些屬性都是在
這份文件中有介紹到。

router mode 可選值

在課堂上有特別講到router的mode屬性
官方文件的Router的mode介紹

hash

這個屬性有三個值可以使用,那我們一般是用預設值hash
也就是你的網址中路由前面會出現一個#

history - 不建議使用

那如果你設定history的話

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
---router資料夾中的index.js檔案---
export default new VueRouter({
mode:'history', // 改成history模式
routes:[
{
name:'首頁',//元件呈現名稱
path:'/index', //對應虛擬的路徑
component:Home , //它所對應的原件
},
{
//name:'分頁',//元件呈現名稱
path:'/page', //對應虛擬的路徑
//component:Page , //它所對應的原件
components:{
default: Page,
menu: Menu,
},
children:[
{
name:'child1',//元件呈現名稱
path:'', //對應虛擬的路徑
component:child_1 , //它所對應的原件
},
{
name:'child2',//元件呈現名稱
path:'child2', //對應虛擬的路徑
component:child_2 , //它所對應的原件
},
{
name:'child3',//元件呈現名稱
path:'child3', //對應虛擬的路徑
component:child_3 , //它所對應的原件
}
]
}
]
});

你會發現你的網址在做路由切換的時候,#號不見了,
沒有#號的網址
你要特別注意,當沒有#號的時候,它是使用後方的路由,不是只有使用前端的路由,
因此,當我們用history模式的時候,必須要前後端一起搭配,
所以,因為目前課堂上的專案只有使用前端路由,所以,不建議你在目前的專案上使用這種路由設定,除非之後有前後端一起搭配。

閱讀全文 »

使用Vue Router 及配置路由文件

user頁面
product頁面
以上範例,你可以看到它們都是停留在index的網址上,
但是,會因為我們在#後面所接入的內容不同,來呈現不同元件的內容。
像上面圖片是#/user,所以,此時是呈現 user 元件。
像下面圖片是#/product,所以,此時是呈現 product 元件。

故本節是紀錄怎麼建立Vue Router

Router會包含幾個檔案

首先,進入點
包含它會注入src資料夾中的元件檔和其他的component檔案。

第二,新增路由的配置檔案
這個配置檔案會決定在哪個路由中呈現哪個元件檔案。
那它執行的路徑會在router/index.js 中。

第三,分頁內容

Vue Components 就是一些元件的檔案,例如專案檔中的Hellowolrd.vue檔。

接下來,介紹安裝vue 的router步驟
step1.
先輸入 npm install vue-router --save 指令

step2.
在src資料夾中,新建一個叫router的資料夾
在router下再新增一個叫index.js的檔案,這個檔案就是要放整個路由的配置檔。

step3.
在index.js檔案中輸入
import Vue from 'vue'
import VueRouter from 'vue-router'

以上這兩行呢,是將官方提供的元件給引入進來。

接下來,在這兩行之後就是引入我們自己的元件囉。
import Home from '@/component/HelloWorld'
引入在src資料夾中的HelloWorld元件檔,並將它命名為Home

step4.
在你引入完官方元件 和你自己的元件檔之後,
就是要輸入啟用的指令,
那你就在同一個index.js檔案中,在引入程式碼的後方輸入Vue.use(VueRouter)
ex:

1
2
3
4
5
6
7
import Vue from 'vue'
import VueRouter from 'vue-router'

// 以上為官方提供的元件
import Home from '@/component/HelloWorld'

Vue.use(VueRouter) // 啟用指令
閱讀全文 »

this - 教你如何操作本身元素

this 指的是觸發該事件的元素
所以,我們利用this來指定觸發該事件的元素,並利用this來做一些操作。

parent() - 找到父階層元素

利用parent()語法,來找到父元素,並為父元素修改它的css樣式。

在以上的範例中,當按下a連結按鈕,就利用parent去找到它的外層父元素,也就是li,故我們就可以直接為li修改它的CSS樣式囉。

siblings() - 同層元素

利用語法siblings()來找到同一層中的其他元素,並為它們修改CSS樣式

你可以看到以上範例的JS檔案中,在我們按下a連結按鈕後,會先用parent()去找它的父元素,也就是li
接著,找到父元素後,會接著執行toggleClass('active'),再來,會執行sibilings(),去找其他同層的li,並執行removeClass
來消除它們的bg-warning text-white的className。

preventDefault 取消默認行為

ex:

1
2
3
4
5
6
7
8
9
---HTML---
<a href="http://www.google.com.tw" class="close>按鈕</a>

---JavaScript---
$(document).ready(function(){
$('.close').click(function(e){
e.preventDefault();
})
})

由以上的程式碼就可以將原本a連結的預設效果給取消。
所以,當我們按下這個a連結,就不會跳轉到http://www.google.com.tw 網址囉。

那為什麼要在a連結的js中,加上preventDefault呢,是因為今天該a連結
如果,只有要觸發某個事件,並沒有要讓頁面連到別的網頁的時候,
就需要用到preventDefault囉。

閱讀全文 »

Vue Cli 所產生的資料夾結構說明

在VScode的環境下使用Vue

你先用vscode打開那個vue專案檔,接著,在你的編譯器中輸入 ctrl + 反斜線 (在鍵盤左上角數字鍵1左邊的那個按鍵),
這時候,會跳出來可以輸入指令的區塊,輸入npm run dev之後,應該會跳出http:\\localhost:8080的提示訊息,接著,直接在瀏覽器中輸入http:\\localhost:8080,就可以在網頁上開啟你的專案了。

接下來是vue cli產生的檔案介紹

README.md

這個檔案裡面,有提供一些vue cli可以用的指令
npm install 就是安裝相關的套件。
npm run dev 運行開發中的環境
npm run bulid 運行正式版的環境

當我們執行npm run build,它會運行 build/build.js 的檔案,將所有的網頁內容打包壓縮。
當我們輸入這個指令之後,專案檔會產生出一個 dist 的資料夾。
那在這個 dist 資料夾中,會有一個 index.html,這個 html 一定要在 HTTP 的 server 下才能運行,直接打開它是沒有辦法運行的喔,要用像是 live server 這種套件,打開它才行。

小插曲 - index.html 引入的 css 和 js 報 MIME type 的錯誤

當我用嘗試用Go live來將dist資料夾中的index.html在瀏覽器中開啟,
但是,卻出現以下的錯誤log

這個問題主要是因為讀不到專案檔裡面的樣式檔導致的,
所以,你看以上的圖片中它是說該錯誤是發生在index.html檔案中,
所以,你就去dist資料夾中的index.html中,該改它引入的路徑
原本預設的路徑是

1
2
3
<script type=text/javascript src=/static/js/manifest.2ae2e69a05c33dfc65f8.js></script>
<script type=text/javascript src=/static/js/vendor.0aad2172a75b8ed4f46c.js></script>
<script type=text/javascript src=/static/js/app.2f2e5edd9af2c59aa514.js></script>

你可以看到src的最前面都有一個反斜線/
你就將這個反斜線都去掉

1
2
3
<script type=text/javascript src=static/js/manifest.2ae2e69a05c33dfc65f8.js></script>
<script type=text/javascript src=static/js/vendor.0aad2172a75b8ed4f46c.js></script>
<script type=text/javascript src=static/js/app.2f2e5edd9af2c59aa514.js></script>

改完之後,就能正常的在VSCode中的live Server中,正確的在瀏覽器中,打開dist資料夾中的index.html檔案囉。

閱讀全文 »

什麼是 Vue Cli?

  1. 它是基於 Webpack 所建置的開發工具
  2. 透過 Vue Cli 我們就可以輕鬆的使用各種第三方元件(像是BS4, Vue Router…)
  3. 可以運行 Sass, Babel 等編譯工具
  4. 便於開發 SPA 的網頁工具
  5. 靠簡單設定,就能搭建開發時常用環境

什麼是SPA?

它是由前端所模擬的路由
user頁面
product頁面

在SPA的概念下,頁面跟頁面之間的切換,只會更動部分元件,並不會造成整個頁面的重整,
所以,可以讓使用者有更好的體驗。

在SPA的概念底下,也就意味著前端網頁和後端的Web Server是分開的。
後端會提供API的接口,接著,前端會用Ajax來做串接。
當前端透過 Ajax 接受到資料之後,再透過 JavaScript 來變換頁面上的內容。

Vue Cli 的限制

它不便於開發非SPA的網頁,
若你需要開發非SPA的網頁的話,你就直接手動將Vue.js載入你的專案就可以解決這個問題。

閱讀全文 »

JQ選擇器

ex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---HTML---
<div class="header">
<h1>標題一</h1>
</div>

<div id="app">
<h2>標題二</h2>
</div>

---JavaScript---
<script>
$(document).ready(function(e){
$('.header h1').hide();

$('#app h2').fadeIn(1000);
})
</script>

以上範例你可以看到,jQ選擇dom元素的方法跟CSS樣式命名差不多,
只不過,我們要透過jQ來選擇dom元素的話,都要加${'目標dom元素'}
在以上這個寫法的單引號中間,放入你的目標 dom即可選到它了。
接著,在你寫完選擇器後,再接內建的jQ語法囉。

閱讀全文 »

jQuery的選擇器寫法

ex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---HTML---
<div>
<a href="#" class="btn btn-danger">按鈕</a>
</div>

<div class="header">
<h1>標題</h1>
<div>
---JavaScript---
<script>
$('a').hide();
$('.header').hide();
$('a').attr('href', 'http,://www.kimo.com.tw'); // 更改a標籤的href屬性
</script>

你可以看到jQ的dom選擇器就是$('')在這個單引號的中間,加入目標的HTML標籤 或 它的className。
選擇完後,在它的後面就再接jQ的內建方法 或者更改該元素的一些內建的屬性。

閱讀全文 »

Extend

假設今天有兩個元件,他們的差異非常小,
只有少部分不同的話,該怎麼處理呢?

那就先把兩個元件重複的部分抓取出來,接著,用Vue.extend的技巧將重複的部分存起來。
ex:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
---HTML---
<div id="app">
<table class="table">
<tbody>
<tr is="row-component-one" v-for="(item, key) in data"
v-if="key % 2"
:item="item" :key="key"></tr>
<tr is="row-component-two" v-for="(item, key) in data"
v-if="(key - 1) % 2"
:item="item" :key="key"></tr>
</tbody>
</table>
</div>

---JavaScript---
<script type="text/x-template" id="row-component">
<tr>
<td>{{ item.name }}</td>
<td>{{ item.cash | currency | dollarSign }}</td>
<td>{{ item.icash | currency | dollarSign }}</td>
</tr>
</script>

<script type="text/x-template" id="row-component-two">
<tr class="bg-primary text-white">
<td>{{ item.name }}</td>
<td>{{ item.cash | currency | dollarSign }}</td>
<td>{{ item.icash | currency | dollarSign }}</td>
</tr>
</script>

<script>
var childOne = {
props: ['item'],
data: function() {
return {
data: {},
extendData: '這段文字是 extend 得到'
}
},
template: '#row-component',
filters: {
dollarSign: function (n) {
return `$ ${n}`
},
currency: function(n) {
return n.toFixed(2).replace(/./g, function(c, i, a) {
return i && c !== "." && ((a.length - i) % 3 === 0) ? ',' + c : c;
});
}
},
mounted: function() {
console.log('Extend:', this)
}
}

var childTwo = {
props: ['item'],
data: function() {
return {
data: {},
extendData: '這段文字是 extend 得到'
}
},
template: '#row-component-two',
filters: {
dollarSign: function (n) {
return `$ ${n}`
},
currency: function(n) {
return n.toFixed(2).replace(/./g, function(c, i, a) {
return i && c !== "." && ((a.length - i) % 3 === 0) ? ',' + c : c;
});
}
},
mounted: function() {
console.log('Extend:', this)
}
}
var app = new Vue({
el: '#app',
data: {
data: [
{
name: '小明',
cash: 100,
icash: 500,
},
{
name: '杰倫',
cash: 10000,
icash: 5000,
},
{
name: '漂亮阿姨',
cash: 500,
icash: 500,
},
{
name: '老媽',
cash: 10000,
icash: 100,
},
]
},
components: {
"row-component-one": childOne,
"row-component-two": childTwo,
},
mounted: function() {
console.log('Vue init:', this)
}
});
</script>
閱讀全文 »

接續上一篇內容。

Directive 開發自己的互動UI

Directive的功用為,Vue.js 提供自定義指令讓開發者直接從底層操作 DOM 物件。

Directive 有屬於它自己的生命周期。

ex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---HTML---
<div id="app">
<input type="text" v-focus>
</div>


---Javascript---
Vue.directive('focus', {
// 當綁定元素插入父元素後,會觸發 inserted hook 內的內容
inserted: function (el) {
el.focus() // 聚焦元素
}
})

var app = new Vue({
el:'#app',
data:{}
})

以上這個範例,可以看出來directive有它自己的生命週期。
bind: 只會執行一次,即該自訂義事件第一次跟被綁定元素綁定時會觸發這個hook的內容。
inserted: 當被綁定元素,完成插入父元素之後,會觸發inerted hook 的內容。
update: 綁定元素在模版更新時,會觸發
它不只有上面三種生命週期,可以直接去看官方看看其他生命週期介紹。
官方文件

directive 的 Hook函式所能使用的參數

在官方文件中有提供,directive的Hook有一些參數可以直接使用
el: 可以獲得被自訂義指令綁定的目標元素,且直接操縱這個被綁定的目標元素
binding: 被綁定目標元素的特性,有以下幾個,我只簡列幾項

  • name: 沒有前綴詞v-的自訂義事件名稱,像上面範例的v-focus,去掉v-,它的自訂義事件的name屬性就是focus
    有關binding還有其他的參數可以使用,可以看一下官方文件。

那以上這個範例,每次頁面刷新的時候,該input欄位就會藉由v-focus來觸發在directive中自訂義的focus內容,自動將畫面焦點移到這個input欄位中。

閱讀全文 »