第3章 *組件交互-子訪問(wèn)父-腳手架方式(2掌握)

參考:
https://blog.csdn.net/weixin_33813128/article/details/94177294
類似方法調(diào)用或?qū)傩栽L問(wèn)

目標(biāo)

  • 子組件給父組件傳參數(shù) $emit(觸發(fā)父組件里的事件)只磷,松藉合(掌握)
  • 通過(guò) $parent 獲取父組件數(shù)據(jù)和調(diào)用父組件方法颜价,強(qiáng)藉合(了解)
  • 子組件訪問(wèn)根組件 $root(了解)
  • 動(dòng)態(tài)組件

當(dāng)父組件獲取的數(shù)據(jù)桥言,需用通過(guò)子組件來(lái)動(dòng)作(click煞聪、change等)改變后數(shù)據(jù)盗痒,這時(shí)候我們通過(guò)ref是獲取不到的腔稀,獲取的也是改變前的數(shù)據(jù)隧哮。這時(shí)候需要用$emit

一须蜗、子組件給父組件傳參數(shù) $emit

emit 為觸發(fā)之意硅确,主要作用是子組件觸發(fā)父組件事件,完成對(duì)父組件的操作
觸發(fā)事件與方法調(diào)用不同明肮,方法調(diào)用另側(cè)必須響應(yīng)菱农,但觸發(fā)事件,父類可以不響應(yīng)柿估,不響應(yīng)也不會(huì)報(bào)錯(cuò)

vm.$emit( event, arg )

$emit 綁定一個(gè)自定義事件event循未,當(dāng)這個(gè)這個(gè)語(yǔ)句被執(zhí)行到的時(shí)候,就會(huì)將參數(shù)arg傳遞給父組件;父組件通過(guò)@event監(jiān)聽(tīng)并接收參數(shù)秫舌。
這里面隱式的定義了子-父?jìng)鬟f的步驟:

  • 子組件$emit中的第一個(gè)參數(shù)定義父組件的接收事件event的妖,第二個(gè)參數(shù)是傳輸?shù)臄?shù)據(jù)
  • 父組件用@event監(jiān)聽(tīng)并接收參數(shù),指定接收到數(shù)據(jù)后的處理函數(shù)

父組件

<template>
  <div>
  <h1>{{title}}</h1>
  <child @getMessage="showMsg" ></child>
  </div>
</template>

<script>
  import child from '@/components/emit/child'
  export default {
    data() {
      return {
        title:'我是父組件的初始值'
      };
    },
    components:{child},
    methods: {
      showMsg(param_title) {
        this.title=param_title;
      }
    },
  }
</script>

子組件

<template>
  <h1>我是測(cè)試EMIT的子組件</h1>
</template>

<script>
  
  export default {
    mounted:function(){
      this.$emit('getMessage','我是子組件給父組件傳遞的值')
    },
    data() {
      return {
        
      };
    }
  }
</script>

路由

    import  emittest from '@/components/emit/parent'
    {
    path: '/emittest',
    name: 'emittest',
    component: emittest
    }

測(cè)試

    http://localhost:8080/#/emittest

$emit傳遞多個(gè)參數(shù)

改造子組件

<script>

  export default {
    mounted:function(){
      //第一步:子組件把數(shù)據(jù)發(fā)射給父組件,并約定好父組件用@child-msg綁定接收的方法
      this.$emit('getMessage','我是子組件給父組件傳遞的值','追加的數(shù)據(jù)')
    },
    data() {
      return {

      };
    }
  }
</script>

父組件第一種寫(xiě)法

  <template>
  <div>
    <p>我是父組件</p>
    <!-- step 2父類響應(yīng)子類的事件足陨,并且指派給showmessage方法進(jìn)行處理-->
    <child @getMessage="showmessage"></child>
  </div>
  </template>

  <script>
    import child  from '@/components/emit/emitchild'
    export default{
      data(){
        return {


        }
      },
      components:{
        child
      },
      //step3 寫(xiě)對(duì)應(yīng)的事件處理函數(shù)
      methods:{
        showmessage:function(data,data2){
          alert(`我收到的子類的信息為`+"    "+data+"    "+data2);
          //可以根據(jù)業(yè)務(wù)進(jìn)行后處理
        }
      }
    }
  </script>

父組件第二種寫(xiě)法

  <template>
  <div>
    <p>我是父組件</p>
    <!-- step 2父類響應(yīng)子類的事件嫂粟,并且指派給showmessage方法進(jìn)行處理
    arguments參數(shù)名是固定的,不能任意改-->
    <child @getMessage="showmessage(arguments)"></child>
  </div>
  </template>

  <script>
    import child  from '@/components/emit/emitchild'
    export default{
      data(){
        return {


        }
      },
      components:{
        child
      },
      //step3 寫(xiě)對(duì)應(yīng)的事件處理函數(shù)
      methods:{
        showmessage:function(data){
          for (var i = 0; i < data.length; i++) {
            alert(data[i]);
          }
        
        }
      }
    }
  </script>

關(guān)鍵代碼

image.png
image.png

image.png

典型應(yīng)用:
比如兩個(gè)平行的子組件墨缘,一個(gè)是菜單星虹,一個(gè)是列表零抬,他倆有共同父組件,如果想聯(lián)動(dòng)宽涌,點(diǎn)擊菜單項(xiàng)時(shí)可以觸發(fā)父組件的方法平夜,然后這個(gè)方法負(fù)責(zé)去調(diào)用列表組件更新

第二種子類增加或減少參數(shù)時(shí),父類不需要修改代碼卸亮,擴(kuò)展性更強(qiáng)忽妒,建議使用

通過(guò)$parent 獲取父組件數(shù)據(jù)或調(diào)用父組件方法

子組件

<template>
  <div>
    <p>子組件</p>
    <button @click="showParentMsg">點(diǎn)我獲取父組件的msg</button>
  </div>
</template>

<script>
  export default{
    data(){
      return {
         msg:''
      }
    },
    methods:{
      showParentMsg:function(){
        let msg=this.$parent.msg;
        alert(msg);
      }
    }
  }
</script>

父組件

<template>
  <div>
   <child001></child001>
  </div>
</template>

<script>
  import child001 from '@/components/parentdemo/child001'
  export default{
    data(){
      return {
        msg:'我是父組件里的msg'
      }
    },
    components:{child001}
  }
</script>

<style>
</style>

路由

   import parentdemo from '@/components/parentdemo/parent'
   {
  path: '/parentdemo',
  name: 'parentdemo',
  component: parentdemo
}

調(diào)用父類的方法

父類里新增加方法

methods:{
  say:function(){
    alert("大家好");
  }
}

子類調(diào)用

    this.$parent.say();

子組件訪問(wèn)根組件 $root(不常用,了解)

子組件訪問(wèn)根組件 $root 當(dāng)前組件樹(shù)的根 Vue 實(shí)例兼贸。如果當(dāng)前實(shí)例沒(méi)有父實(shí)例段直,此實(shí)例將會(huì)是其自已。

改造上面的子組件child001里的showParentMsg方法

    methods:{
      showParentMsg:function(){
        let msg=this.$root.msg;
        console.log(msg);
      }
    }

再執(zhí)行發(fā)現(xiàn)為undefined

$root找的是最根上的對(duì)象溶诞,在腳手架里是 main.js
在 main.js里添加上如下內(nèi)容坷牛,再試一下,就可以了

  data(){
      return{
        msg:'根下的msg'
      }
  },
image.png

高級(jí)篇:動(dòng)態(tài)組件

有的時(shí)候很澄,在不同組件之間進(jìn)行動(dòng)態(tài)切換是非常有用的,比如在一個(gè)多標(biāo)簽的界面里颜及,可以通過(guò)component :is來(lái)指定當(dāng)前切換到哪個(gè)頁(yè)面甩苛。

例子:動(dòng)態(tài)切換template形式組件

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="../js/vue.min.js"></script>
    </head>
    <body>
        <div id="app">
            <button @click="activeobj='runoob'">切換到頁(yè)面1</button>
            <button @click="activeobj='runoob2'">切換到頁(yè)面2</button>
            <!-- <runoob></runoob> -->
            <!--這個(gè)位置變成動(dòng)態(tài)切換的-->
            <component :is="activeobj"></component>
        </div>
        <template id="temp1">
            <div>
                <h1>我是第一行內(nèi)容</h1><br>
                <h2>我是第2行</h2>
            </div>
        </template>
        <template id="temp2">
            <div>
                <h1>temp2我是第一行內(nèi)容</h1><br>
                <h2>temp2我是第2行</h2>
            </div>
        </template>
        <script>
            //Vue.component(componentname,options)
            Vue.component('runoob', {
                template: '#temp1'
            })
            Vue.component('runoob2', {
                template: '#temp2'
            })
            var vue1 = new Vue({
                el: '#app',
                data:{activeobj:'runoob2'}
            })
        </script>
    </body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市讯蒲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肄扎,老刑警劉巖墨林,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異犯祠,居然都是意外死亡旭等,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)衡载,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搔耕,“玉大人,你說(shuō)我怎么就攤上這事痰娱∑ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵梨睁,是天一觀的道長(zhǎng)鲸睛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坡贺,這世上最難降的妖魔是什么官辈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任箱舞,我火速辦了婚禮,結(jié)果婚禮上钧萍,老公的妹妹穿的比我還像新娘褐缠。我一直安慰自己,他們只是感情好风瘦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布队魏。 她就那樣靜靜地躺著,像睡著了一般万搔。 火紅的嫁衣襯著肌膚如雪胡桨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天瞬雹,我揣著相機(jī)與錄音昧谊,去河邊找鬼。 笑死酗捌,一個(gè)胖子當(dāng)著我的面吹牛呢诬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胖缤,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尚镰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哪廓?” 一聲冷哼從身側(cè)響起狗唉,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涡真,沒(méi)想到半個(gè)月后分俯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哆料,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年缸剪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片东亦。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡橄登,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讥此,到底是詐尸還是另有隱情拢锹,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布萄喳,位于F島的核電站卒稳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏他巨。R本人自食惡果不足惜充坑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一减江、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捻爷,春花似錦辈灼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至甜紫,卻和暖如春降宅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囚霸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工腰根, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拓型。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓额嘿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親劣挫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岩睁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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