使用 props
傳送數據
每一個 component
都作用域是各自獨立的,這也意味著不能(也不應該)在子組件內直接
引用父組件的數據。父組件的數據需要透過 props
才能下發到子組件中。
基本使用
Parent1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <template> <div> <child message='From parent'></child> </div> </template>
<script> import Child from '@/components/Child';
export default { components: { Child, }, name: 'app', }; </script>
|
Child1 2 3 4 5 6 7 8 9 10 11 12 13
| <template> <div> <span>Message: {{message}}</span> </div> </template>
<script> export default { props: { message: 'From child' }, }; </script>
|
camelCase vs. kebab-case
若在js使用 camelCase 則html要使用 kebab-case
Parent1 2 3 4 5
| <template> <div> <child my-message='From parent'></child> </div> </template>
|
Child1 2 3 4 5
| export default { props: { myMessage: 'From child' }, };
|
動態 Props
與綁定到任何普通的HTML特性相似,我們可以使用 v-bind
來動態將 props
綁定到父組件的數據,這樣當父組件的數據變化時,該變化也會傳給子組件。
Parent - input的數據會傳給child1 2 3 4 5
| <div> <input v-model="parentMsg"> <br> <child v-bind:my-message="parentMsg"></child> </div>
|
單項數據流
props
是單項綁定的,當父組件的數據改變時,將其傳給子組件,但子組件不能傳給父組件,這是為了避免無意間修改了父組件的數據,避免數據流變得難以理解
不建議在子組件內改變 props
,因為每次父組件更新時,子組件的 props
會更新為最新值,若要改變使用記得另外宣告一個變量來記錄
Props 驗證
我們可以指定組件的 props
驗證規則,如果傳入的數據不符合要求Vue會發出警告,這樣對於開發給他人使用組件時非常有用。
Child1 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
| export default { props: { propA: Number, propB: [String, Number], propC: { type: String, required: true }, propD: { type: Number, default: 100 }, propE: { type: Object, default: function () { return { message: 'hello' } } }, propF: { validator: function (value) { return value > 10 } } } };
|
注意事項
- 在 JavaScript 中物件和陣列是引用類型,指向同一個記憶體空間,如果
props
是一個物件或陣列,在子組件內部改變它會影響父組件的狀態。
- 注意 props 會在組件實例創建之前進行校驗,所以在
default
或 validator
函數里,諸如 data
、 computed
或 methods
等實例屬性還無法使用。
參考資料