Vue 父組件與子組件之間的資料傳值方法

父組件傳值給子組件 (使用 props 屬性)

當需要做動態的綁定將父組件的資料傳給子組件的方式是 props,而 props 是單向傳遞
引入 issue-create 組件 (props 需要轉換相對應的 kebab-case (短橫線隔開) 方式命名

父組件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<template lang="pug">
div.dvIssue
issue-create(:info="info")
</template>

<script lang="coffee">
import IssueCreate from '@/IssueCreate'
export default
name: 'IssueShow'
components: {
IssueCreate
}
data: ()->
info:
msgVal: 'abc'
</script>

子組件

接收時,就用 props 屬性

1
2
3
4
5
6
7
8
9
10
11
12
<template lang="pug">
div.dvIssueCreate
span {{ info.msgVal }}
</template>

<script lang="coffee">
export default
name: 'IssueCreate'
props:
info:
type: Object # 指定傳入的類型,如果類型不正確就會警告
</script>

子組件傳值給父組件 ($emit)

有因為props 是單向傳遞的,主要是為了避免子組件不小心修改父組件的狀態,造成可怕現象。所以若我們想在子組件通知父組件的話,可以透過觸發事件來通知父組件 $emit 方法。

父組件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<template lang="pug">
div.dvIssue
issue-create(v-on:issueState="onIssueCallback")
</template>

<script lang="coffee">
import IssueCreate from '@/IssueCreate'
export default
name: 'Issue'
components: {
IssueCreate,
}
methods:
onIssueCallback: (data)->
# 寫回傳後續的操作
console.log(data)
</script>

子組件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<template lang="pug">
div.dvIssueCreate
v-btn(@click="onCreate()") 這是按鈕
</template>

<script lang="coffee">
export default
name: 'IssueCreate'
methods:
onCreate: ()->
param =
data: 'Hello'
@.$emit('issueState', param)
</script>