最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中provide和inject的用法及說明(vue組件爺孫傳值)

 更新時(shí)間:2023年05月17日 10:21:30   作者:是小橙鴨丶  
這篇文章主要介紹了vue中provide和inject的用法及說明(vue組件爺孫傳值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

provide和inject的用法(vue組件爺孫傳值)

聊聊概念

成對(duì)出現(xiàn):provide和inject是成對(duì)出現(xiàn)的

作用:用于父組件向子孫組件傳遞數(shù)據(jù)

使用方法:provide在父組件中返回要傳給下級(jí)的數(shù)據(jù),inject在需要使用這個(gè)數(shù)據(jù)的子輩組件或者孫輩等下級(jí)組件中注入數(shù)據(jù)。

使用場(chǎng)景:由于vue有$parent屬性可以讓子組件訪問父組件。但孫組件想要訪問祖先組件就比較困難。通過provide/inject可以輕松實(shí)現(xiàn)跨級(jí)訪問父組件的數(shù)據(jù)

使用示例DEMO

父組件:通過provide指定傳遞給子孫組件的值和方法

<template>
	<div id="app">
		我是父組件:{{message}}
		<second></second>
	</div>
</template>
<script>
import second from '../components/second.vue'
export default{
	data(){
		return{
			message:'我們一起當(dāng)前端攻城獅!'
		}
	},
	provide(){ // provide是一個(gè)匿名函數(shù),返回一個(gè)對(duì)象
		return {
			testmethods:this.testmethods,
			message:this.message
		}
	},
	methods:{
		testmethods(){
			console.log('調(diào)用了ProvideTest這個(gè)組件')
		}
	},
	components:{
		second
	}
}
</script>
<style lang="less" scoped>
</style>

子組件:用inject接收父組件的值和方法,并且繼續(xù)套一個(gè)組件

<template>
	<div id="app">
		<p>second組件:{{message}}</p>
		<third></third>
	</div>
</template>
<script>
import third from './third.vue'
export default{
	data(){
		return{
		}
	},
	inject:['message','testmethods'],
	mounted() {
		this.testmethods()
	},
	components:{
		third
	}
}
</script>
<style lang="less" scoped>
</style>

重點(diǎn)來了,我們稱之為

孫組件:

<template>
	<div id="app">
		<p>third組件:{{message}}</p>
	</div>
</template>
<script>
export default{
	data(){
		return{
		}
	},
	//inject:['message','testmethods'], 簡(jiǎn)寫
	inject:{ // 詳細(xì)指定來源以及默認(rèn)值
		message:{
			from:'message', //表示從組件ProvideTest傳遞過來的
			//default:'message' //默認(rèn)值
		},
		testmethods:{
			form:'testmethods'
		}
	},
	mounted() {
		this.testmethods()
	},
}
</script>
<style lang="less" scoped>
</style>

效果下圖所示

vue中provide,inject遇到的一個(gè)坑

provide、inject一般用在組件間嵌套過多,而子組件一層層的傳遞很麻煩,此時(shí)通過provide、inject可以跨層傳遞。但是最近在使用的過程中發(fā)現(xiàn)一個(gè)問題:

祖組件中data里的響應(yīng)式數(shù)據(jù)通過provide return以后,發(fā)現(xiàn)孫組件無法接受到最新的值

//祖組件
<template>
? ? <div> this is grandparent component</div>
</template>
<script>
export {
? ? name:"grandparent",
? ? data(){
? ? ? ? ? ? return{
? ? ? ? ? ? ? hasMeal:false?
? ? ? ? }
? ? },
? ? provide(){
? ? ? ? return{
? ? ? ? ? ? hasMeal:this.hasMeal ? ? ? ?
? ? ? ? }
? ? },
? ? create(){
? ? ? fetch(xxx).then(res=>{
? ? ? ? ? ? this.hasMeal=res.data.hasMeal ?//此時(shí)是true
? ? ? ? })
? ? }
}
</script>
///
孫組件
<template>
? ? <div> this is grandson component</div>
</template>
<script>
export {
? ? name:"grandparent",
? ? data(){
? ? ? ? ? ? return{
? ? ? ? }
? ? },
? ? inject:['hasMeal'],
? ? create(){
? ? ? ? console.log(this.hasMeal) ? ?//false
? ? }
}
</script>

hasMeal經(jīng)過異步請(qǐng)求以后變成了true,原本期待provide最后return的值是最新的值時(shí)true,結(jié)果在孫組件頁面打印this.hasMeal發(fā)現(xiàn)。

還是false?那是否是provide在return之前的this.hasMeal還是false呢?

經(jīng)過測(cè)試發(fā)現(xiàn),果不其然。進(jìn)一步證明。provide里如果直接return data里的值。是不能被響應(yīng)式處理的。

如何解決?

//祖組件
<template>
? ? <div> this is grandparent component</div>
</template>
<script>
export {
? ? name:"grandparent",
? ? data(){
? ? ? ? ? ? return{
? ? ? ? ? ? ? hasMeal:false?
? ? ? ? }
? ? },
? ? provide:()=>{
? ? ? ? return{
? ? ? ? ? ? hasMeal:this.hasMeal ? ? ? ?
? ? ? ? }
? ? },
? ? create(){
? ? ? fetch(xxx).then(res=>{
? ? ? ? ? ? this.hasMeal=res.data.hasMeal ?//此時(shí)是true
? ? ? ? })
? ? }
}
</script>
///
孫組件
<template>
? ? <div> this is grandson component</div>
</template>
<script>
export {
? ? name:"grandparent",
? ? data(){
? ? ? ? ? ? return{
? ? ? ? }
? ? },
? ? inject:['hasMeal'],
? ? create(){
? ? ? ? console.log(this.hasMeal()) ? ?//true
? ? }
}
</script>

把provide變成一個(gè)箭頭函數(shù)。然后在孫頁面通過執(zhí)行這個(gè)函數(shù)的方式拿到函數(shù)返回的結(jié)果就可以拿到最新的值。也就間接變成了響應(yīng)式的了 

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue 動(dòng)態(tài)組件與 v-once 指令的實(shí)現(xiàn)

    Vue 動(dòng)態(tài)組件與 v-once 指令的實(shí)現(xiàn)

    這篇文章主要介紹了Vue 動(dòng)態(tài)組件與 v-once 指令的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 安裝vue-cli的簡(jiǎn)易過程

    安裝vue-cli的簡(jiǎn)易過程

    安裝vue-cli的前提是你已經(jīng)安裝了npm,安裝npm你可以直接下載node的安裝包進(jìn)行安裝。接下來通過本文給大家介紹安裝vue-cli的簡(jiǎn)易過程,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • vue?點(diǎn)擊按鈕?路由跳轉(zhuǎn)指定頁面的實(shí)現(xiàn)方式

    vue?點(diǎn)擊按鈕?路由跳轉(zhuǎn)指定頁面的實(shí)現(xiàn)方式

    這篇文章主要介紹了vue?點(diǎn)擊按鈕?路由跳轉(zhuǎn)指定頁面的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 詳解vue2.0組件通信各種情況總結(jié)與實(shí)例分析

    詳解vue2.0組件通信各種情況總結(jié)與實(shí)例分析

    本篇文章主要介紹了詳解vue2.0組件通信各種情況總結(jié)與實(shí)例分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Vue實(shí)現(xiàn)下拉表格組件

    Vue實(shí)現(xiàn)下拉表格組件

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)下拉表格組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 微信內(nèi)置開發(fā) iOS修改鍵盤換行為搜索的解決方案

    微信內(nèi)置開發(fā) iOS修改鍵盤換行為搜索的解決方案

    今天小編就為大家分享一篇微信內(nèi)置開發(fā) iOS修改鍵盤換行為搜索的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue3自定義Hooks函數(shù)的使用詳解

    Vue3自定義Hooks函數(shù)的使用詳解

    vue3 中的 hooks 就是函數(shù)的一種寫法,就是將文件的一些單獨(dú)功能的js代碼進(jìn)行抽離出來進(jìn)行封裝使用,下面我們就來看看vue3中自定義Hooks函數(shù)的使用吧
    2023-09-09
  • 在vue中安裝使用sass的實(shí)現(xiàn)方法

    在vue中安裝使用sass的實(shí)現(xiàn)方法

    這篇文章主要介紹了在vue中安裝使用sass的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 基于 Vue 實(shí)現(xiàn)一個(gè)酷炫的 menu插件

    基于 Vue 實(shí)現(xiàn)一個(gè)酷炫的 menu插件

    本文給大家介紹基于 Vue 實(shí)現(xiàn)一個(gè)酷炫的 menu插件,此篇教程需要大家具備一定的css和vue基礎(chǔ)知識(shí),本文分步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-11-11
  • vue+axios 攔截器實(shí)現(xiàn)統(tǒng)一token的案例

    vue+axios 攔截器實(shí)現(xiàn)統(tǒng)一token的案例

    這篇文章主要介紹了vue+axios 攔截器實(shí)現(xiàn)統(tǒng)一token的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評(píng)論

科尔| 遂川县| 台安县| 宁晋县| 高台县| 文成县| 沙坪坝区| 凤山县| 宜都市| 双城市| 灵武市| 七台河市| 喜德县| 新绛县| 珲春市| 凤冈县| 丰城市| 双辽市| 大丰市| 九龙城区| 扶沟县| 昌宁县| 南涧| 明光市| 盐山县| 五原县| 东丽区| 巴林右旗| 伊宁市| 金塔县| 泸溪县| 光山县| 玉林市| 江华| 佛冈县| 上虞市| 镇巴县| 珠海市| 新疆| 资溪县| 营口市|