Vue 組件間傳值

本篇文章相對全面并簡潔地介紹了Vue中組件間傳值的幾種方式

一驴党、父傳子

  • 標(biāo)簽傳值
    1. 傳遞:

      當(dāng)子組件在父組件中當(dāng)做標(biāo)簽使用的時候矮烹,給子組件綁定一個自定義屬性,值為需要傳遞的數(shù)據(jù)

      <son :sex="男"></son>
      
    2. 接收:

      在子組件內(nèi)部通過props接收嘴办。props有2種接收方式:

      • 通過數(shù)組進行接收:

      props:["sex"]

      
      - **通過對象進行接收**(推薦):
      
      > 通過對象接收可以給接收的值增加數(shù)據(jù)類型限制茸塞,在較大的項目開發(fā)的時候,能利用它避免不少的錯誤描沟。
      
      ```js
      props:{
          sex:{
            type:String,   //"限制數(shù)據(jù)類型"
              default: "男",  //"默認(rèn)值"
              required:true  //"必須傳遞"
          }
      }
      // 然后就可以{{sex}}進行取值
      
  • provide/inject 跨組件傳值

    數(shù)據(jù)的流向只能是向下傳遞(包括爺傳孫)

    嚴(yán)格的來講是跨組件傳值飒泻,但是也是父傳子的一種方式

    1. 傳遞:provide

      這個配置必須在傳值方進行使用(祖先級),用來定義后代組件所需要的一些屬性和方法

      • 第一種寫法:provide是一個函數(shù)吏廉,返回一個對象
      provide(){
         return{
              username:"Hehe"
          }
      }
      

      第二種寫法:直接寫成對象:

      provide:{
         username:"Hehe"
      }
      
  1. 接收:inject

    必須在后代組建中進行使用泞遗,用來獲取根組件定義的跨組件傳來的數(shù)據(jù)

    <h2>
        根組件傳來的數(shù)據(jù)為{{username}}
    </h2>
    
    • 第一種寫法:

      inject:["username"]
      
    • 也可以寫成對象(推薦):

      同屬性傳值,對象的方式給接收的值增加數(shù)據(jù)類型限制

      inject:{
       username:{
              from:"傳值的組件"
              default:"默認(rèn)值"
          }
      

}
```

二:子傳父

  • 事件拋發(fā)傳值

    利用事件拋發(fā)的傳參原理迟蜜,進行傳值

    本質(zhì)是父組件向子組件傳遞一個方法刹孔,子組件調(diào)用這個方法,并傳遞參數(shù)實現(xiàn)子傳父

    1. 傳遞

      在子組件內(nèi)部通過this.$emit("自定義事件的名稱",需要傳遞的參數(shù))來進行數(shù)據(jù)的傳遞

      原理:this.$emit 將原先偵聽好的事件進行拋發(fā)娜睛,并傳遞參數(shù)。

      this.$emit("sonToFather","子向父傳的值")
      
    2. 接收

      當(dāng)子組件在父組件中當(dāng)做標(biāo)簽使用的時候給當(dāng)前子組件綁定一個自定義事件卦睹,值為需要接收值得函數(shù)畦戒,這個函數(shù)要特別的注意不允許加()

      <Father @sonToFather="callback">{{val}}</Father>
      
      methods:{
          callback(val){
              this.val = val
          }
      },
      

      注意事項:因為此方法基于事件拋發(fā)原理,所以必須先接收才能傳遞结序,二者同時進行亦可障斋。

  • 作用域插槽

    通過將數(shù)據(jù)綁定到組件上的方式,讓父組件得以接收

    1. 子組件中傳遞

      <!-- 在子組件中定義作用域插槽 -->
      <template>
         <div id="child">
              <!-- 在slot中通過v-bind的方式綁定數(shù)據(jù) -->
              <slot :title="title"></slot>
          </div>
      </template>
      
      
      <script>
      export default{
          name:"Child",
         data(){
              return{
                  title:"我是子組件的標(biāo)題"
              }
          }
      }
      </script>
      
  1. 父組件中接收

    <template>
       <Child>
            <template v-slot:title="slotProps">
               <h2>{{slotProps.title}}</h2>
            </template>
        </Child>
    </template>
    

三:非父子傳值

  • EventBus——事件總線

    原理:給要實現(xiàn)通信的組件雙方綁定同一個新的Vue實例徐鹤,如此便可以調(diào)用同一個實例里的 emit 和on 方法傳值垃环,類似于子傳父

    缺點:這樣雖然可以做到跨組件傳值,但傳遞方法有一定的不足——綁定一整個實例卻只用到里邊的幾個方法返敬,造成一定的性能浪費

    Vue.prototype.$eventBus = new Vue();
    
    1. 傳遞

      this.$eventBus.$emit("handler","我是傳遞的值")
      
    2. 接收

      this.$eventBus.$on("handle",(value)=>{
          this.value = value;
      })
      
  • 手動封裝事件訂閱(優(yōu)化版)

    原理同上遂庄,只不過將用到的方法自己封裝一遍,更節(jié)省性能

    // main.js 文件
    import observer from "./observer"
    
    Vue.prototype.$observer = observer
    
    // observer文件
    const eventList = {}
    const $on = function(eventName,callback){
        if(!eventList[eventName]){
            eventList[eventName] = []
        }
        eventList[eventName].push(callback)
    }
    const $emit = function(eventName,params){
        if(eventList[eventName]){
            let arr = eventList[eventName];
            arr.forEach((cb)=>{
                cb(params)
            })
        }
    }
    const $off = function(eventName,callback){
        if(eventList[eventName]){
            if(callback){
                let index = eventList[eventName].indexOf(callback);
                eventList[eventName].splice(index,1)
            }else{
                eventList[eventName].length = 0;
            }
        }
    }
    export default{
        $on,
        $emit,
        $off
    }vuex
    

vuex

跨組件傳值的最好的解決方案:共享存儲區(qū)域劲赠。放在單獨章節(jié)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涛目,一起剝皮案震驚了整個濱河市秸谢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霹肝,老刑警劉巖估蹄,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沫换,居然都是意外死亡臭蚁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門讯赏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刊棕,“玉大人,你說我怎么就攤上這事待逞∩牵” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵识樱,是天一觀的道長嗤无。 經(jīng)常有香客問我,道長怜庸,這世上最難降的妖魔是什么当犯? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮割疾,結(jié)果婚禮上嚎卫,老公的妹妹穿的比我還像新娘。我一直安慰自己宏榕,他們只是感情好拓诸,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麻昼,像睡著了一般奠支。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抚芦,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天倍谜,我揣著相機與錄音,去河邊找鬼叉抡。 笑死尔崔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褥民。 我是一名探鬼主播季春,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轴捎!你這毒婦竟也來了鹤盒?” 一聲冷哼從身側(cè)響起蚕脏,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侦锯,沒想到半個月后驼鞭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡尺碰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年挣棕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲桥。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡洛心,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出题篷,到底是詐尸還是另有隱情词身,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布番枚,位于F島的核電站法严,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏葫笼。R本人自食惡果不足惜深啤,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望路星。 院中可真熱鬧溯街,春花似錦、人聲如沸洋丐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫挨。三九已至韩肝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間九榔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工涡相, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哲泊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓催蝗,卻偏偏與公主長得像切威,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丙号,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 首先 vue 組件化的一個框架先朦。既然是組件化缰冤。那么一定存在組件和組件之間傳值的問題 在討論組件和組件怎么傳值的問題...
    人話博客閱讀 1,148評論 0 50
  • 一. 子組件向父組件傳值 - $emit 發(fā)射事件 1. 子組件$emit發(fā)射事件A 2. 父組件通過事件名A...
    嗨姑娘_大個子閱讀 3,935評論 1 1
  • vue組件間傳值 總結(jié) 1.父組件傳值給子組件,父組件用bind(用縮寫:)綁定值到子組件身上喳魏,子組件用屬性pro...
    殘陽_帥閱讀 215評論 0 3
  • 父子組件間傳值 父組件—>子組件:1.父組件使用 v-bind 綁定變量并賦值給變量棉浸。2.在子組件里使用 prop...
    廢柴阿W閱讀 176評論 0 0
  • 子組件向父組件傳值 1.在子組件中定義一個事件2.在事件中通過$emit方法傳遞數(shù)據(jù)3.在父組件中注冊通過$emi...
    Gino_Li閱讀 222評論 0 0