在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

Vue數據通信的詳細介紹(附案例)

Vue數據通信的詳細介紹(附案例)

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于Vue數據通信的詳細介紹(附實例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

一、前言

組件是 vue.js最強大的功能之一,而組件實例的作用域是相互獨立的,這就意味著不同組件之間的數據無法相互引用。組件間如何傳遞數據就顯得至關重要。本文盡可能羅列出一些常見的數據傳遞方式,如props、$emit/$on和vuex以及新出的$attrs/$listeners和provide/inject,以通俗易懂的實例講述這其中的差別,希望對小伙伴有些許幫助。

二、props

父組件A通過props的方式向子組件B傳遞,B to A 通過在 B 組件中 $emit, A 組件中 v-on 的方式實現。

prop是單向綁定的,當父組件的屬性變化時,將傳導給子組件,反之則不行,
而且不允許直接在一個子組件內部改變 prop,否則就會報錯。那有時候如果我們想修改傳遞過來的prop,有以下辦法:

方式1:如果子組件想把它作為局部數據來使用,可以將數據存入另一個變量中再操作,不影響父組件中的數據。

    <div id="itany">
    <h2>父組件:{{name}}</h2>
    <input type="text" v-model="name">
    <my-hello :name="name"></my-hello>
  </div>
  <template id="hello">
    <div>
      <h3>子組件{{username}}</h3>
      <button @click="change">修改數據</button>
    </div>
  </template>
  <script>
    var vm = new Vue({ //父組件
      el: '#itany',
      data: {
        name: "tom"
      },
      components: {
        'my-hello': { //子組件
          props: ["name"],
          template: '#hello',
          data() {
            return {
              username: this.name
            }
          },
          //   computed: {
          //     changeName() { //如果要實時監測父組件數據的變化,還必須用到計算屬性,
                                 然而計算屬性不能直接被更改
          //       return this.name
          //     }
          //   },
          methods: {
            change() {
              this.username = "alice";
              // this.changeName = "alice";該方法無效,不能直接更改計算屬性
            }
          },
        }
      }
    });
  </script>

這種方法雖然可通過操作另一個變量,影響父組件傳遞過來的數據,但有一個很大弊端就是從此后子組件不能隨著父組件的數據變化而變化。此時如果借助計算屬性,雖然可以同步變化,但子組件卻不能更改傳遞過來的數據。所以該方法比較少用。

方式2:如果子組件想修改數據并且同步更新到父組件,兩個方法:

a.使用.sync(1.0版本中支持,2.0版本中不支持,2.3版本又開始支持)需要顯式地觸發一個更新事件。

<div id="itany">
  <h2>父組件:{{name}}</h2>
  <input type="text" v-model="name">
  <hr>
  <my-hello :name.sync="name" :user="user"></my-hello>
</div>
<template id="hello">
  <div> 
    <h3>子組件:{{name}}</h3>
    <button @click="change">修改數據</button>
  </div>
</template>
<script>
  var vm = new Vue({ //父組件
      el: '#itany',
      data: {
        name: 'tom'
      },
      components: {
        'my-hello': { //子組件
           template: '#hello',
           props: ['name'],
           methods: {
             change() {
              // this.name='alice';這種寫法不行
                 this.$emit('update:name', 'alice123');
            //方式2:a.使用.sync,需要顯式地觸發一個更新事件
             }
           }
           }
        }
    });
</script>

625053228-5bbc8ed7212c7_articlex.gif

b.可以將父組件中的數據包裝成對象,然后在子組件中修改對象的屬性(因為對象是引用類型,指向同一個內存空間),推薦

<div id="itany">
    <h2>父組件:{{name}}</h2>
    <input type="text" v-model="name">
    <h2>父組件:{{user.age}}</h2>
    <hr>
    <my-hello :name.sync="name" :user="user"></my-hello>
</div>

<template id="hello">
    <div>
        <h3>子組件:{{name}}</h3>
        <h3>子組件:{{user.age}}</h3>
        <button @click="change">修改數據</button>
    </div>
</template>
<script>
    var vm = new Vue({ //父組件
        el: '#itany',
        data: {
            name: 'tom',
            user: { //父組件中的數據包裝成對象
                name: 'zhangsan',
                age: 24
            }
        },
        components: {
            'my-hello': { //子組件
                template: '#hello',
                props: ['name', 'user'],
                methods: {
                    change() {
                        this.user.age = 18;
                    }
                }
            }
        }
    });
</script>

3770728871-5bbc8ed763b82_articlex.gif

這是因為在 JavaScript 中對象和數組是通過引用傳入的,所以對于一個數組或對象類型的 prop 來說,在子組件中改變這個對象或數組本身將會影響到父組件的狀態

三、$emit/$on

這種方法通過一個空的Vue實例作為中央事件總線(事件中心),用它來觸發事件和監聽事件,巧妙而輕量地實現了任何組件間的通信,包括父子、兄弟、跨級。當我們的項目比較大時,可以選擇更好的狀態管理解決方案vuex

1.具體實現方式:

    var Event=new Vue();
    Event.$emit(事件名,數據);
    Event.$on(事件名,data => {});

2.舉個例子:兄弟組件有三個,分別是A、B、C,C組件如何獲取A或者B組件的數據

<div id="itany">
    <my-a></my-a>
    <my-b></my-b>
    <my-c></my-c>
</div>
<template id="a">
  <div>
    <h3>A組件:{{name}}</h3>
    <button @click="send">將數據發送給C組件</button>
  </div>
</template>
<template id="b">
  <div>
    <h3>B組件:{{age}}</h3>
    <button @click="send">將數組發送給C組件</button>
  </div>
</template>
<template id="c">
  <div>
    <h3>C組件:{{name}},{{age}}</h3>
  </div>
</template>
<script>
var Event = new Vue();//定義一個空的Vue實例
var A = {
    template: '#a',
    data() {
      return {
        name: 'tom'
      }
    },
    methods: {
      send() {
        Event.$emit('data-a', this.name);
      }
    }
}
var B = {
    template: '#b',
    data() {
      return {
        age: 20
      }
    },
    methods: {
      send() {
        Event.$emit('data-b', this.age);
      }
    }
}
var C = {
    template: '#c',
    data() {
      return {
        name: '',
        age: ""
      }
    },
    mounted() {//在模板編譯完成后執行
     Event.$on('data-a',name => {
         this.name = name;//箭頭函數內部不會產生新的this,這邊如果不用=>,this指代Event
     })
     Event.$on('data-b',age => {
         this.age = age;
     })
    }
}
var vm = new Vue({
    el: '#itany',
    components: {
      'my-a': A,
      'my-b': B,
      'my-c': C
    }
});    
</script>

1240939101-5bbc8ed71d276_articlex.gif

四、vuex

914212941-5bbc8ed6f2d23_articlex.png

1.簡要介紹Vuex原理

Vuex實現了一個單向數據流,在全局擁有一個State存放數據,當組件要更改State中的數據時,必須通過Mutation進行,Mutation同時提供了訂閱者模式供外部插件調用獲取State數據的更新。而當所有異步操作(常見于調用后端接口異步獲取更新數據)或批量的同步操作需要走Action,但Action也是無法直接修改State的,還是需要通過Mutation來修改State的數據。最后,根據State的變化,渲染到視圖上。

2.簡要介紹各模塊在流程中的主要功能:

  • Vue Components:Vue組件。HTML頁面上,負責接收用戶操作等交互行為,執行dispatch方法觸發對應action進行回應。

  • dispatch:操作行為觸發方法,是唯一能執行action的方法。

  • actions:操作行為處理模塊,由組件中的$store.dispatch('action 名稱', data1)來觸發。然后由commit()來觸發mutation的調用 , 間接更新 state。負責處理Vue Components接收到的所有交互行為。包含同步/異步操作,支持多個同名方法,按照注冊的順序依次觸發。向后臺API請求的操作就在這個模塊中進行,包括觸發其他action以及提交mutation的操作。該模塊提供了Promise的封裝,以支持action的鏈式觸發。

  • commit:狀態改變提交操作方法。對mutation進行提交,是唯一能執行mutation的方法。

  • mutations:狀態改變操作方法,由actions中的commit('mutation 名稱')來觸發。是Vuex修改state的唯一推薦方法。該方法只能進行同步操作,且方法名只能全局唯一。操作之中會有一些hook暴露出來,以進行state的監控等。

  • state:頁面狀態管理容器對象。集中存儲Vue components中data對象的零散數據,全局唯一,以進行統一的狀態管理。頁面顯示所需的數據從該對象中進行讀取,利用Vue的細粒度數據響應機制來進行高效的狀態更新。

  • getters:state對象讀取方法。圖中沒有單獨列出該模塊,應該被包含在了render中,Vue Components通過該方法讀取全局state對象。

如果你想深入了解,請點擊從頭開始學習Vuex這篇文章

五、localStorage

1.簡介

HTML5中新增了本地存儲的解決方案----WebStorage,它分成兩類:sessionStorage和localStorage。localStorage保存的數據長期存在,除非被清除,下一次訪問該網站的時候,網頁可以直接讀取以前保存的數據

localStorage保存的數據,以“鍵值對”的形式存在。也就是說,每一項數據都有一個鍵名和對應的值。所有的數據都是以文本格式保存。
存入數據使用setItem方法。它接受兩個參數,第一個是鍵名,第二個是保存的數據。
localStorage.setItem("key","value");
讀取數據使用getItem方法。它只有一個參數,就是鍵名。
var valueLocal = localStorage.getItem("key");

如果想深入了解,請點擊瀏覽器存儲這篇文章

2.localStorage與Vuex區別

vuex 是 vue 的狀態管理器,存儲的數據是響應式的。但是并不會保存起來,刷新之后就回到了初始狀態,具體做法應該在vuex里數據改變的時候把數據拷貝一份保存到localStorage里面,刷新之后,如果localStorage里有保存的數據,取出來再替換store里的state。

let defaultCity = "上海"
try {   // 用戶關閉了本地存儲功能,此時在外層加個try...catch
  if (!defaultCity){
    defaultCity = JSON.parse(window.localStorage.getItem('defaultCity'))
  }
}catch(e){}
export default new Vuex.Store({
  state: {
    city: defaultCity
  },
  mutations: {
    changeCity(state, city) {
      state.city = city
      try {
      window.localStorage.setItem('defaultCity', JSON.stringify(state.city));
      // 數據改變的時候把數據拷貝一份保存到localStorage里面
      } catch (e) {}
    }
  }
})

3.注意點

由于vuex里,我們保存的狀態,都是數組,而localStorage只支持字符串,所以需要用JSON轉換:

JSON.stringify(state.subscribeList);   // array -> string
JSON.parse(window.localStorage.getItem("subscribeList"));    // string -> array

六、$attrs/$listeners

1.簡介

多級組件嵌套需要傳遞數據時,通常使用的方法是通過vuex。但如果僅僅是傳遞數據,而不做中間處理,使用 vuex 處理,未免有點大材小用。為此Vue2.4 版本提供了另一種方法,當一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內部組件。通常配合 interitAttrs 選項一起使用

// demo.vue
  <template>
    <div>
      <child-com:foo="foo":boo="boo":coo="coo":doo="doo"></child-com>
    </div>
  </tempalte>
  <script>
  const childCom = ()=> import('./childCom1.vue')
  export default {
    data () {
      return {
        foo: 'Hello World!',
        boo: 'Hello Javascript!',
        coo: 'Hello Vue',
        doo: 'Last'
      }
    },
    components: { childCom }
  }
  </script>
// childCom1.vue
<template>
  <div>
    <p>foo: {{ foo }}</p>
    <p>attrs: {{ $attrs }}</p>
    <child-com2 v-bind="$attrs"></child-com2>
  </div>
</template>
<script>
const childCom2 = ()=> import('./childCom2.vue')
export default {
  props: ['foo'],  // foo作為props屬性綁定
  inheritAttrs: false,
  created () {
    console.log(this.$attrs) // { boo: 'Hello Javascript!', coo: 'Hello Vue', doo: 'Last' }
  }
}
</script>
// childCom2.vue
<template>
  <div>
   <p>boo: {{ boo }}</p>
   <p>attrs: {{ $attrs }}</p>
   <child-com3 v-bind="$attrs"></child-com3>
  </div>
</template>
<script>
const childCom3 = ()=> import('./childCom3.vue')
export default {
  props: ['boo'] // boo作為props屬性綁定
  inheritAttrs: false,
  created () {
    console.log(this.$attrs) // { coo: 'Hello Vue', doo: 'Last' }
  }
}
</script>

$attrs表示沒有繼承數據的對象,格式為{屬性名:屬性值}。Vue2.4提供了$attrs , $listeners 來傳遞數據與事件,跨級組件之間的通訊變得更簡單

七、provide/inject

1.簡介

Vue2.2.0新增API,這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在起上下游關系成立的時間里始終生效。一言而蔽之:祖先組件中通過provider來提供變量,然后在子孫組件中通過inject來注入變量。

2.舉個例子

// 父組件
  export default {
    name: "Parent",
    provide: {
      parent: "父組件的值"
    }
  }
// 子組件
 export default {
    name: "",
    inject: ['parent'],
    data() {
      return {
        demo: this.parent //"父組件的值"
      }
    }
  }

上例中子組件中inject注入了父組件provide提供的變量parent,并將它提供給了data屬性

如果需要源代碼,請戳源代碼

以上就是Vue數據通信的詳細介紹(附實例)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 中文字幕中文在线| 日韩精品视频网址| 美女黄色免费看| 欧美日韩一区二区三区电影| 爱情岛论坛亚洲首页入口章节| 欧美日韩黄色一级片| 国产乱子伦精品无码专区| 午夜在线视频免费观看| 中文字幕第22页| 国产精品久久久久久久99| 欧美精品 - 色网| 艳母动漫在线观看| 成年人视频网站免费| 国产成人在线小视频| 日日碰狠狠添天天爽超碰97| 亚洲熟妇av一区二区三区| 18禁男女爽爽爽午夜网站免费| 久久免费视频3| 在线观看免费黄网站| 亚洲一区二区图片| 欧美做暖暖视频| a在线视频观看| 污污网站免费看| 中文字幕精品在线播放| 岛国大片在线播放| 韩国日本美国免费毛片| 中文字幕一区二区在线观看视频 | 91蝌蚪视频在线| wwwjizzjizzcom| 免费观看精品视频| 自拍一级黄色片| 国产视频一视频二| 亚洲色图欧美自拍| 欧美深夜福利视频| 日本人69视频| 国产v片免费观看| 免费成年人高清视频| 久久久亚洲精品无码| 污片在线免费看| 欧美 日韩 亚洲 一区| 手机在线看福利| 国产精品无码人妻一区二区在线| 天天操天天爽天天射| 久久国产午夜精品理论片最新版本| 日本在线视频www| 欧美精品在欧美一区二区| 天天干天天爽天天射| 免费国产黄色网址| 粉嫩av一区二区三区天美传媒| 成人免费毛片播放| 99热自拍偷拍| 久久成人福利视频| wwwjizzjizzcom| 国产999免费视频| av污在线观看| 亚洲一级免费观看| 国产一级片黄色| 亚洲精品无码久久久久久| 久久观看最新视频| 国产卡一卡二在线| 四虎影院一区二区| 一区二区久久精品| 手机免费av片| 久久国产激情视频| 国产又黄又猛的视频| 色婷婷综合网站| 激情视频免费网站| 亚洲精品20p| 热久久久久久久久| 国产91av视频在线观看| www.桃色.com| 成人在线免费高清视频| 在线观看成人免费| 成人污网站在线观看| 欧美久久在线观看| 黑人糟蹋人妻hd中文字幕 | 国产精品videossex国产高清| 国产免费xxx| 欧美一区二区视频在线播放| 免费网站在线观看视频| 成 年 人 黄 色 大 片大 全| 91成人在线观看喷潮教学| 亚洲人精品午夜射精日韩| 欧美污视频网站| 久久综合久久色| 91性高潮久久久久久久| 裸体裸乳免费看| 国产精品免费入口| 久久婷婷综合色| 国产制服91一区二区三区制服| www插插插无码免费视频网站| av7777777| 欧美性猛交xxxx乱大交91| 日本大片免费看| 黄色三级视频在线| 日韩一二区视频| 久久久久久久久久久免费视频| 看欧美ab黄色大片视频免费| 五月天丁香花婷婷| 成年人视频观看| 小早川怜子一区二区三区| 国产曰肥老太婆无遮挡| 亚洲欧美自拍另类日韩| avove在线观看| 黄色免费网址大全| 久操手机在线视频| 九九热99视频| 国产女女做受ⅹxx高潮| 久久av喷吹av高潮av| 在线观看的毛片| 成年人网站免费视频| 午夜啪啪免费视频| av亚洲天堂网| www黄色日本| 精品少妇人欧美激情在线观看| 色婷婷综合网站| 国产精品69页| av动漫在线看| 国产欧美久久久久| 精品一区二区三区毛片| 岛国毛片在线播放| 我看黄色一级片| 欧美成人免费高清视频| 水蜜桃色314在线观看| 久久久天堂国产精品| 国产xxxxhd| 午夜免费一级片| 香蕉视频xxx| 91 视频免费观看| 午夜大片在线观看| 99九九99九九九99九他书对| 天天爽人人爽夜夜爽| 精品久久久噜噜噜噜久久图片| 免费在线激情视频| 欧美私人情侣网站| 91av俱乐部| 五月天av在线播放| 中文字幕12页| 一二三四中文字幕| 国产情侣第一页| 欧美一级视频免费看| 国产在线青青草| 北条麻妃在线一区| 亚洲欧美视频二区| 国产三级精品三级在线| 亚洲精品中文字幕乱码无线| 欧美激情第四页| 成品人视频ww入口| 少妇高潮喷水久久久久久久久久| 日韩精品视频久久| 久久久久xxxx| 久艹在线免费观看| 欧美黄色一级片视频| 99精品视频国产| 精品丰满人妻无套内射| 激情六月丁香婷婷| 亚洲男人天堂av在线| 国产黄色激情视频| 中文久久久久久| 亚洲高清av一区二区三区| www.av片| 三级性生活视频| 国产深夜男女无套内射| 一区二区三区 日韩| 免费观看黄色的网站| 成年人视频网站免费观看| 欧美美女一级片| 久久久一本二本三本| 日本一二三区在线| 国产综合免费视频| 黄色三级中文字幕| 男生操女生视频在线观看| 精品人妻少妇一区二区| 粉色视频免费看| 韩国日本在线视频| 免费在线看黄色片| 亚洲色图偷拍视频| 亚洲人成无码www久久久| 97干在线视频| 波多野结衣免费观看| 日韩视频免费在线播放| 99久久免费观看| 九九热视频免费| 中文av一区二区三区| 久在线观看视频| 福利在线小视频| 香蕉视频xxxx| 九色porny自拍| 日本激情视频在线| 18禁免费无码无遮挡不卡网站| 欧美乱做爰xxxⅹ久久久| 国产黑丝在线视频| 三级一区二区三区| 深夜黄色小视频| 亚洲高清在线免费观看| 国产自偷自偷免费一区| 黄色国产精品视频| 日韩国产欧美亚洲| 亚洲色成人一区二区三区小说| 国产www免费|