欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

聊聊概念

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

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

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

使用場景:由于vue有$parent屬性可以讓子組件訪問父組件。但孫組件想要訪問祖先組件就比較困難。通過provide/inject可以輕松實現(xiàn)跨級訪問父組件的數(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是一個匿名函數(shù),返回一個對象
		return {
			testmethods:this.testmethods,
			message:this.message
		}
	},
	methods:{
		testmethods(){
			console.log('調(diào)用了ProvideTest這個組件')
		}
	},
	components:{
		second
	}
}
</script>
<style lang="less" scoped>
</style>

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

<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>

重點來了,我們稱之為

孫組件:

<template>
	<div id="app">
		<p>third組件:{{message}}</p>
	</div>
</template>
<script>
export default{
	data(){
		return{
		}
	},
	//inject:['message','testmethods'], 簡寫
	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遇到的一個坑

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

祖組件中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 ?//此時是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)過異步請求以后變成了true,原本期待provide最后return的值是最新的值時true,結(jié)果在孫組件頁面打印this.hasMeal發(fā)現(xiàn)。

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

經(jīng)過測試發(fā)現(xià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 ?//此時是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變成一個箭頭函數(shù)。然后在孫頁面通過執(zhí)行這個函數(shù)的方式拿到函數(shù)返回的結(jié)果就可以拿到最新的值。也就間接變成了響應(yīng)式的了 

總結(jié)

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

相關(guān)文章

  • vue項目打包后proxyTable代理失效問題及解決

    vue項目打包后proxyTable代理失效問題及解決

    這篇文章主要介紹了vue項目打包后proxyTable代理失效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。
    2023-05-05
  • Vue中兩種生成二維碼(帶logo)并下載方式總結(jié)

    Vue中兩種生成二維碼(帶logo)并下載方式總結(jié)

    與后端生成二維碼相比,前端生成二維碼更具有靈活性,下面這篇文章主要給大家介紹了關(guān)于Vue中兩種生成二維碼(帶logo)并下載的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Vuex 入門教程

    Vuex 入門教程

    這篇文章主要介紹了Vuex 入門教程,Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式, 那這個 vuex 怎么用呢?就具體來看一下吧
    2018-01-01
  • 解決Vue警告Write?operation?failed:computed?value?is?readonly

    解決Vue警告Write?operation?failed:computed?value?is?readonl

    這篇文章主要給大家介紹了關(guān)于如何解決Vue警告Write?operation?failed:computed?value?is?readonly的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 在Vue3中使用CodeMirror插件的方法詳解

    在Vue3中使用CodeMirror插件的方法詳解

    CodeMirror是一個功能強大的Web代碼編輯器,廣泛應(yīng)用于各種Web應(yīng)用中,在Vue3項目中集成CodeMirror,可以顯著提升代碼編輯和展示的用戶體驗,本文將結(jié)合實際案例,詳細(xì)介紹在Vue3中使用CodeMirror插件的方法,需要的朋友可以參考下
    2024-12-12
  • vue實現(xiàn)多個echarts根據(jù)屏幕大小變化而變化實例

    vue實現(xiàn)多個echarts根據(jù)屏幕大小變化而變化實例

    這篇文章主要介紹了vue實現(xiàn)多個echarts根據(jù)屏幕大小變化而變化實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue3父子組件傳值中props使用細(xì)節(jié)淺析

    vue3父子組件傳值中props使用細(xì)節(jié)淺析

    這篇文章主要給大家介紹了關(guān)于vue3父子組件傳值中props使用細(xì)節(jié)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • 詳解VUE中的Proxy代理

    詳解VUE中的Proxy代理

    這篇文章主要介紹了Proxy代理對象詳解,Proxy 是ES6中提供的一個非常強大的功能,可以用來代理另一個對象,從而攔截、監(jiān)視并修改這個對象的各種操作,需要的朋友可以參考下
    2023-04-04
  • Vue實現(xiàn)電子簽名功能的完整代碼

    Vue實現(xiàn)電子簽名功能的完整代碼

    本文介紹了在Vue項目中實現(xiàn)電子簽名功能的步驟,包括將原始文檔轉(zhuǎn)換為圖片、使用`signature_pad`和`html2canvas`庫、調(diào)整簽名位置和縮放比例、合并圖片等步驟,并提供了完整的源碼,需要的朋友可以參考下
    2025-02-02
  • vue實現(xiàn)商城上貨組件簡易版

    vue實現(xiàn)商城上貨組件簡易版

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)商城上貨組件簡易版,50行js代碼實現(xiàn)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論