0%

Vue 筆記 - Props 基本觀念

vue.js

前面建立 x-template 有提到如何使用 props 的情境,props 是將全域元件的資料傳到局部元件的管道,設定 props 的地方,為局部元件,可以當作是承裝資料的窗口。

使用情境

現在痊癒中有一個圖片的連結資料,要將這個連結資料透過 props 的方式傳遞到局部元件。

全域資料的圖片連結

1
2
3
4
5
6
7
var app = new Vue({
el: "#app",
data: {
url:
"https://images.unsplash.com/photo-1522204538344-922f76ecc041?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=50e38600a12d623a878983fc5524423f&auto=format&fit=crop&w=1351&q=80",
},
});

要接收資料的 HTML 與局部元件

HTML

1
2
3
4
5
6
<div id="app">
<h2>靜態傳遞</h2>
<photo></photo>
<h2>動態傳遞</h2>
<photo></photo>
</div>

Vue 局部元件

局部元件中已經建立好相關語法,可以看到已經動態綁定圖片資料名稱。

1
2
3
4
5
6
<script type="text/x-template" id="photo">
<div>
<img :src="imgUrl" class="img-fluid" alt="" />
<p>風景照</p>
</div>
</script>

局部元件相關的物件設定,idphoto

1
2
3
4
Vue.component("photo", {
props: ["imgUrl"],
template: "#photo",
});

靜態傳遞

竟態傳遞的方法是這張圖片之後也不會再變動比較適用,在 photo 元件標籤上,加上 props 定義的陣列名稱,在 HTML 中,不可以用小駝峰式的方式建立變數名稱,要使用 dash - 這個符號來區隔在元件中的名稱。

以 imgUrl 為例,這個在程式碼中遇到不同單字的第一個字母,改為大寫的寫法稱為小駝峰式。

所以在 HTML 的變數要寫成 img-url,將這個變數名稱加在 src 中。

1
2
3
4
<h2>靜態傳遞</h2>
<photo
img-url="https://images.unsplash.com/photo-1522204538344-922f76ecc041?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=50e38600a12d623a878983fc5524423f&auto=format&fit=crop&w=1351&q=80"
></photo>

這樣就完成了 props 的靜態傳遞。

動態傳遞

寫法跟靜態傳遞有點像,只是因為動態傳遞可以讓會變動的資料也能即時的接收到,所以要使用 v-bind 的綁定。

1
<photo :img-url="url"></photo>

這樣就完成了 props 的傳遞。

DEMO

小結

props 的資料傳遞在 Vue 中相當重要,懶人記憶法為是哪一個元件成為子層要接收資料,就將 props 屬性放在該元件中。

完整程式碼:

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
<div id="app">
<h2>靜態傳遞</h2>
<photo
img-url="https://images.unsplash.com/photo-1522204538344-922f76ecc041?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=50e38600a12d623a878983fc5524423f&auto=format&fit=crop&w=1351&q=80"
></photo>
<h2>動態傳遞</h2>
<photo :img-url="url"></photo>
</div>

<script type="text/x-template" id="photo">
<div>
<img :src="imgUrl" class="img-fluid" alt="" />
<p>風景照</p>
</div>
</script>

<script>
Vue.component("photo", {
// 同學請依據課程內容,自行填寫 Props 的寫法
props: ["imgUrl"],
template: "#photo",
});

var app = new Vue({
el: "#app",
data: {
url:
"https://images.unsplash.com/photo-1522204538344-922f76ecc041?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=50e38600a12d623a878983fc5524423f&auto=format&fit=crop&w=1351&q=80",
},
});
</script>