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

Vue常見組件間通信方案及典型應用場景詳解

 更新時間:2022年09月03日 10:26:50   作者:陸榮濤  
這篇文章主要為大家介紹了Vue常見組件間通信方案及典型應用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

什么是組件通信

所謂組件通信,就是組件之間的數(shù)據交互,也就是把一個組件A里面的數(shù)據傳遞到另一個組件B,并能夠讓組件B根據這個數(shù)據更新界面。

在 Vue中,可用的通信方案有很多,下面給大家描述幾個常用的組件通信方案及其典型的應用場景。

1、父子組件通信場景

父子組件通信是最典型的組件通信場景,沒有之一,他們之間通信主要使用自定義屬性或者ref。

第一種是自定義屬性,使用較為廣泛,在子組件中使用 props 選項進行接收,子組件向父組件回傳數(shù)據,使用自定義事件,在子組件中使用 $emit() 方法觸發(fā)執(zhí)行,并回傳數(shù)據給父組件。

  // 定義組件h1-box
  Vue.component("h1-box", {
    // 通過props設置自定義屬性title接收組件外傳值
    props: ["title"],
    // 通過emits設置自定義事件向外部發(fā)送事件
    emits: ['give'],
    methods:{
      clickHandler(){
        // 通過$emit() 方法觸發(fā)執(zhí)行把當前組件數(shù)據帶出去
        this.$emit('give',{name:'lucy'})
      }
    },
    mounted() {
      // 通過this.title可以獲取外部傳入組件的值
      console.log(this.title);
    },
  });

第二種使用 ref 實現(xiàn)通信。我們知道,使用 ref 可以快速訪問一個組件實例對象及其內部的數(shù)據和方法。這樣的話,在父組件中借助 refs可以訪問子級組件的數(shù)據,還可以借助refs 可以訪問子級組件的數(shù)據,還可以借助 refs可以訪問子級組件的數(shù)據,還可以借助refs 調用子級組件中的方法,并傳遞事件參數(shù)給子級組件。當然需要注意的是,在 Vue開發(fā)中,應該盡量減少對 ref 的使用。

<div id="app">
  <!-- 組件 -->
  <son ref="son"></son>
</div>
new Vue({
  el: "#app",
  mounted() {
    // 獲取到組件實例,就可以任意操作組件實例
    console.log(this.$refs.son);
    let vm2 = this.$refs.son;
    // 修改son組件的響應式數(shù)據msg
    vm2.msg = "sz2111";
    // 調用son組件的changeMsg方法
    vm2.changeMsg("sz2116");
  },
  components: {
    // 定義組件son
    son: {
      data() {
        return {
          msg: "sz2114",
        };
      },
      methods: {
        changeMsg(val) {
          this.msg = val;
        },
      },
      template: `<h1>hello world</h1>`,
    },
  },
});

2、兄弟組件通信場景

這種場景使用狀態(tài)提升,這個概念源自 React 中的狀態(tài)提升思想。

所謂狀態(tài)提升,就是當兩個組件希望共享一個數(shù)據時,我們可以找到這兩個組件最近的父級組件,把這個要被共享的變量定義在最近的父組件中去,再通過 props 向下傳遞給子組件們。需要注意的是,狀態(tài)提升適合應用在簡單的兄弟組件之間通信。當遇到較為復雜的組件關系時,使用狀態(tài)提升就顯得麻煩了。

上圖圖中如果想點擊Font按鈕改變主題字體大小,也就是Title和Font兩個組件字體大小都改變。

如果Title和Font組件都維護自己組件的狀態(tài)數(shù)據就不太好傳遞數(shù)據,就可以他他們的狀態(tài)存儲到共同的父組件狀態(tài)中,也就是狀態(tài)提升。

  <!-- 父組件app -->
  <div id="app">
    <!-- 子組件font -->
    <font :font="fontSize"></font>
    <!-- 子組件title -->
    <title :font="fontSize"></title>
  </div>
  // 父組件
  new Vue({
    el:'#app',
    data:{
      // 把子組件共同需要的數(shù)據存儲在共同的父組件上
      fontSize:12
    }
  })
  // 子組件
  Vue.component('font',{
    // 通過自定義屬性接受父組件傳入的值
    props:['font'],
    template:`<div :style="{fontSize:font+'px'}">hello</div>`
  })
  // 子組件
  Vue.component('title',{
    // 通過自定義屬性接受父組件傳入的值
    props:['font'],
    template:`<div :style="{fontSize:font+'px'}">world</div>`
  })

3、根組件和后代組件通信場景

這種場景主要是provide/inject。使用 provide 選項,可以在任意組件中注入數(shù)據;使用 inject 選項,可以在后代組件中接受父級組件注入的數(shù)據。需要注意的是,provide/inject 這種通信方案是沒有響應式的,即父組件注入的數(shù)據發(fā)生變化時,后代組件不會自動更新

上圖在祖先組件通過provide傳入的數(shù)據,在后代的所有組件中都可以通過inject獲取到。

下面是一個通過provide/inject傳值的例子

 <div id="app">
    <three></three>
  </div>
 // 根組件
  new Vue({
    el: "#app",
    // provide用于在一個vue實例里面給后面的子孫實例傳遞數(shù)據
    provide: function () {
      return {
        a: 100,
        c: 300,
        d: this.obj,
      };
    }
  });
  // 定義組件one
  Vue.component("one", {
    // inject用于在子孫組件中接收祖先通過provide傳入的變量c
    inject: ["a"],
    template: `
      <div>
        <h1>我是one組件---{{a}}</h1>
      </div>
    `,
  });
  // 定義組件two,里面有子組件one
  Vue.component("two", {
    // inject用于在子孫組件中接收祖先通過provide傳入的變量c,并重名成myC
    inject: {
      myC: "c",
    },
    template: `
      <div>
        <h1>我是two組件---{{myC}}</h1>
        <one></one>
      </div>
    `,
  });
  // 定義組件three,里面有子組件two
  Vue.component("three", {
    // inject用于在子孫組件中接收祖先通過provide傳入的變量b,并重名成bbb,同時設置默認值299999
    inject: {
      bbb: {
        from: "b",
        default: 299999,
      },
    },
    template: `
      <div>
        <h1>我是three組件---{{bbb}}</h1>
        <two></two>
      </div>
    `,
  });

4、插槽通信場景

在封裝組件時,可以為 組件添加自定義屬性。使用這個組件時,在父級組件中使用 #slotName='scope' 指令可以接收到子組件插槽傳遞過來的數(shù)據。ElementUI 中的 Table 表格、VantUI 中的 Tabbar 組件,都用到了插槽通信。

  <div id="app">
    <child>
      <template #abc>
        <h1>sz2114</h1>
        <h2>sz2115</h2>
        <h3>sz2116</h3>
      </template>
      <template #cindy>
        <h1>sz2014</h1>
        <h2>sz2015</h2>
        <h3>sz2016</h3>
      </template>
    </child>
  </div>
  // 全局組件
  Vue.component("child", {
    template: `
        <div>
            <slot name='cindy'></slot>
            <h1>hello world</h1>
            <slot name='abc'></slot>
        </div>
    `,
  });
  let vm = new Vue({
    el: "#app",
  });

5 無直接關系的組件通信場景

在沒有直接關聯(lián)的組件之間通信可以使用事件總線。事件總線是一種基于訂閱發(fā)布模式而設計的通信方案,在任意組件中訂閱指定“頻道”后,都能收到該“頻道”上的消息

。事件總線,它的強大之處在于:它是一種“一對多”的通信方案,還是一種“多頻道”的通信方案,非常強大。

    <div id="app">
      <input type="text" v-model="duanxin1" />
      <button @click="clickHandler">給老師發(fā)消息</button>
    </div>
      // 中央事件總線: 類似一個事件對象
      // 就像一個電信局
      var bus = new Vue();
      // 每個人就收短信都需要一個號碼 (事件名)
      // 想要接收短信要先去電信辦個卡 -- 注冊一個號碼
      bus.$on("cyrevent", function (data) {
        console.log("短信內容是");
        console.log(data);
      });
      new Vue({
        el: "#app",
        data() {
          return {
            duanxin1: "",
          };
        },
        methods: {
          clickHandler() {
            // 別人想給我發(fā)消息
            bus.$emit("cyrevent", this.duanxin1);
          },
        },
      });

6 大型項目中的復雜組件通信場景 - Vuex狀態(tài)管理

Vuex狀態(tài)管理是借助狀態(tài)管理工具,可以實現(xiàn)任意組件之間的數(shù)據通信。Vuex 提供了 state、mutations 等接口,可以方便地實現(xiàn)任意未知關系的組件之間的數(shù)據交互。因此,我們經常稱 Vuex是 Vue開發(fā)中的終極通信方案。終極的意思,不是說它可以隨意地替代其它通信方案,而是說 Vuex很好用,能夠清晰地管理數(shù)據流。

上圖是vuex官方網站的工作流程圖,特別形象。

7 其他的一些組件通信方案

上面說到的是比較常用的組件通信方式,還有一些方式是上面通信方法不能使用的替代手段。

第一個是: $parent/$children,借助這兩個 API,可以實現(xiàn)在組件樹之間任意穿梭。我們在當前組件的作用域中,可以訪問到任意其它組件的內部數(shù)據,并調用它的方法。因此,這也是一種可用的通信方案。

第二個是:$attrs/$listeners。使用 $attrs 可以訪問到父組件傳遞過來的自定義屬性(除 class 和 style 外),使用 $listeners 可以訪問并調用父組件傳遞過來的自定義事件,通過對自定義事件的調用還能向父組件回傳數(shù)據。這兩個內置 API,在某種程度上可以看成是父子組件通信的替代方案。

總結

雖然 Vue中可用的通信方案很多,但要注意的是“別濫用”。在同一個項目中,選擇適合場景的通信方案很重要,不要使用過多的通信方式,這會導致代碼很難維護。一個數(shù)據流不清晰的 Web應用,通常是很難得到持續(xù)發(fā)展的。

以上就是Vue常見組件間通信方案及典型應用場景詳解的詳細內容,更多關于Vue組件間通信應用場景的資料請關注腳本之家其它相關文章!

相關文章

  • 解決vue無法設置滾動位置的問題

    解決vue無法設置滾動位置的問題

    這篇文章主要介紹了解決vue無法設置滾動位置的問題 ,需要的朋友可以參考下
    2018-10-10
  • 使用vite兼容低端瀏覽器配置

    使用vite兼容低端瀏覽器配置

    這篇文章主要介紹了使用vite兼容低端瀏覽器配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Vue的屬性、方法、生命周期實例代碼詳解

    Vue的屬性、方法、生命周期實例代碼詳解

    這篇文章主要介紹了Vue的屬性、方法、生命周期的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • vite打包出現(xiàn)?"default"?is?not?exported?by?"node_modules/...問題解決辦法

    vite打包出現(xiàn)?"default"?is?not?exported?by?"

    這篇文章主要給大家介紹了關于vite打包出現(xiàn)?"default"?is?not?exported?by?"node_modules/...問題的解決辦法,文中通過代碼將解決的辦法介紹的非常詳細,對同樣遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-06-06
  • vue中v-model和.sync修飾符的區(qū)別

    vue中v-model和.sync修飾符的區(qū)別

    在平時開發(fā)是經常用到一些父子組件通信,經常用到props、vuex等等,下面這篇文章主要給大家介紹了關于vue中v-model和.sync修飾符區(qū)別的相關資料,需要的朋友可以參考下
    2022-06-06
  • 淺談vuex之mutation和action的基本使用

    淺談vuex之mutation和action的基本使用

    本篇文章主要介紹了淺談vuex之mutation和action的基本使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 解決vue+router路由跳轉不起作用的一項原因

    解決vue+router路由跳轉不起作用的一項原因

    這篇文章主要介紹了解決vue+router路由跳轉不起作用的一項原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue mockjs編寫假數(shù)據并請求獲取實現(xiàn)流程

    Vue mockjs編寫假數(shù)據并請求獲取實現(xiàn)流程

    這篇文章主要介紹了Vue mockjs編寫假數(shù)據并請求獲取實現(xiàn)流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • SpringBoot+Vue開發(fā)之Login校驗規(guī)則、實現(xiàn)登錄和重置事件

    SpringBoot+Vue開發(fā)之Login校驗規(guī)則、實現(xiàn)登錄和重置事件

    這篇文章主要介紹了SpringBoot+Vue開發(fā)之Login校驗規(guī)則、實現(xiàn)登錄和重置事件,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 使用vue.js?為基礎的仿QQ聊天室

    使用vue.js?為基礎的仿QQ聊天室

    這篇文章主要為大家介紹了基于vue.js的QQ聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評論

临清市| 库车县| 梨树县| 汝州市| 米易县| 会东县| 湘潭县| 镇赉县| 清涧县| 抚州市| 高邑县| 东源县| 隆尧县| 夏邑县| 客服| 申扎县| 雷州市| 白城市| 布拖县| 怀来县| 扎鲁特旗| 日照市| 临潭县| 扬州市| 巨野县| 长汀县| 新郑市| 烟台市| 綦江县| 万源市| 耒阳市| 永定县| 阳原县| 灵台县| 河南省| 大庆市| 洛浦县| 湖南省| 平江县| 屏东市| 乃东县|