Vue中常見的幾種傳參方式小結(jié)
前言
Vue
組件傳參方也是面試最常考的內(nèi)容,猶記得當(dāng)初剛出來實(shí)習(xí)的時(shí)候,遇到一個(gè)需求,大概就是一個(gè)tabs
下面有五個(gè)子頁(yè)面,每個(gè)子頁(yè)面表示訂單的一種狀態(tài)。當(dāng)時(shí)是把五個(gè)子頁(yè)面抽成了五個(gè)組件,做完后又有一個(gè)問題,就是在一個(gè)頁(yè)面更改了數(shù)據(jù)狀態(tài)之后,切換到另一個(gè)頁(yè)面的時(shí)候要通知這個(gè)頁(yè)面更新數(shù)據(jù),當(dāng)時(shí)是完全沒有思路,找?guī)业拇蟾缃涛?,講了半天還是沒有懂,最后還是大哥手把手的教我寫完的,那時(shí)候覺得大哥好厲害,666,現(xiàn)在一想起來,不就是最簡(jiǎn)單的兄弟組件之前參數(shù)傳遞嗎???今天就來回憶一下工作中常用的幾種組件傳參的方式。
父子組件之間傳參
父子組件之間最常用的組件傳參方式就是:父?jìng)髯邮褂?code>v-bind:attr傳遞,子組件使用props
接收,子傳父使用方法傳遞,父組件在方法參數(shù)中獲取,即$emit['method':val]
,父組件使用@method
接收。
// 父?jìng)髯? // 父組件 <template> <div> 父組件 <br/> <child :name="name" @getChild="getChild"/> </div> </template> <script> export default { data(){ return { name:'father' } }, methods:{ getChild(val){ console.log(val) // 123 } } } </script> // 子組件 <template> <div> 子組件 <br/> {{name}} <button @click="toParent">傳到父組件</button> </div> </template> <script> export default { props:{ name:{ type: String, default:''} }, data(){ return { } }, methods:{ toParent(){ this.$emit('getChild',123) } } } </script>
除此之外,vue
還提供了一種語(yǔ)法糖,可以簡(jiǎn)單的實(shí)現(xiàn)父子組件間數(shù)據(jù)的雙向綁定。
// 父組件 <template> <div> 父組件 <br/> <child :name.sync="name" /> </div> </template> <script> export default { data(){ return { name:'father' } } } </script> // 子組件 <template> <div> 子組件 <br/> {{name}} <button @click="toParent">傳到父組件</button> </div> </template> <script> export default { props:{ name:{ type: String, default:''} }, data(){ return { } }, methods:{ toParent(){ this.$emit('update:name',123) } } } </script>
父組件還可以使用$refs直接調(diào)用子組件的所有屬性和方法,但是并不推薦使用這種方法。
<child ref="child"></child> // 父組件可以使用$refs.child.xxx直接調(diào)用子組件的屬性和方法
兄弟組件之間傳參
兄弟組件之間傳參可以使用vuex
、localStorage
、sessionStorage
、EventBus
事件中轉(zhuǎn),前面三種方法無非就是找第三方把數(shù)據(jù)存起來,需要的時(shí)候再獲取就行,這里主要講一下事件中轉(zhuǎn)的用法。
// 1.首先在app.vue種定義一個(gè)中轉(zhuǎn)站,再掛載到全局對(duì)象上面。 // App.vue Vue.prototype.$eventBus = new Vue() // 2.在需要傳遞的頁(yè)面使用$emit(eventName,params)發(fā)射參數(shù) this.$eventBus.$emit(eventName,params) // 3.在需要接收參數(shù)的頁(yè)面使用$on(eventName,(params) => {}) 接收參數(shù) this.$eventBus.$on(eventName,(params) => {})
這種方法其實(shí)還可以用于跨層級(jí)傳參,以前我很抵觸這種用法,后來用過一次之后覺得真香啊。還有需要注意的一點(diǎn)就是在組件銷毀的時(shí)候記得移除監(jiān)聽的事件綁定,使用$eventBus.$off(eventName)
實(shí)現(xiàn)事件監(jiān)聽移除。
provide/inject傳參
provide/inject
可以用于跨層級(jí)傳參,不過只能從上到下:
// 在上級(jí)組件中使用provide修飾的數(shù)據(jù),在下級(jí)組件中可以使用inject接收,類似于props // 上級(jí)組件 <script> export default { data(){ return { age: 12 } }, provide(){ return { name: 111, age: this.age } } } // 下級(jí)組件 <script> export default { data(){ return { } }, inject:['name','age'] // 使用時(shí)當(dāng)data數(shù)據(jù)使用就行 } </script>
值得注意的是,如果上級(jí)組件傳的數(shù)據(jù)是響應(yīng)式的,那么接收到的數(shù)據(jù)就是響應(yīng)式的,反之亦然。
總結(jié)
到此這篇關(guān)于Vue中常見的幾種傳參方式小結(jié)的文章就介紹到這了,更多相關(guān)Vue傳參方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3常用響應(yīng)式對(duì)象的api,你全用過了嗎
這篇文章主要給大家介紹了關(guān)于vue3常用響應(yīng)式對(duì)象api的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02詳解Vue單元測(cè)試Karma+Mocha學(xué)習(xí)筆記
本篇文章主要介紹了詳解Vue單元測(cè)試Karma+Mocha學(xué)習(xí)筆記,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Vue實(shí)現(xiàn)用戶沒有登陸時(shí),訪問后自動(dòng)跳轉(zhuǎn)登錄頁(yè)面的實(shí)現(xiàn)思路
這篇文章主要介紹了Vue實(shí)現(xiàn)用戶沒有登陸時(shí),訪問后自動(dòng)跳轉(zhuǎn)登錄頁(yè)面,定義路由的時(shí)候配置屬性,這里使用needLogin標(biāo)記訪問頁(yè)面是否需要登錄,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02vue循環(huán)中點(diǎn)擊選中再點(diǎn)擊取消(單選)的實(shí)現(xiàn)
這篇文章主要介紹了vue循環(huán)中點(diǎn)擊選中再點(diǎn)擊取消(單選)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09vue雙向綁定數(shù)據(jù)限制長(zhǎng)度的方法
這篇文章主要為大家詳細(xì)介紹了vue雙向綁定數(shù)據(jù)限制長(zhǎng)度的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11