Vue常見的幾種組件傳值方式

組件系統(tǒng)是 Vue.js 其中一個(gè)重要的概念,它提供了一種抽象,讓我們可以使用獨(dú)立可復(fù)用的小組件來構(gòu)建大型應(yīng)用檐盟。在 Vue.js 應(yīng)用程序開發(fā)過程中常常需要處理組件傳值的問題,下面詳細(xì)列舉幾種常見的組件傳值方法。

1. props

父組件代碼:

<template>

? <child-component title="子組件標(biāo)題"></child-component> // 傳輸靜態(tài)值

? <child-component v-bind:title="title"></child-component> // 傳輸動(dòng)態(tài)值

</template>

<script>

import ChildComponent from './ChildComponent'

export default {

? components: { ChildComponent },

? data() {

? ? return {

? ? ? title: '子組件標(biāo)題'

? ? }

? }

}

</script>


子組件 ChildComponent.vue 代碼:

<template>

? <h1>{{title}}</h1>

</template>

<script>

export default {

? props: ['title']

}

</script>

1

2

3

4

5

6

7

8

9

10

所有的 prop 都使得其父子 prop 之間形成了一個(gè)單向下行綁定:父級(jí) prop 的更新會(huì)向下流動(dòng)到子組件中惨撇,但是反過來則不行。這樣會(huì)防止從子組件意外改變父級(jí)組件的狀態(tài)府寒,從而導(dǎo)致你的應(yīng)用的數(shù)據(jù)流向難以理解魁衙。

2. vm.$refs

適用于父組件獲取子組件的值。

父組件代碼:

<template>

? <div>

? ? <child-component ref="child"></child-component>

? ? <button @click="getChildProp()">獲取子組件的屬性的值</button>

? ? <button @click="getChildMethod()">獲取子組件的方法</button>

? </div>

</template>

<script>

import ChildComponent from './components/ChildComponent.vue'

export default {

? components:{ ChildComponent },

? methods: {

? ? getChildProp () {

? ? ? alert(this.$refs.child.msg) // 子組件child的值

? ? },

? ? getChildMethod () {

? ? ? this.$refs.child.func() // 子組件child的方法

? ? }

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

子組件 ChildComponent.vue 代碼:

<template>

<div></div>

</template>

<script>

export default {

? data () {

? ? return {

? ? ? msg: "子組件child的值"

? ? }

? },

? methods: {

? ? func () {

? ? ? alert("子組件child的方法")

? ? }

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

注意:因?yàn)?ref 本身是作為渲染結(jié)果被創(chuàng)建的株搔,在初始渲染的時(shí)候你不能訪問它們 - 它們還不存在剖淀!$refs 也不是響應(yīng)式的,因此你不應(yīng)該試圖用它在模板中做數(shù)據(jù)綁定纤房。

3. vm.$parent

適用于子組件獲取父組件的值纵隔。

父組件代碼:

<template>

? <child-component></child-component>

</template>

<script>

import ChildComponent from './components/ChildComponent.vue'

export default {

? components:{ ChildComponent },

? data () {

? ? return {

? ? ? title: '標(biāo)題'

? ? }

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

子組件 ChildComponent.vue 代碼:

<script>

export default {

? created () {

? ? alert(this.$parent.title) // 標(biāo)題

? }

}

</script>

1

2

3

4

5

6

7

8

4. vm.$emit(eventName, […args])

適用于子組件向父組件傳值,子組件可以通過觸發(fā)父組件事件傳遞參數(shù)炮姨。

父組件代碼:

<template>

? <child-component v-on:handleClick="handleEvent"></child-component>

</template>

<script>

import ChildComponent from './ChildComponent'

export default {

? components: { ChildComponent },

? methods: {

? ? handleEvent (value) {

? ? ? alert(value) // 'abc'

? ? }

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

子組件 ChildComponent.vue 代碼:

<template>

? <button v-on:click="handleClickEvent"></button>

</template>

<script>

export default {

? methods: {

? ? handleClickEvent () {

? ? ? this.$emit('handleClick', 'abc')

? ? }

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

5.vm.emit/vm.$on

適用于父子組件及兄弟組件傳值捌刮。

通過 $emit 觸發(fā)當(dāng)前實(shí)例上的事件,并將參數(shù)傳遞給監(jiān)聽器,通過 o n 監(jiān) 聽 當(dāng) 前 實(shí) 例 上 的 自 定 義 事 件 舒岸。 下 面 介 紹 通 過 v m . on 監(jiān)聽當(dāng)前實(shí)例上的自定義事件绅作。下面介紹通過 vm.on監(jiān)聽當(dāng)前實(shí)例上的自定義事件。下面介紹通過vm.emit / vm.$on 實(shí)現(xiàn)兄弟組件傳值:

main.js代碼:

import Vue from 'vue'

import App from './App.vue'

var bus = new Vue() // 定義公共實(shí)例

export default bus

new Vue({

? render: h => h(App),

}).$mount('#app')

1

2

3

4

5

6

7

8

9

父組件 App.vue 代碼:

<template>

? <div>

? ? <child-one></child-one>

? ? <child-two></child-two>

? </div>

</template>

<script>

import ChildOne from './components/ChildOne.vue'

import ChildTwo from './components/ChildTwo.vue'

export default {

? components:{ ChildOne, ChildTwo }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

子組件 ChildOne.vue 代碼:

<template>

? <button @click="btnClick">點(diǎn)擊按鈕</button>

</template>

<script>

import bus from '../main.js'

export default {

? methods: {

? ? btnClick () {

? ? ? bus.$emit('getTitle', '標(biāo)題')

? ? }

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

子組件 ChildTwo.vue 代碼:

<template>

? <div></div>

</template>

<script>

import bus from '../main.js'

export default {

? mounted () {

? ? bus.$on('getTitle', (value) => {

? ? ? alert(value) // 標(biāo)題

? ? })

? }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

注意: vm.e m i t / v m . emit / vm.emit/vm.on 自定義事件必須是在一個(gè)公共的實(shí)例上才能觸發(fā)蛾派。

6. provide / inject

適用于祖先組件向其所有子孫后代組件傳值俄认。

祖先組件通過 provide 定義變量后,無論組件層次有多深洪乍,它的子孫后代組件都能夠通過 inject 獲取變量值眯杏。

父組件代碼:

<template>

? <child></child>

</template>

<script>

import Child from './Child.vue'

export default {

? provide: { title: "標(biāo)題" },

? components:{ Child }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

子組件 Child.vue 代碼:

<template>

? <div>

? ? {{title}} // 標(biāo)題

? ? <grandson></grandson>

? </div>

</template>

<script>

import Grandson from './Grandson.vue'

export default {

? inject: ['title'],

? components:{ Grandson }

}

</script>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

子組件的子組件 Grandson.vue 代碼:

<template>

? <div>{{title}}</div> // 標(biāo)題

</template>

<script>

export default {

? inject: ['title']

}

</script>

1

2

3

4

5

6

7

8

9

10

注意:provide 和 inject 主要為高階插件/組件庫(kù)提供用例。并不推薦直接用于應(yīng)用程序代碼中典尾。

7. 路由

通過路由地址參數(shù)傳值役拴,適用于組件路由切換場(chǎng)景

路由傳參的方式有多種,詳細(xì)信息可以查看 Vue Router 官網(wǎng)钾埂,下面簡(jiǎn)單介紹一種:

跳轉(zhuǎn)前的組件相關(guān)代碼:

this.$router.push({

? path: '/App',

? query: {

? ? title: '標(biāo)題'

? }

})

1

2

3

4

5

6

7

對(duì)應(yīng)路由相關(guān)配置:

{

? path: '/app',

? name: 'App',

? component: App

1

2

3

4

5

跳轉(zhuǎn)后組件調(diào)用方法:

this.$route.query.title // 標(biāo)題

1

2

注意:避免敏感數(shù)據(jù)通過路由地址傳參顯示在頁(yè)面url后面河闰。

8. localStorage / sessionStorage

適用于組件間任意傳值科平,常用于存儲(chǔ)客戶端臨時(shí)信息。

localStorage 生命周期是永久的姜性,可以實(shí)現(xiàn)同一瀏覽器下不同窗口傳值瞪慧。而 sessionStorage 的生命周期為當(dāng)前窗口或標(biāo)簽頁(yè),一旦窗口或標(biāo)簽頁(yè)關(guān)閉部念,通過 sessionStorage 存儲(chǔ)的信息則會(huì)被清空弃酌。以 localStorage 為例:

組件存儲(chǔ)信息調(diào)用方法:

var obj = {'title': '標(biāo)題'}

localStorage.setItem('info', JSON.stringify(obj));

1

2

3

組件獲取信息調(diào)用方法:

var info = JSON.parse(localStorage.getItem('info')) // {'title': '標(biāo)題'}

1

2

9. Vuex

適用于組件間任意傳值,常用于開發(fā)大型頁(yè)面應(yīng)用中儡炼。

Vuex 是專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理器妓湘,可以簡(jiǎn)單理解為一個(gè)全局變量,在 Vuex 中定義的變量可以被各個(gè)組件使用乌询。但是我們不能像傳統(tǒng) JS 的那種直接賦值形式來修改榜贴,我們必須得按照 Vuex 給我們提供的規(guī)則來修改。

————————————————

版權(quán)聲明:本文為CSDN博主「姜天生i」的原創(chuàng)文章妹田,遵循CC 4.0 BY-SA版權(quán)協(xié)議唬党,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/qq_37041819/article/details/105550147

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬼佣,一起剝皮案震驚了整個(gè)濱河市驶拱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晶衷,老刑警劉巖蓝纲,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異房铭,居然都是意外死亡驻龟,警方通過查閱死者的電腦和手機(jī)温眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門缸匪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人类溢,你說我怎么就攤上這事凌蔬。” “怎么了闯冷?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵砂心,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蛇耀,道長(zhǎng)辩诞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任纺涤,我火速辦了婚禮译暂,結(jié)果婚禮上抠忘,老公的妹妹穿的比我還像新娘。我一直安慰自己外永,他們只是感情好崎脉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伯顶,像睡著了一般囚灼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祭衩,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天灶体,我揣著相機(jī)與錄音,去河邊找鬼掐暮。 笑死赃春,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的劫乱。 我是一名探鬼主播织中,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼衷戈!你這毒婦竟也來了狭吼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤殖妇,失蹤者是張志新(化名)和其女友劉穎刁笙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谦趣,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疲吸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前鹅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘悴。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莺治,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布口四,位于F島的核電站,受9級(jí)特大地震影響秦陋,放射性物質(zhì)發(fā)生泄漏蔓彩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赤嚼。 院中可真熱鬧大磺,春花似錦、人聲如沸探膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)逞壁。三九已至流济,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腌闯,已是汗流浹背绳瘟。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姿骏,地道東北人糖声。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像分瘦,于是被迫代替她去往敵國(guó)和親蘸泻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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