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

vue2.x中的provide和inject用法小結(jié)

 更新時間:2023年12月27日 15:04:43   作者:老電影故事  
這篇文章主要介紹了vue2.x中的provide和inject用法小結(jié),本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

一、Vue中 常見的組件通信方式可分為三類

父子通信

父向子傳遞數(shù)據(jù)是通過 props,子向父是通過 events($emit);
通過父鏈 / 子鏈也可以通信($parent / $children);
ref 也可以訪問組件實例;
provide / inject;
$attrs/$listeners;

兄弟通信

Bus
Vuex

跨級通信

Bus;
Vuex;
provide / inject、
$attrs / $listeners、

二、provide、inject

1、類型

provide:Object | () => Object
inject: Array<string> | { [key: string]: string | Symbol | Object }

2、詳細

provide 選項應(yīng)該是一個對象或返回一個對象的函數(shù)。該對象包含可注入其子孫的 property。
在該對象中可使用 ES2015 Symbols 作為 key,但是只在原生支持 Symbol 和 Reflect.ownKeys 的環(huán)境下可工作。
inject 選項應(yīng)該是:
  一個字符串數(shù)組,或
  一個對象,對象的 key 是本地的綁定名,value 是:
      在可用的注入內(nèi)容中搜索用的 key (字符串或 Symbol),或
      一個對象,該對象的:
         from property 是在可用的注入內(nèi)容中搜索用的 key (字符串或 Symbol)
         default property 是降級情況下使用的 value
provide 和 inject 主要在開發(fā)高階插件/組件庫時使用。并不推薦用于普通應(yīng)用程序代碼中。
這對選項是成對使用的。子孫組件想要獲取祖先組件得資源,那么怎么辦呢,總不能一直取父級往上吧,而且這樣代碼結(jié)構(gòu)容易混亂。這個就是這對選項要干的事情。

3、示例

爺組件

<template>
  <div>
    <button @click="changeMsg">祖組件觸發(fā)</button>
    <h1>祖組件</h1>
    <parent></parent>
  </div>
</template>
<script>
import parent from './parent.vue';
export default {
  data(){
    return{
      obj:{
        name:'JavaScript',
      },
      developer:'布蘭登·艾奇',
      year:1995,
      update:'2021年06月',
    }
  },
  provide(){
    return {
      obj: this.obj, // 方式1.傳入一個可監(jiān)聽的對象
      developerFn:() => this.developer, // 方式2.通過 computed 來計算注入的值
      year: this.year, // 方式3.直接傳值
      app: this, // 方式4. 提供祖先組件的實例 缺點:實例上掛載很多沒有必要的東西 比如:props,methods。
    }
  },
  components: {
    parent,
  },
  methods:{
    changeMsg(){
      this.obj.name = 'Vue';
      this.developer = '尤雨溪';
      this.year = 2014;
      this.update = '2021年6月7日';
    },
  },
}
</script>

父組件

<template>
  <div class="wrap">
    <h4>子組件(只做中轉(zhuǎn))</h4>
    <child></child>
  </div>
</template>
<script>
import child from './child.vue';
export default {
  components:{
    child,
  },
}
</script>

孫組件

<template>
  <div>
    <h5>孫組件</h5>
    <span>名稱:{{obj.name}}</span> |
    <span>作者:{{developer}}</span> |
    <span>誕生于:{{year}}</span> |
    <span>最后更新于:{{this.app.update}}</span>
  </div>
</template>
<script>
export default {
  computed:{
    developer(){
      return this.developerFn()
    }
  },
  inject:['obj','developerFn','year','app'],
}
</script>

在這里插入圖片描述

在這里插入圖片描述

對比一下前后差異:無論點擊多少次,孫組件中的誕生于 year 字段永遠都是1995 并不會發(fā)生變化,通過 方式1、方式2、方式4傳值是可以響應(yīng)的。
正是官網(wǎng)所提到的:provide 和 inject 綁定并不是可響應(yīng)的。這是刻意為之的。然而,如果你傳入了一個可監(jiān)聽的對象,那么其對象的 property 還是可響應(yīng)的。

在孫組件中修改祖組件傳遞過來的值(方式1、方式4),發(fā)現(xiàn)對應(yīng)的祖組件中的值也發(fā)生了變化:

爺組件

<template>
  <div>
    <h1>祖組件</h1>
    <span>名稱:{{obj.name}}</span> |
    <span>最后更新于:{{update}}</span>
    <parent></parent>
  </div>
</template>
<script>
import parent from './parent.vue';
export default {
  data(){
    return{
      obj:{
        name:'JavaScript',
      },
      update:'2021年06月',
    }
  },
  provide(){
    return {
      obj: this.obj, 
      app: this,
    }
  },
  components: {
    parent,
  },
}
</script>

父組件不變

孫組件

<template>
  <div>
    <button @click="changeMsg">孫組件觸發(fā)</button>
    <h3>孫組件</h3>
    <span>名稱:{{obj.name}}</span> |
    <span>最后更新于:{{this.app.update}}</span>
  </div>
</template>
<script>
export default {
  inject:['obj','app'],
  methods: {
    changeMsg(){
      this.obj.name = 'React';
      this.app.update = '2020年10月';
    }
  },
}
</script>

在這里插入圖片描述

在這里插入圖片描述

4、響應(yīng)式

方法一:傳遞的參數(shù)用一個方法返回

// 父組件
data() {
    return {
      name: "卷兒"
    }
  },
  provide: function() {
    return {
      newName: () => this.name
    }
// 子組件
inject: ['newName'],
computed: {
   hnewName() {
     return this.newName()
   }
 }
<!-- 子組件中的使用方式 -->
<h2>{{ hnewName }}</h2> <!-- 推薦使用這種方法 -->
<h2>{{ newName() }}</h2>

方法二:把需要傳遞的參數(shù)定義成一個對象

// 父組件
data() {
    return {
      obj: {
        name: "卷兒"
      }
    }
  },
  provide: function() {
    return {
    // 傳遞一個對象
      obj: this.obj
    }
  },
// 子組件
inject: ['obj'],
computed: {
	// 也可以不用計算屬性重新定義
   objName() {
     return this.obj.name
   }
 }
<!-- 子組件中的使用方法 -->
<h2>obj的name: {{objName}}</h2>
<h2>obj的name: {{obj.name}}</h2>

三、 總結(jié)

慎用 provide / inject
既然 provide/inject 如此好用,那么,為什么 Vue 官方還要推薦我們使用 Vuex,而不是用原生的 API 呢?
答: 前面提到過,Vuex 和 provide/inject 最大的區(qū)別:Vuex 中的全局狀態(tài)的每次修改是可以追蹤回溯的,而 provide/inject 中變量的修改是無法控制的。換句話說,不知道是哪個組件修改了這個全局狀態(tài)。
Vue 的設(shè)計理念借鑒了 React 中的單向數(shù)據(jù)流原則(雖然有 sync 這種破壞單向數(shù)據(jù)流的家伙),而 provide/inject 明顯破壞了單向數(shù)據(jù)流原則。試想,如果有多個后代組件同時依賴于一個祖先組件提供的狀態(tài),那么只要有一個組件修改了該狀態(tài),那么所有組件都會受到影響。這一方面增加了耦合度,另一方面,使得數(shù)據(jù)變化不可控。如果在多人協(xié)作開發(fā)中,這將成為一個噩夢。

在這里,總結(jié)了使用 provide/inject 做全局狀態(tài)管理的原則:

  • 多人協(xié)作時,做好作用域隔離;
  • 盡量使用一次性數(shù)據(jù)作為全局狀態(tài)

一層嵌套的父子組件可以使用props來傳值,props本身就是有相應(yīng)性的。
根據(jù)自身代碼選擇合適的傳值方式,并不一定非要用provide/inject的傳值。

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

相關(guān)文章

  • 如何使用vue開發(fā)公眾號網(wǎng)頁

    如何使用vue開發(fā)公眾號網(wǎng)頁

    因為項目需要,近期做了一個公眾號網(wǎng)頁開發(fā)。在此期間也踩了一些坑,解決這些坑之后,準備對這個項目進行復盤。記錄下項目從開發(fā)到上線所解決的問題,并對使用vue進行公眾號開發(fā)的步驟進行一個總結(jié)。方便以后有問題進行查閱。希望對你有所幫助
    2021-05-05
  • el-table表頭根據(jù)內(nèi)容自適應(yīng)完美解決表頭錯位和固定列錯位

    el-table表頭根據(jù)內(nèi)容自適應(yīng)完美解決表頭錯位和固定列錯位

    這篇文章主要介紹了el-table表頭根據(jù)內(nèi)容自適應(yīng)完美解決表頭錯位和固定列錯位,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Vue使用虛擬鍵盤及中英文切換功能

    Vue使用虛擬鍵盤及中英文切換功能

    這篇文章主要給大家介紹了關(guān)于Vue使用虛擬鍵盤及中英文切換的相關(guān)資料,有時候在大型觸屏設(shè)備(如雙屏設(shè)備)中往往就沒有鍵盤去操作,所以就需要去建立一個虛擬鍵盤去操作,需要的朋友可以參考下
    2023-06-06
  • web前端vue之vuex單獨一文件使用方式實例詳解

    web前端vue之vuex單獨一文件使用方式實例詳解

    Vuex 是一個專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。這篇文章主要介紹了web前端vue:vuex單獨一文件使用方式,需要的朋友可以參考下
    2018-01-01
  • vue3+vite項目跨域配置踩坑實戰(zhàn)篇

    vue3+vite項目跨域配置踩坑實戰(zhàn)篇

    vue3是一個流行的前端框架,vite是一個快速的構(gòu)建工具,下面這篇文章主要給大家介紹了關(guān)于vue3+vite項目跨域配置踩坑實戰(zhàn)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Vue3.x項目開發(fā)的一些常用知識點總結(jié)

    Vue3.x項目開發(fā)的一些常用知識點總結(jié)

    目前Vue3.0是會兼容大部分2.x的語法,下面這篇文章主要給大家介紹了關(guān)于Vue3.x項目開發(fā)的一些常用知識點,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • vue代理請求之Request?failed?with?status?code?404問題及解決

    vue代理請求之Request?failed?with?status?code?404問題及解決

    這篇文章主要介紹了vue代理請求之Request?failed?with?status?code?404問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue3+Vite如何解決“找不到模塊“@/components/xxx.vue”或其相應(yīng)的類型聲明ts(2307)”

    Vue3+Vite如何解決“找不到模塊“@/components/xxx.vue”或其相應(yīng)的類型聲明ts(2307)”

    在Vue項目中使用Vite時,可能因版本差異而需修改tsconfig.app.json而非tsconfig.json以解決編譯錯誤,本文分享個人解決經(jīng)驗,供參考
    2024-10-10
  • Vue 3中的異步操作管理示例分析

    Vue 3中的異步操作管理示例分析

    在現(xiàn)代Web應(yīng)用開發(fā)中,異步操作是常見的挑戰(zhàn),本文介紹了Vue3中管理多個異步操作的方法,幫助開發(fā)者提高編碼效率和應(yīng)用性能,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Vue?Router?中?Hash和?History?模式的核心區(qū)別、使用場景

    Vue?Router?中?Hash和?History?模式的核心區(qū)別、使用場景

    文章詳細介紹了VueRouter中Hash模式和History模式的核心區(qū)別、底層原理、使用場景及部署注意事項,文章還提供了實戰(zhàn)部署的解決方案和選型建議,感興趣的朋友跟隨小編一起看看吧
    2026-01-01

最新評論

南平市| 庐江县| 绵阳市| 泽普县| 安泽县| 揭阳市| 玉屏| 阿勒泰市| 绥中县| 广南县| 富川| 南平市| 交城县| 丰镇市| 颍上县| 皋兰县| 阳春市| 麦盖提县| 巴东县| 双牌县| 文水县| 灵丘县| 潜江市| 嘉鱼县| 潼关县| 东丽区| 维西| 上思县| 瓮安县| 教育| 阿拉善右旗| 武隆县| 辽宁省| 会泽县| 大悟县| 宣汉县| 宿州市| 黑水县| 商洛市| 永兴县| 马尔康县|