詳細(xì)聊聊vue組件是如何實(shí)現(xiàn)組件通訊的
前言
每一個(gè)組件中的變量和數(shù)據(jù)都是獨(dú)立的,如果別的組件想要訪問另一個(gè)組件里的數(shù)據(jù)該怎么做?
如何解決組件之間通訊呢?
解決方案:
可以采用父組件傳數(shù)據(jù)給子組件,還可以子組件傳數(shù)據(jù)給父組件。簡(jiǎn)稱父?jìng)髯樱觽鞲浮?/p>
下面詳細(xì)說說父組件是如何將數(shù)據(jù)傳給子組件的。
父?jìng)髯?/h2>
理論:如果一個(gè)組件A引入并使用了另一個(gè)組件B時(shí),那么組件A就是父組件,組件B就是子組件。
實(shí)現(xiàn)過程:
1.在父組件中引入子組件、注冊(cè)子組件、使用子組件
2.在父組件中的子組件標(biāo)簽上自定義一個(gè)屬性 左邊是定義的名稱,右邊是父組件中的數(shù)據(jù) 例如
<MyCon :list="list" />
3.在子組件中用prpos接收父組件傳來的數(shù)據(jù) 例如:prpos:['list'] 注意這里面的名稱必須要和父組件
定義的名稱一致才能可以。
原理圖示
父組件 Footer.vue
在父組件中的子組件標(biāo)簽上自定義一個(gè)屬性
<template> <div> <h1>父組件傳子組件</h1> <!-- 使用組件 自定義屬性 --> <MyCon :name="name" :age="age" /> </div> </template> <script> // 引入組件 --> 創(chuàng)建組件 --> 使用組件 // 引入組件 import MyCon from "./MyCon.vue"; export default { // 創(chuàng)建組件 components: { MyCon }, // 數(shù)據(jù) data() { return { name: "張三", age: 38, }; }, }; </script>
子組件 MyCon.vue
在子組件中用prpos接收父組件傳來的數(shù)據(jù)
<template> <div> <h2>子組件</h2> // 直接在標(biāo)簽中使用 <p>{{ name }} {{ age }}</p> <button @click="fn">點(diǎn)擊修改props的值</button> </div> </template> <script> export default { // 子組件接收父組件傳來的數(shù)據(jù) props: ["name", "age"], methods: { fn() { this.name = "傻逼譚磊"; this.age = 20 }, }, }; </script>
小案例 采用了父?jìng)髯?/h2>
父組件 App.vue
<template> <div style="border: 1px solid #ccc; margin: 5px; padding: 5px"> <h1>父組件</h1> <!-- 1. 父?jìng)?。自定義屬性 --> <MyProduct v-for="item in list" :key="item.id" :price="item.proprice" :info="item.info" :goodname="item.proname" /> </div> </template> <script> // 導(dǎo)入->注冊(cè)->使用 import MyProduct from "./MyProduct.vue"; export default { data() { return { list: [ { id: 1, proname: "超級(jí)好吃的棒棒糖", proprice: 18.8, info: "開業(yè)大酬賓, 全場(chǎng)8折", }, { id: 2, proname: "超級(jí)好吃的大雞腿", proprice: 34.2, info: "好吃不膩, 快來買啊", }, { id: 3, proname: "超級(jí)無敵的冰激凌", proprice: 14.2, info: "炎熱的夏天, 來個(gè)冰激凌了", }, ], }; }, components: { MyProduct }, }; </script> <style> </style>
子組件 MyProduct.vue
<template> <div style="border: 1px solid #ccc; margin: 5px; padding: 5px"> <h2>標(biāo)題: {{ goodname }}</h2> <p>價(jià)格: {{ price }}元</p> <p>{{ info }}</p> </div> </template> <script> export default { props: ["goodname", "price", "info"], }; </script> <style> </style>
效果展示
子傳父
實(shí)現(xiàn)過程
1.在父組件中引入子組件、注冊(cè)子組件、使用子組件
2.在父組件的子組件標(biāo)簽上加一個(gè)事件監(jiān)聽 例如: <MyCon @abc="fn" />
3.在子組件中觸發(fā)這個(gè)自定義的監(jiān)聽事件。例如:this.$emit("abc",參數(shù))
原理圖示
父組件 App.vue
在父組件的子組件標(biāo)簽上加一個(gè)事件監(jiān)聽 用形參接收數(shù)據(jù)
<template> <div> <h1>父組件</h1> <!-- 1.添加事件監(jiān)聽 --> <!-- 當(dāng)子組件發(fā)生了abc事件要執(zhí)行fn函數(shù) --> <MyCon @abc="fn" /> </div> </template> <script> // 引入子組件 import MyCon from "./MyCon.vue"; export default { methods: { // 形參接收 fn(obj) { // 打印查看有沒有獲取到 console.log("fn發(fā)生了abc事件", obj); }, }, components: { MyCon }, }; </script>
子組件 MyCon.vue
在子組件中觸發(fā)這個(gè)自定義的監(jiān)聽事件
<template> <div> <h2>子組件</h2> <button @click="ConFn">子傳父</button> </div> </template> <script> export default { methods: { ConFn() { console.log("子組件click"); // 2.觸發(fā)abc事件 this.$emit("abc", { name: "吊毛譚磊" }); }, }, }; </script>
商品案例 運(yùn)用了子傳父
父組件 App.vue
<template> <div style="border: 1px solid #ccc; margin: 5px; padding: 5px"> <h1>父組件</h1> <!-- 1. 父?jìng)?。自定義屬性 --> <!-- 添加自定義事件 --> <MyProduct v-for="(item, idx) in list" :idx="idx" :key="item.id" :price="item.proprice" :info="item.info" :goodname="item.proname" @pdd="fn" /> </div> </template> <script> // 導(dǎo)入->注冊(cè)->使用 import MyProduct from "./MyProduct.vue"; export default { data() { return { list: [ { id: 1, proname: "超級(jí)好吃的棒棒糖", proprice: 18.8, info: "開業(yè)大酬賓, 全場(chǎng)8折", }, { id: 2, proname: "超級(jí)好吃的大雞腿", proprice: 34.2, info: "好吃不膩, 快來買啊", }, { id: 3, proname: "超級(jí)無敵的冰激凌", proprice: 14.2, info: "炎熱的夏天, 來個(gè)冰激凌了", }, ], }; }, components: { MyProduct }, methods: { fn(obj) { console.log("父組件,收到了pdd事件", obj); // 計(jì)算砍了幾元 相減 再進(jìn)行重新賦值 this.list[obj.idx].proprice -= obj.ran; }, }, }; </script> <style> </style>
子組件 MyProduct.vue
<template> <div style="border: 1px solid #ccc; margin: 5px; padding: 5px"> <h2>標(biāo)題: {{ goodname }}</h2> <p>價(jià)格: {{ price }}元</p> <p>{{ info }}</p> <button @click="bargain">隨機(jī)砍價(jià)</button> </div> </template> <script> export default { // 子接收 props: ["goodname", "price", "info", "idx"], methods: { bargain() { // 隨機(jī)數(shù)字 const ran = Math.ceil(Math.random() * 10); // 觸發(fā)自定義事件 // 為了知道具體是哪個(gè)商品要減少價(jià)格,所以要回傳idx下標(biāo) this.$emit("pdd", { idx: this.idx, ran }); }, }, }; </script> <style> </style>
效果展示
總結(jié)
到此這篇關(guān)于vue組件是如何實(shí)現(xiàn)組件通訊的文章就介紹到這了,更多相關(guān)vue實(shí)現(xiàn)組件通訊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-cli3單頁(yè)構(gòu)建大型項(xiàng)目方案
這篇文章主要介紹了vue-cli3單頁(yè)構(gòu)建大型項(xiàng)目方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Vue3中Element-Plus分頁(yè)(Pagination)組件的使用
Element-Plus分頁(yè)(Pagination)組件在開發(fā)過程中數(shù)據(jù)展示會(huì)經(jīng)常使用到,同時(shí)分頁(yè)功能也會(huì)添加到頁(yè)面中,下面我們就來學(xué)習(xí)一下它的具體使用,需要的可以參考一下2023-11-11Vue.js 實(shí)現(xiàn)微信公眾號(hào)菜單編輯器功能(二)
這篇文章主要介紹了Vue.js 實(shí)現(xiàn)微信公眾號(hào)菜單編輯器功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05vue3中element-plus?Upload上傳文件代碼示例
這篇文章主要介紹了vue3中element-plus?Upload上傳文件的相關(guān)資料,在時(shí)間開發(fā)中上傳文件是經(jīng)常遇到的一個(gè)需求,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08使用vue實(shí)現(xiàn)簡(jiǎn)單鍵盤的示例(支持移動(dòng)端和pc端)
這篇文章主要介紹了使用vue實(shí)現(xiàn)簡(jiǎn)單鍵盤的示例(支持移動(dòng)端和pc端),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12前端vue中實(shí)現(xiàn)文件下載的幾種方法總結(jié)
這篇文章主要介紹了前端vue中實(shí)現(xiàn)文件下載的幾種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Vue?echarts實(shí)例項(xiàng)目地區(qū)銷量趨勢(shì)堆疊折線圖實(shí)現(xiàn)詳解
Echarts,它是一個(gè)與框架無關(guān)的 JS 圖表庫(kù),但是它基于Js,這樣很多框架都能使用它,例如Vue,估計(jì)IONIC也能用,因?yàn)槲业牧?xí)慣,每次新嘗試做一個(gè)功能的時(shí)候,總要新創(chuàng)建個(gè)小項(xiàng)目,做做Demo2022-09-09vue.js計(jì)算屬性computed用法實(shí)例分析
這篇文章主要介紹了vue.js計(jì)算屬性computed用法,結(jié)合實(shí)例形式分析了vue.js使用computed方式進(jìn)行屬性計(jì)算的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07