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

vue3中?provide?和?inject?用法及原理

 更新時(shí)間:2021年11月27日 10:40:34   作者:前端人  
這篇文章主要介紹vue3中?provide?和?inject?用法及原理,provide?和?inject可以?解決多次組件傳遞數(shù)據(jù)的問題,下面文章是具體的用法和實(shí)現(xiàn)原理,具有一定的參考價(jià)值,需要的朋友可以參考一下,希望對(duì)大家有所幫助

前言:

在父子組件傳遞數(shù)據(jù)時(shí),通常使用的是 props 和 emit,父傳子時(shí),使用的是 props,如果是父組件傳孫組件時(shí),就需要先傳給子組件,子組件再傳給孫組件,如果多個(gè)子組件或多個(gè)孫組件使用時(shí),就需要傳很多次,會(huì)很麻煩。

像這種情況,可以使用 provide inject 解決這種問題,不論組件嵌套多深,父組件都可以為所有子組件或?qū)O組件提供數(shù)據(jù),父組件使用 provide 提供數(shù)據(jù),子組件或?qū)O組件 inject 注入數(shù)據(jù)。同時(shí)兄弟組件之間傳值更方便。

一、Vue2 的 provide / inject 使用

provide :是一個(gè)對(duì)象,里面是屬性和值。如:

provide:{

 info:"值"

}

如果 provide 需要使用 data 內(nèi)的數(shù)據(jù)時(shí),這樣寫就會(huì)報(bào)錯(cuò)。訪問組件實(shí)例 property 時(shí),需要將 provide 轉(zhuǎn)換為返回對(duì)象的函數(shù)。

provide(){

 return{

  info: this.msg

 }

}

inject :是一個(gè)字符串?dāng)?shù)組。如:

inject: [ 'info' ]

接收上邊 provide 提供的 info 數(shù)據(jù),也可以是一個(gè)對(duì)象,該對(duì)象包含 from 和 default 屬性,from 是可用做的注入內(nèi)容中搜索用的 key,default 屬性是指定默認(rèn)值。

在 vue2 中 project / inject 應(yīng)用:

//父組件

export default{

 provide:{

  info:"提供數(shù)據(jù)"

 }

}

//子組件

export default{

 inject:['info'],

 mounted(){

     console.log("接收數(shù)據(jù):", this.info) // 接收數(shù)據(jù):提供數(shù)據(jù)

 }

} 

provide / inject 類似于消息的訂閱和發(fā)布。provide 提供或發(fā)送數(shù)據(jù), inject 接收數(shù)據(jù)。

二、Vue3 的 provide / inject 使用

在組合式 API 中使用 provide/inject,兩個(gè)只能在 setup 期間調(diào)用,使用之前,必須從 vue 顯示導(dǎo)入 provide/inject 方法。

provide 函數(shù)接收兩個(gè)參數(shù):

provide( name,value )

  • name:定義提供 property name 。
  • valueproperty 的值。

使用時(shí):

import { provide } from "vue"

export default {

  setup(){

    provide('info',"值")

  }

}

inject 函數(shù)有兩個(gè)參數(shù):

inject(name,default)

  • name:接收 provide 提供的屬性名。
  • default:設(shè)置默認(rèn)值,可以不寫,是可選參數(shù)。

使用時(shí):

import { inject } from "vue"

export default {

  setup(){

    inject('info',"設(shè)置默認(rèn)值")

  }

}

完整實(shí)例1provide/inject實(shí)例

//父組件代碼

<script>

import { provide } from "vue"

export default {

  setup(){

    provide('info',"值")

  }

}

</script>

//子組件 代碼

<template>

 {{info}}

</template>

<script>

import { inject } from "vue"

export default {

  setup(){

    const info = inject('info')

    return{

      info

    }

  }

}

</script>

三、添加響應(yīng)性

為了給 provide/inject 添加響應(yīng)性,使用 ref reactive

完整實(shí)例2provide/inject 響應(yīng)式

//父組件代碼

<template>

  <div>

    info:{{info}}

    <InjectCom ></InjectCom>

  </div>

</template>

<script>

import InjectCom from "./InjectCom"

import { provide,readonly,ref } from "vue"

export default {

  setup(){

    let info = ref("今天你學(xué)習(xí)了嗎?")

    setTimeout(()=>{

      info.value = "不找借口,立馬學(xué)習(xí)"

    },2000)

    provide('info',info)

    return{

      info

    }

  },

  components:{

    InjectCom

  }

}

</script>

// InjectCom 子組件代碼

<template>

 {{info}}

</template>

<script>

import { inject } from "vue"

export default {

  setup(){

    const info = inject('info')

    setTimeout(()=>{

      info.value = "更新"

    },2000)

    return{

      info

    }

  }

}

</script>

上述示例,在父組件或子組件都會(huì)修改 info 的值。

provide / inject 類似于消息的訂閱和發(fā)布,遵循 vue 當(dāng)中的單項(xiàng)數(shù)據(jù)流,什么意思呢?就是數(shù)據(jù)在哪,修改只能在哪,不能在數(shù)據(jù)傳遞處修改數(shù)據(jù),容易造成狀態(tài)不可預(yù)測。

在訂閱組件內(nèi)修改值的時(shí)候,可以被正常修改,如果其他組件也使用該值的時(shí)候,狀態(tài)容易造成混亂,所以需要在源頭上規(guī)避問題。

readonly 只讀函數(shù),使用之前需要引入,如果給變量加上 readonly 屬性,則該數(shù)據(jù)只能讀取,無法改變,被修改時(shí)會(huì)發(fā)出警告,但不會(huì)改變值。

使用方法:

import { readonly } from "vue"

let info = readonly('只讀info值')

setTimout(()=>{

 info="更新info" //兩秒后更新info的值

},2000)

運(yùn)行兩秒后,瀏覽器發(fā)出警告,提示 info 值不可修改。

所以我們就給provide發(fā)射出去的數(shù)據(jù),添加一個(gè)只讀屬性,避免發(fā)射出去的數(shù)據(jù)被修改。

完整實(shí)例2的 provide 處添加 readonly 。

provide('info', readonly(info))

在子組件修改值的時(shí)候,會(huì)有一個(gè)只讀提醒。

修改值的時(shí)候,還是需要在 provide 發(fā)布數(shù)據(jù)的組件內(nèi)修改數(shù)據(jù),所以會(huì)在組件內(nèi)添加修改方法,同時(shí)也發(fā)布出去,在子組件處調(diào)用就可以了。

如:

//發(fā)布

let info = ref("今天你學(xué)習(xí)了嗎?")

const changeInfo = (val)=>{

 info.value = val

}

provide('info',readonly(info))

provide('changeInfo',changeInfo)



//訂閱

const chang = inject('changeInfo')

chang('沖向前端工程師')

完整示例3:修改數(shù)據(jù)

// 父組件代碼

<template>

  <div>

    info:{{info}}

    <InjectCom ></InjectCom>

  </div>

</template>



<script>

import InjectCom from "./InjectCom"

import { provide,readonly,ref } from "vue"

export default {

  setup(){

    let info = ref("今天你學(xué)習(xí)了嗎?")

    const changeInfo = (val)=>{

      info.value = val

    }

    provide('info',readonly(info))

    provide('changeInfo',changeInfo)

    return{

      info

    }

  },

  components:{

    InjectCom

  }

}

</script>



//InjectCom 子組件代碼

<template>

  <div>

    <button @click="chang('沖向前端工程師')">更新值</button>

  </div>

</template>

<script>

import { inject } from "vue"

export default {

  setup(){

    const info = inject('info')

    const chang = inject('changeInfo')

    return{

      info,

      chang

    }

  }

}

</script>
 

到此這篇關(guān)于vue3provide inject 用法及原理的文章就介紹到這了,更多相關(guān) vue3 中provide 和 inject 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VUE+element開發(fā)后臺(tái)管理的搜索功能

    VUE+element開發(fā)后臺(tái)管理的搜索功能

    這篇文章主要為大家詳細(xì)介紹了VUE+element開發(fā)后臺(tái)管理的搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 淺談一下Vue技術(shù)棧之生命周期

    淺談一下Vue技術(shù)棧之生命周期

    這篇文章主要介紹了淺談一下Vue技術(shù)棧之生命周期,每一個(gè)vue實(shí)例從創(chuàng)建到銷毀的過程,就是這個(gè)vue實(shí)例的生命周期,這些過程中會(huì)伴隨著一些函數(shù)的自調(diào)用,需要的朋友可以參考下
    2023-05-05
  • vue+springboot前后端分離實(shí)現(xiàn)單點(diǎn)登錄跨域問題解決方法

    vue+springboot前后端分離實(shí)現(xiàn)單點(diǎn)登錄跨域問題解決方法

    這篇文章主要介紹了vue+springboot前后端分離實(shí)現(xiàn)單點(diǎn)登錄跨域問題的解決方法,需要的朋友可以參考下
    2018-01-01
  • 在vue項(xiàng)目中引用Iview的方法

    在vue項(xiàng)目中引用Iview的方法

    iView 是一套基于 Vue.js 的開源 UI 組件庫,主要服務(wù)于 PC 界面的中后臺(tái)產(chǎn)品。這篇文章主要介紹了在vue項(xiàng)目中引用Iview的方法,需要的朋友可以參考下
    2018-09-09
  • 詳解Vue-Cli 異步加載數(shù)據(jù)的一些注意點(diǎn)

    詳解Vue-Cli 異步加載數(shù)據(jù)的一些注意點(diǎn)

    本篇文章主要介紹了詳解Vue-Cli 異步加載數(shù)據(jù)的一些注意點(diǎn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • vue組件是如何解析及渲染的?

    vue組件是如何解析及渲染的?

    這篇文章主要介紹了vue組件是如何解析及渲染的?,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2021-01-01
  • Vue3捕獲和處理不同層級(jí)的異常/錯(cuò)誤的有效方法

    Vue3捕獲和處理不同層級(jí)的異常/錯(cuò)誤的有效方法

    項(xiàng)目中如果沒有對(duì)異常做處理,可能導(dǎo)致應(yīng)用崩潰或顯示報(bào)錯(cuò)信息影響用戶體驗(yàn),因此需要對(duì)不同層級(jí)的錯(cuò)誤進(jìn)行捕獲,所以本文給大家介紹了Vue3捕獲和處理不同層級(jí)的異常/錯(cuò)誤的有效方法,需要的朋友可以參考下
    2025-01-01
  • vue簡單練習(xí) 桌面時(shí)鐘的實(shí)現(xiàn)代碼實(shí)例

    vue簡單練習(xí) 桌面時(shí)鐘的實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了vue簡單練習(xí) 桌面時(shí)鐘的實(shí)現(xiàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值的相關(guān)資料,需要的朋友可以參考下
    2019-09-09
  • Vue.js 表單校驗(yàn)插件

    Vue.js 表單校驗(yàn)插件

    這篇文章主要介紹了Vue.js 表單校驗(yàn)插件的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • Vue+Vant實(shí)現(xiàn)7天日歷展示并在切換日期時(shí)實(shí)時(shí)變換功能

    Vue+Vant實(shí)現(xiàn)7天日歷展示并在切換日期時(shí)實(shí)時(shí)變換功能

    本文介紹了如何利用Vue和Vant框架結(jié)合moment.js插件來實(shí)現(xiàn)一個(gè)7天日歷展示功能,在這個(gè)功能中,用戶可以在切換日期時(shí)看到界面的實(shí)時(shí)變化,此外,文章還提供了代碼實(shí)現(xiàn)和效果測試的詳細(xì)步驟,幫助開發(fā)者能夠順利完成類似的項(xiàng)目開發(fā)
    2024-10-10

最新評(píng)論

策勒县| 佛坪县| 德庆县| 临安市| 滨海县| 驻马店市| 周至县| 天等县| 文水县| 来宾市| 集安市| 昆明市| 东方市| 华池县| 马关县| 东辽县| 绍兴县| 青神县| 道孚县| 墨竹工卡县| 保定市| 庆安县| 甘孜县| 灵宝市| 新建县| 溧水县| 临城县| 富蕴县| 苗栗县| 寻甸| 伊宁市| 阿图什市| 日土县| 将乐县| 新沂市| 贡嘎县| 德清县| 屯门区| 靖宇县| 南丰县| 桃园市|