vue組件間傳值---下到上 篇

$emit:向父級傳值

單純從emit角度而言沒啥好說的

組件內(nèi)部$emit('someEvent')
使用組件時:<SomeComponent @someEvent="functionToHandleSomeEvnent">,注意這里不傳參,someEvent需保持一致
son組件

<template>
  <div class="son">
    <h1>這是son組件</h1>
    <span>來自father的值(fatherToSon1):{{fatherToSon1}}
      <button @click="changeFatherToSon1">使用emit</button>
    </span>
  </div>
</template>
<script>
  export default {
    name: "Son",
    data(){
      return {
        sonData:1
      }
    },
    props: {
      fatherToSon1: Number,
    },
    methods: {
      changeFatherToSon1() {
        this.$emit('changeFatherToSon1',2)
      }
    }
  }
</script>

father組件
在使用son組件的地方注冊一個和son組件中emit第一個參數(shù)一樣名字的函數(shù)赖草,簡單來說野哭,就是son組件emit時的第一個參數(shù)要和使用son組件時@后面寫的保持一致夕膀。(@可以理解為給某一個類型的事件綁定一個處理函數(shù)@事件類型=處理該事件的函數(shù)而柑,像@click是vue幫我們定義好的吓蘑,而@changeFatherToSon1是我們自己定義的)

<template>
  <div class="father">
    <h1>這是father組件</h1>
    <p>來自ancestors的值:{{provideFromAncestors}}</p>
    <button @click="showRef">$ref訪問子組件</button>
    <Son ref="son":fatherToSon1="fatherToSon1" @changeFatherToSon1="changeFatherToSon1"/>
    <Son/>
    <br>
  </div>
</template>

<script>
  import Son from './Son'
  export default {
    name: "Father",
    components: {
      Son
    },
    data() {
      return {
        fatherToSon1: 1,
      }
    },
    methods: {
      changeFatherToSon1(value) {
        this.fatherToSon1 = value
      },
    }
  }
</script>

$emit相關(guān)變種

1锡垄、$emit('update:value',someValue)

son組件

<template>
  <div class="son">
    <h1>這是son組件</h1>
    <span>
        來自father的值(fatherToSon2):{{fatherToSon2}}
        <button @click="changeFatherToSon2">使用update:value+@update:value</button>
    </span>
  </div>
</template>

<script>
  export default {
    name: "Son",
    data(){
      return {
        sonData:1
      }
    },
    props: {
      fatherToSon2: Number
    },
    methods: {
      changeFatherToSon2() {
        this.$emit('update:value1',20)
      },
    }
  }
</script>

father組件

<template>
  <div class="father">
    <h1>這是father組件</h1>
    <Son ref="son" :fatherToSon2="fatherToSon2" @update:value1="value=>{this.fatherToSon2=value}"         
    />
    <Son/>
    <br>
  </div>
</template>

<script>
  import Son from './Son'
  export default {
    name: "Father",
 
    components: {
      Son
    },
    data() {
      return {
        fatherToSon2: 10,
      }
    },
  }
</script>

這里value=>{this.fatherToSon2=value}也可以單獨抽出一個函數(shù)要糊。
父組件還有一種語法糖的寫法

<template>
  <div class="father">
    <h1>這是father組件</h1>
    <Son ref="son" :fatherToSon2="fatherToSon2" :value2.sync="fatherToSon2"         
    />
    <Son/>
    <br>
  </div>
</template>

<script>
  import Son from './Son'
  export default {
    name: "Father",
    components: {
      Son
    },
    data() {
      return {
        fatherToSon2: 10,
      }
    },
  }
</script>

@update:value1="value=>{this.fatherToSon2=value}"改為:value2.sync="fatherToSon2"即可

2盼砍、$emit('input')

注意闻坚,input事件是vue幫我們定義好的沽翔,我們通過emit來觸發(fā),以達到通信的目的,其實和正常的$emit發(fā)射自定義事件是差不多的
son組件

<template>
  <div class="son">
    <h1>這是son組件</h1>
    <span>
      來自father的值(fatherToSon5):{{fatherToSon5}}
        <button @click="changeFatherToSon5">emit('input')+@input</button>
    </span>

  </div>
</template>

<script>
  export default {
    name: "Son",
    data(){
      return {
        sonData:1
      }
    },
    props: {
      fatherToSon5: Number,
    },
    methods: {
      changeFatherToSon5(){
        this.$emit('input',20000)
      },
    }
  }
</script>

<style scoped>
  .son {
    background-color: darkgray;
    color: white;
  }
</style>

Father組件

<template>
  <div class="father">
    <h1>這是father組件</h1>
    <Son ref="son"  
            :fatherToSon5="fatherToSon5" @input="value=>{this.fatherToSon5=value}"
    />
    <Son/>
    <br>
  </div>
</template>

<script>
  import Son from './Son'

  export default {
    name: "Father",
    components: {
      Son
    },
    data() {
      return {
        fatherToSon5: 10000
      }
    },
 
  }
</script>

這里其實也有個語法糖叫v-model窿凤,v-model其實可以理解為:value="somevalue" @input="value=>this.somevalue=value"的簡寫形式,當我們把這個v-model掛到組件上時仅偎,就可以形成一種新的組件通信方法。
其中子組件不需要改動雳殊,父組件修改

<template>
  <div class="father">
    <h1>這是father組件</h1>
    <Son ref="son"  
            v-model="fatherToSon5" 
    />
    <Son/>
    <br>
  </div>
</template>

<script>
  import Son from './Son'

  export default {
    name: "Father",
    components: {
      Son
    },
    data() {
      return {
        fatherToSon5: 10000
      }
    },
  }
</script>

emit相關(guān)的到這里就結(jié)束了

$root和$parent

這里和$children和$refs類似橘沥,$parent取當前組件實例的父組件實例,而$root取到根節(jié)點的組件相种,往往是app組件

$parent:向上派發(fā)事件

此處需要結(jié)合$emit一起食用
emit往往用于子組件通知父組件更新某個父組件的值威恼,但是當組件層級達到三層即(son-father-grandpa)時,需要在son中使用$parent.$emit進行事件發(fā)射如果層級更深顯然不可能無限$parent寝并,于是我們需要讓子組件調(diào)用$eventDispatch箫措,讓這個子組件向上的每一級父組件都進行$emit,一旦調(diào)用emit的組件的父組件監(jiān)聽了對應(yīng)的事件衬潦,那么就會執(zhí)行斤蔓。

  Vue.prototype.$eventDispatch = function (event, value) {
    let parent = this.$parent
    while (parent) {
      parent.$emit(event, value)
      parent = parent.$parent
    }
  }

舉例:我們在ancestors上監(jiān)聽了emitToUpper事件

<template>
  <div class="ancestors">
    <h1>這是祖先組件</h1>
    <grand-pa @emitToUpper="dispatchToAncester"/>
  </div>
</template>

<script>
  import GrandPa from './GrandPa'
  export default {
    name: "Ancestors",
    components:{
      GrandPa
    },
    methods:{
      dispatchToAncester(value){
        console.log(`ancestors監(jiān)聽到了一個事件,值為${value}`);
      },
    }
  }
</script>
<style scoped>
</style>

同樣的,在app組件也可以進行監(jiān)聽emitToUpper事件

<template>
<Ancestors @emitToUpper="dispatchToApp"/>
</template>

<script>
import Ancestors from '@/components/Ancestors'
export default {
  name: 'App',
  components: {
    Ancestors
  },
  methods:{
    dispatchToApp(value){
      console.log(`app監(jiān)聽到了一個事件,值為${value}`);
    }
  }
}
</script>
<style>
</style>

只要監(jiān)聽了@emitToUpper事件的組件都會觸發(fā)對應(yīng)的函數(shù)

<template>
  <div class="son">
    <h1>這是son組件</h1>
    <button @click="emitToUpper">使用$eventDispatch發(fā)射事件</button>
  </div>
</template>

<script>
  export default {
    name: "Son",
    methods: {
      emitToUpper(){
        this.$eventDispatch('emitToUpper','aaaa')
      },
    }
  }
</script>
<style scoped>
</style>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镀岛,一起剝皮案震驚了整個濱河市弦牡,隨后出現(xiàn)的幾起案子友驮,更是在濱河造成了極大的恐慌,老刑警劉巖驾锰,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卸留,死亡現(xiàn)場離奇詭異,居然都是意外死亡椭豫,警方通過查閱死者的電腦和手機耻瑟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門帚桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來破讨,“玉大人,你說我怎么就攤上這事虾攻÷惴觯” “怎么了框都?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呵晨。 經(jīng)常有香客問我魏保,道長,這世上最難降的妖魔是什么何荚? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任囱淋,我火速辦了婚禮,結(jié)果婚禮上餐塘,老公的妹妹穿的比我還像新娘妥衣。我一直安慰自己,他們只是感情好戒傻,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布税手。 她就那樣靜靜地躺著,像睡著了一般需纳。 火紅的嫁衣襯著肌膚如雪芦倒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天不翩,我揣著相機與錄音兵扬,去河邊找鬼。 笑死口蝠,一個胖子當著我的面吹牛器钟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妙蔗,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傲霸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昙啄,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤穆役,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梳凛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耿币,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年伶跷,在試婚紗的時候發(fā)現(xiàn)自己被綠了掰读。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡叭莫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烁试,到底是詐尸還是另有隱情雇初,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布减响,位于F島的核電站靖诗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏支示。R本人自食惡果不足惜刊橘,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颂鸿。 院中可真熱鬧促绵,春花似錦、人聲如沸嘴纺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栽渴。三九已至尖坤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闲擦,已是汗流浹背慢味。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留墅冷,地道東北人纯路。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像俺榆,于是被迫代替她去往敵國和親感昼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 組件插槽 組件的最大特征就是復(fù)用性罐脊,而用好插槽能大大提高組件的課復(fù)用能力 我的理解:就是通過組件(comp...
    黑云閱讀 331評論 0 1
  • 前言 Vue基本用法很容易上手,但是有很多優(yōu)化的寫法你就不一定知道了,本文從列舉了 36 個 vue 開發(fā)技巧; ...
    阿_軍閱讀 1,444評論 0 1
  • 第一章 Vue概述 what? Vue是實現(xiàn)UI層的漸進式j(luò)s框架定嗓,核心庫關(guān)注視圖層蜕琴,簡單的ui構(gòu)建,復(fù)雜的路由控...
    fastwe閱讀 715評論 0 0
  • 2020/05/28 周四 #[http://fe.zuo11.com/daily/2020-05.html#no...
    抓猹吃瓜閱讀 453評論 0 2
  • 表情是什么宵溅,我認為表情就是表現(xiàn)出來的情緒凌简。表情可以傳達很多信息。高興了當然就笑了恃逻,難過就哭了雏搂。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,004評論 2 7