Vue 組件傳值

一仙粱、組件間通信傳值的各種方式與場(chǎng)景

1碳默、父組件向子組件(跨級(jí))傳值

1.1 父組件通過(guò)props給子組件傳值
props也可以傳函數(shù)
image.png
// 父組件vue文件
<template>
  <div class="home">
    <!--父組件傳msg屬性給子組件傳值-->
    <child :msg="msg"></child>
  </div>
</template>

<script>
import Child from '@/components/Child'

export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {
      msg: '父組件傳給子組件的值'
    }
  },
  methods: {}
}
</script>

// 子組件
<template>
  <div>{{ msg }}</div>
</template>
<script>
export default {
  name: 'Child',
  // 子組件通過(guò)props接收父組件的傳值
  props: ['msg']
}
</script>
<style scoped>
</style>
1.2 父組件通過(guò)$ref給子組件傳值

ref 用于給元素或子組件注冊(cè)引用信息柳弄,引用信息將會(huì)注冊(cè)在父組件的 refs 對(duì)象上疯潭,父組件通過(guò)refs對(duì)象上,父組件通過(guò)ref 獲取到在子組件里定義的屬性和方法祝旷,通過(guò)調(diào)用方法給子組件傳遞數(shù)據(jù)


image.png
// 父組件
<template>
  <div class="home">
    <!--父組件傳msg屬性給子組件傳值-->
    <child ref="child"></child>
  </div>
</template>

<script>
import Child from '@/components/Child'

export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {
      msg: '父組件傳給子組件的值'
    }
  },
  mounted () {
    // 父組件通過(guò)ref屬性調(diào)用子組件的方法
    this.$refs.child.getMsg(this.msg)
  },
  methods: {}
}
</script>
// 子組件
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg: ''
    }
  },
  methods: {
    // 子組件獲取父組件值的方法
    getMsg (val) {
      this.msg = val
    }
  }
}
</script>

<style scoped>

</style>
1.3 父組件通過(guò)$children給子組件傳值

children為當(dāng)前組件的直接子組件履澳,是一個(gè)無(wú)序的數(shù)組,父組件通過(guò) children 訪問(wèn)子組件并傳遞數(shù)據(jù)怀跛,$ children 并不保證順序距贷,也不是響應(yīng)式的,如果能清楚的知道子組件的順序吻谋,可以使用下標(biāo)來(lái)操作對(duì)應(yīng)的子組件

image.png

// 父組件
<template>
  <div class="home">
    <!--父組件傳msg屬性給子組件傳值-->
    <child ref="child"></child>
  </div>
</template>

<script>
import Child from '@/components/Child'

export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {
      msg: '父組件傳給子組件的值'
    }
  },
  mounted () {
    // 父組件通過(guò)$children[0]訪問(wèn)對(duì)應(yīng)子組件
    this.$children[0].msg = this.msg
  },
  methods: {}
}
</script>
// 子組件
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg: ''
    }
  }
}
</script>

<style scoped>

</style>
1.4 父組件通過(guò)provide/inject給子孫組件傳值

provide/inject 組合以允許一個(gè)祖先組件向其所有子孫后代組件注入一個(gè)依賴(屬性和方法)忠蝗,不論組件層次有多深,并在其上下游關(guān)系成立的時(shí)間里始終生效漓拾,從而實(shí)現(xiàn)跨級(jí)父子組件通信阁最,主要在開(kāi)發(fā)高階插件/組件庫(kù)時(shí)使用


image.png
// 父組件
<template>
  <div class="home">
    <child></child>
  </div>
</template>

<script>
import Child from '@/components/Child'

export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {}
  },
  // 父組件通過(guò)provide方法向子孫組件提供值
  provide () {
    return {
      msg: '父組件傳給子組件的值'
    }
  }
}
</script>
// 子組件
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  name: 'Child',
  // 子孫組件通過(guò)inject注入父組件提供的值
  inject: ['msg'],
  data () {
    return {
    }
  }
}
</script>

<style scoped>
</style>
總結(jié):props$ref$childrenprovide/inject的主要區(qū)別:
  • props 側(cè)重于數(shù)據(jù)的傳遞,并不能獲取子組件里的屬性和方法骇两,適用于自定義內(nèi)容的使用場(chǎng)景
  • $ref側(cè)重于獲取子組件里的屬性和方法速种,并不是太適合傳遞數(shù)據(jù),并且 ref 常用于獲取dom元素低千,起到選擇器的作用
  • $children 側(cè)重于獲取所有的直接子組件配阵,得到的是一個(gè)無(wú)序的數(shù)組,并不太適合向多個(gè)子組件傳遞數(shù)據(jù)
  • provide/inject 側(cè)重于在開(kāi)發(fā)高階插件/組件庫(kù)時(shí)使用,并不推薦用于普通應(yīng)用程序代碼中棋傍。
1.5 非prop的$attrs?inheritAttrs? 提供封裝組件的可擴(kuò)展性

要求第1個(gè)input輸入文字救拉,第2個(gè)input輸入密碼

image.png
  • 設(shè)置 inheritAttrs: false


    image.png
  • v-bind="$attrs"


    image.png
  • 總結(jié)


    image.png
// 子組件
<template>
  <div class="input-con">
    <input v-bind="$attrs" :value="value" @input="$emit('input')">
    $attrs接收非props傳遞過(guò)來(lái)的屬性:{{$attrs}},所有不包含屬性 ’value‘
  </div>
</template>

<script>
export default {
  name: 'Child',
  props: ['value'],
  inheritAttrs: false // 關(guān)閉父組件傳過(guò)來(lái)的屬性添加到子組件的根元素
}
</script>

<style scoped>
</style>
// 父組件
<template>
  <div class="home">
<!--要求第1個(gè)input輸入文字-->
<!--   第2個(gè)input輸入密碼-->
    <child v-model="msg" type="text"></child>
    <child v-model="msg" type="password"></child>
  </div>
</template>

<script>
import Child from '@/components/Child'
export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {
      msg: '你好瘫拣,孩子'
    }
  }
}
</script>
1.6 $listeners

包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽(tīng)器近上。它可以通過(guò) v-on="$listeners" 傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時(shí)非常有用。

2拂铡、子組件向父組件(跨級(jí))傳值 $emit(自定義事件名[,...param])

2.1 子組件通過(guò)觸發(fā)$emit事件給父組件傳值

$emit的第一個(gè)參數(shù)為自定義的事件壹无,第二個(gè)參數(shù)為要傳遞給父組件的值,父組件在子組件標(biāo)簽上綁定自定義事件來(lái)接收子組件傳遞的數(shù)據(jù)

image.png

// 子組件
<template>
  <div>
    <button @click="sendMsg"></button>
  </div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg: '子組件傳給父組件的值'
    }
  },
  methods: {
    sendMsg () {
      this.$emit('getMsg', this.msg)
    }
  }
}
</script>

<style scoped>

</style>
// 父組件
<template>
  <div class="home">
    <child @getMsg="getData"></child>
    <p>{{msg}}</p>
  </div>
</template>

<script>
import Child from '@/components/Child'

export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {
      msg: ''
    }
  },
  methods: {
    getData (data) {
      this.msg = data
    }
  }
}
</script>
2.2 子組件通過(guò)$parent給父組件傳值

$parent 可以用來(lái)從一個(gè)子組件訪問(wèn)父組件并傳遞數(shù)據(jù)

image.png

// 子組件
<template>
  <div>
    <button @click="sendMsg"></button>
  </div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg: '子組件傳給父組件的值'
    }
  },
  methods: {
    // 子組件通過(guò)$parent訪問(wèn)父組件
    sendMsg () {
      this.$parent.msg = this.msg
    }
  }
}
</script>
// 父組件
<template>
  <div class="home">
    <child></child>
    <p>{{msg}}</p>
  </div>
</template>

<script>
import Child from '@/components/Child'

export default {
  name: 'Father',
  components: {
    Child
  },
  data () {
    return {
      msg: ''
    }
  }
}
</script>

3感帅、兄弟組件間通信傳值 vm.$emitvm.$on

兄弟之間傳值通過(guò)eventBus斗锭。
eventBus 就是一個(gè)vue實(shí)例來(lái)作為全局的事件總線,兄弟組件之間通過(guò) eventBus. on 和 eventBus.on和eventBus.emit 注冊(cè)觸發(fā)事件來(lái)傳遞數(shù)據(jù)


image.png
// 新建一個(gè)vue實(shí)例 eventBus.js
import Vue from 'vue'
export default new Vue()
// 父組件
<template>
  <div class="home">
    <child></child>
    <child-two></child-two>
  </div>
</template>

<script>
import Child from '@/components/Child'
import ChildTwo from '@/components/ChildTwo'
export default {
  name: 'Father',
  components: {
    Child,
    ChildTwo
  },
  data () {
    return {
      msg: ''
    }
  }
}
</script>
// 子組件A
<template>
  <div>
    <button @click="sendMsg">子組件A傳值給子組件B</button>
  </div>
</template>

<script>
import eventBut from '@/utils/eventBut'
export default {
  name: 'Child',
  data () {
    return {
      msg: '子組件A傳給子組件B的值'
    }
  },
  methods: {
    sendMsg () {
      // 子組件A通過(guò)eventBus.$emit觸發(fā)自定義事件給子組件B傳值
      eventBut.$emit('getMsg', this.msg)
    }
  }
}
</script>

<style scoped>

</style>
// 子組件B
<template>
  <div>
    {{ msg }}
  </div>
</template>

<script>
import eventBut from '@/utils/eventBut'

export default {
  name: 'ChildTwo',
  data () {
    return {
      msg: ''
    }
  },
  created () {
    this.getData()
  },
  methods: {
    getData () {
      eventBut.$on('getMsg', (data) => {
        this.msg = data
      })
    }
  }
}
</script>

<style scoped>

</style>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末失球,一起剝皮案震驚了整個(gè)濱河市岖是,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌实苞,老刑警劉巖豺撑,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黔牵,居然都是意外死亡聪轿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門猾浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陆错,“玉大人,你說(shuō)我怎么就攤上這事金赦∫舸桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵夹抗,是天一觀的道長(zhǎng)绳慎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)漠烧,這世上最難降的妖魔是什么杏愤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮沽甥,結(jié)果婚禮上声邦,老公的妹妹穿的比我還像新娘。我一直安慰自己摆舟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著恨诱,像睡著了一般媳瞪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上照宝,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天蛇受,我揣著相機(jī)與錄音,去河邊找鬼厕鹃。 笑死兢仰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剂碴。 我是一名探鬼主播把将,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼忆矛!你這毒婦竟也來(lái)了察蹲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤催训,失蹤者是張志新(化名)和其女友劉穎洽议,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體漫拭,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亚兄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了采驻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儿捧。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挑宠,靈堂內(nèi)的尸體忽然破棺而出菲盾,到底是詐尸還是另有隱情,我是刑警寧澤各淀,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布懒鉴,位于F島的核電站,受9級(jí)特大地震影響碎浇,放射性物質(zhì)發(fā)生泄漏临谱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一奴璃、第九天 我趴在偏房一處隱蔽的房頂上張望悉默。 院中可真熱鬧,春花似錦苟穆、人聲如沸抄课。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跟磨。三九已至间聊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抵拘,已是汗流浹背哎榴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留僵蛛,地道東北人尚蝌。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像充尉,于是被迫代替她去往敵國(guó)和親飘言。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • Vue 組件之間的通信大概歸類為: 父子組件通信: props/$emit喉酌;ref/refs热凹;$attrs / $...
    睡神瘋子閱讀 7,342評(píng)論 0 25
  • 父?jìng)髯?通過(guò)props傳遞 子傳父 在父組件中給子組件綁定一個(gè)自定義的事件,子組件通過(guò)$emit()觸發(fā)該事件并傳...
    程序小小黑閱讀 235評(píng)論 0 2
  • 全局組件VS局部組件 全局組件 全局可調(diào)用泪电,可在一個(gè)或多個(gè)掛在了Vue實(shí)例的DOM節(jié)點(diǎn)內(nèi)使用該組件般妙。 局部組件 在...
    LazyCat404閱讀 250評(píng)論 0 0
  • Vue的組件化給前端開(kāi)發(fā)帶來(lái)極大的便利,這種依賴數(shù)據(jù)來(lái)控制Dom的模式相速,區(qū)別于以前的開(kāi)發(fā)控制Dom的開(kāi)發(fā)理念碟渺,這也...
    Max_Law閱讀 1,109評(píng)論 0 3
  • 父組件 => 子組件: 1.屬性props // child props: { msg: String } // ...
    明天的天明_3b79閱讀 442評(píng)論 1 0