這是一篇詳細講解vue父子組件之間通訊的文章,初始學習vue的時候,老是搞不清楚幾個狀況前端
你是否也有這樣的疑惑呢?若是你跟我有同樣的疑惑,那麼繼續往下看吧~~vue
<template> <div class="my-parent"> <h3>我是父組件</h3> <p>父組件的年齡是:{parentAge}}</p> </div> </template> <script> export default { data() { return { parentAge: 50 }; } }; </script> <style> .my-parent { text-align: left; text-indent: 1em; width: 1000px; height: 500px; border: 1px solid #555; } </style>
<template> <div class="my-child"> <h3>我是子組件</h3> <p>子組件的年齡是:{{childAge}}</p> </div> </template> <script> export default { data() { return { childAge: 27 }; } }; </script> <style> .my-child { margin: 20px; width: 760px; height: 200px; border: 1px solid red; } </style>
v-on綁定的屬性名稱deliverParentAge與data中定義的parentAge名稱能夠不同
屬性deliverParentAge經過v-bind綁定的,也是子組件中經過props接收的,而parentAge是要傳遞給子組件的數值,它是一個值
<template> <div class="my-parent"> <h3>我是父組件,我想告訴個人子組件,個人年齡值是:{{parentAge}}</h3> <h3>我要經過v-bind(即簡寫":")語法糖綁定一個屬性deliverParentAge,將父組件的值傳遞到子組件中</h3> <!-- 下面就是個人子組件 --> <my-child :deliverParentAge="parentAge"></my-child> </div> </template> <script> import MyChild from "./Child"; export default { components: { MyChild }, data() { return { parentAge: 49 }; } }; </script>
<template> <div class="my-child"> <h5>我是子組件,我能夠經過屬性props來接收父組件傳過來的年齡值是:{{deliverParentAge}}</h5> </div> </template> <script> export default { data() { return { childAge: 27 }; }, props: { deliverParentAge: Number } }; </script>
<template> <div class="my-child"> <h5>我是子組件,我能夠經過屬性props來接收父組件傳過來的年齡值是:{{deliverParentAge}},這是一個數字類型</h5> <h5>而且,我要告訴他,他今年生日已通過了,因此他的年齡應該<button @click="AddAge">加1</button></h5> 下面我要經過this.$emit方法提交一個事件addParentAge,告訴個人父組件,他的實際年齡 </div> </template> <script> export default { data() { return { childAge: 27 }; }, props: { deliverParentAge: Number }, // 新建一個計算屬性,將父組件原來的值加1 computed: { parentActualAge() { return this.deliverParentAge + 1; } }, methods: { AddAge() { this.$emit("addParentAge", this.parentActualAge); } } }; </script>
this.$emit提交的事件名稱addParentAge,與方法handleAddParentAge名稱能夠不同
addParentAge是子組件提交的事件名稱,也是父組件經過v-on監聽的事件名稱,而handleAddParentAge是父組件自定義的方法名稱
<template> <div class="my-parent"> <h3>我是父組件,我想告訴個人子組件,個人年齡值是:{{parentAge}}</h3> <h3>我要經過v-bind(即簡寫":")語法糖綁定一個屬性parentAge,告訴子組件個人年齡值是:{{parentAge}}</h3> <!-- 下面就是個人子組件 --> <my-child :deliverParentAge="parentAge" @addParentAge="handleAddParentAge"></my-child> <h3>經過監聽子組件提交的事件addParentAge,我知道到了本身的實際年齡應該是:{{parentAge+1}},並經過方法handleAddParentAge,在控制檯打印出個人真實年齡</h3> </div> </template> <script> import MyChild from "./Child"; export default { components: { MyChild }, data() { return { parentAge: 49 }; }, methods: { handleAddParentAge(actualAge) { console.log("父組件的實際年齡是:", actualAge); } } }; </script>
如今來看控制檯打印出來的內容學習
<template> <div class="my-child"> <h5>我是子組件,我能夠經過屬性props來接收父組件傳過來的年齡值是:{{deliverParentAge}},這是一個數字類型</h5> <h5>如今我要告訴父組件,個人年齡是{{childAge}},這樣他就能夠知道,咱們<button @click="DiffAge">相差</button>多少歲</h5> <h5>而且,我要告訴他,他今年生日已通過了,因此他的年齡應該<button @click="AddAge">加1</button></h5> 下面我要經過this.$emit方法提交一個事件addParentAge,告訴個人父組件,他的實際年齡 </div> </template> <script> export default { data() { return { childAge: 27 }; }, props: { deliverParentAge: Number }, computed: { parentActualAge() { return this.deliverParentAge + 1; } }, methods: { AddAge() { this.$emit("addParentAge", this.parentActualAge); }, DiffAge() { this.$emit("differAge", this.childAge); } } }; </script>
<template> <div class="my-parent"> <h3>我是父組件,我想告訴個人子組件,個人年齡值是:{{parentAge}}</h3> <h3>我要經過v-bind(即簡寫":")語法糖綁定一個屬性parentAge,告訴子組件個人年齡值是:{{parentAge}}</h3> <!-- 下面就是個人子組件 --> <my-child :deliverParentAge="parentAge" @differAge="handleDifferAge" @addParentAge="handleAddParentAge"></my-child> <h3>經過監聽子組件提交的事件addParentAge,我知道到了本身的實際年齡應該是:{{parentAge+1}},並經過方法handleAddParentAge,在控制檯打印出個人真實年齡</h3> <h3>經過監聽子組件提交的事件differAge,並經過方法handleDifferAge,在控制檯打印出子組件的年齡</h3> </div> </template> <script> import MyChild from "./Child"; export default { components: { MyChild }, data() { return { parentAge: 49 }; }, methods: { handleAddParentAge(actualAge) { console.log("父組件的實際年齡是:", actualAge); }, handleDifferAge(child) { console.log("咱們的年齡差是:", this.parentAge + 1 - child); } } }; </script>
如今來看看頁面展現的效果和控制檯打印出來的信息this
下面貼上完整的代碼spa
// Parent.vue <template> <div class="my-parent"> <h3>我是父組件,我想告訴個人子組件,個人年齡值是:{{parentAge}}</h3> <h3>我要經過v-bind(即簡寫":")語法糖綁定一個屬性parentAge,告訴子組件個人年齡值是:{{parentAge}}</h3> <!-- 下面就是個人子組件 --> <my-child :deliverParentAge="parentAge" @differAge="handleDifferAge" @addParentAge="handleAddParentAge"></my-child> <h3>經過監聽子組件提交的事件addParentAge,我知道到了本身的實際年齡應該是:{{parentAge+1}},並經過方法handleAddParentAge,在控制檯打印出個人真實年齡</h3> <h3>經過監聽子組件提交的事件differAge,並經過方法handleDifferAge,在控制檯打印出子組件的年齡</h3> </div> </template> <script> import MyChild from "./Child"; export default { components: { MyChild }, data() { return { parentAge: 49 }; }, methods: { handleAddParentAge(actualAge) { console.log("父組件的實際年齡是:", actualAge); }, handleDifferAge(child) { console.log("咱們的年齡差是:", this.parentAge + 1 - child); } } }; </script> <style lang="stylus" scoped> .my-parent { text-align: left; text-indent: 1em; width: 1000px; height: 500px; border: 1px solid #555; } </style>
// Child.vue <template> <div class="my-child"> <h5>我是子組件,我能夠經過屬性props來接收父組件傳過來的年齡值是:{{deliverParentAge}},這是一個數字類型</h5> <h5>如今我要告訴父組件,個人年齡是{{childAge}},這樣他就能夠知道,咱們<button @click="DiffAge">相差</button>多少歲</h5> <h5>而且,我要告訴他,他今年生日已通過了,因此他的年齡應該<button @click="AddAge">加1</button></h5> 下面我要經過this.$emit方法提交一個事件addParentAge,告訴個人父組件,他的實際年齡 </div> </template> <script> export default { data() { return { childAge: 27 }; }, props: { deliverParentAge: Number }, computed: { parentActualAge() { return this.deliverParentAge + 1; } }, methods: { AddAge() { this.$emit("addParentAge", this.parentActualAge); }, DiffAge() { this.$emit("differAge", this.childAge); } } }; </script> <style> .my-child { margin: 20px; width: 760px; height: 200px; border: 1px solid red; } </style>
但願對你有用,歡迎提問與指正,一塊兒學習前端呀!code