Home [Vue.js] 父子元件的雙向溝通示範
Post
Cancel

[Vue.js] 父子元件的雙向溝通示範

第一部分、父元件→子元件

利用props將資料傳給components使用

1. 子元件的設定

首先有一個子元件(child component),我們設定一個 propsuserName,型態為String,如果data內的參數,你可以直接在模板裡用 `` 印出,或在function內以 this.userName 來進行操作。 template的內容是以顯示 userName 在一個HTML的輸入框裡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Child Component
Vue.component("child-input", {
  template: `
    <div>
      <label>Name</label>
      <input v-model="childUserName" type="text"/>
    </div>
  `,
  props: {
    // camelCase in JavaScript
    userName: String
  },
  data: function() {
    return {
      childUserName: this.userName
    };
  }
});

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. 代表Vue會警告你盡量不要直接修改props參數的值,因此我們設定了childUserName來避免這個問題。

2. 父元件的設定

在HTML裡要用user-name來傳值,也就是說component的命名法遵循 camelCase ,到HTML內時則是用 kebab-case 來識別。 user-name:user-name 兩者的用法不同,如果是 user-name="initial_input",會把 “initial_input” 當成字串傳過去,如果前面加上冒號「:」變成 :user-name="inital_input",則是把 inital_input 這個參數的值傳過去。

1
2
3
4
5
<!-- HTML -->
<div id="app">
  <!-- kebab-case in HTML -->
  <child-input :user-name="initial_input"></child-input>
</div>
1
2
3
4
5
6
7
8
9
// js
new Vue({
  el: "#app",
  data: function() {
    return {
      initial_input: "Annie",
    };
  }
});

第二部分、子元件→父元件

利用emit將components的資料回傳

1. 子元件的設定

延續第一部分,我們在methods內新增一個 sendToParent 的function,@input="sendToParent" 代表我們觸發的時機。 看一下 sendToParent 內容,$emit 後面第一個參數”update-text“,代表設定一個 update-text 的事件,第二參數是同時把 childUserName 這個參數傳出去,如果需要傳更多的參數,直接用逗號分隔接在後面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Vue.component("child-input", {
  template: `
    <div class="form-group mt-3">
      <label>Name</label>
      <input v-model="childUserName" @input="sendToParent" type="text"/>
    </div>
  `,
  props: {
    userName: String
  },
  data: function() {
    return {
      childUserName: this.userName
    };
  },
  methods: {
    sendToParent: function() {
      this.$emit("update-text", this.childUserName);
    }
  }
});

2. 父元件的設定

父元件的部分也新增一個 getChildText 的function來接收子元件的資料,當子元件觸發’update-text‘時,就會執行 getChildText 來接收傳送的值,value就是從子元件傳來的 childUserName。如果傳多個值,記得在這邊填相應數量的參數來接收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// JS
new Vue({
  el: "#app",
  data: function() {
    return {
      initial_input: "Annie",
    };
  },
  methods: {
    getChildText: function(value) {
      this.initial_input = value;
    }
  }
});
1
2
3
4
5
<!-- HTML -->
<div id="app">
  <child-input :user-name="initial_input" 
               @update-text="getChildText"></child-input>
</div>

完整的程式碼請參考codepen上的範例:Sending Messages between Parent and Child

相關文章:

This post is licensed under CC BY 4.0 by the author.