日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

超詳細(xì)的vue組件間通信總結(jié)

瀏覽:29日期:2022-09-28 09:12:03
目錄前言一、props、$emit單向數(shù)據(jù)流二、$parent、$children三、$attrs、$listeners四、provide、inject五、eventBus(事件總線)六、vuex七、localstorage總結(jié)前言

組件通信在我們平時開發(fā)過程中,特別是在vue和在react中,有著舉足輕重的地位。本篇將總結(jié)在vue中,組件之間通信的幾種方式:

props、$emit $parent、$children $attrs、$listeners provide、inject eventBus vuex 本地存儲一、props、$emit單向數(shù)據(jù)流

超詳細(xì)的vue組件間通信總結(jié)

father.vue:

<template> <div> <div>我是父親:<input type='button' value='父親' /> 數(shù)字為: {{num}}</div> <son :num='num' @change='change'></son> </div></template><script>import son from './son.vue';export default { name: 'Father', components: { son, }, data() { return { num: 1, }; }, methods:{ change(val){ this.num = val } }};</script>

son.vue:

<template> <div>我是兒子:<input type='button' value='兒子' @click='change'/>數(shù)字為:{{num}}</div></template><script>export default { name: 'App', components: {}, props: { num: { default: 0, }, }, created() {}, methods: { change(){ // this.num = 2 props通信是單向數(shù)據(jù)流,在這直接修改父組件傳過來的num將會報錯// 可以用$emit觸發(fā)change事件,father組件綁定change事件this.$emit(’change’, 2) } },};</script>

超詳細(xì)的vue組件間通信總結(jié)

對于上面的場景:子組件的change事件只是為了修改父組件中某一個值,還可以有以下幾種寫法:

1.父組件綁定給子組件的事件使用箭頭函數(shù)

father:<son :num='num' @change='val => num = val'></son>son:this.$emit(’change’, 2)

2.update:num和.sync

father:<son :num.sync='num'></son>son:this.$emit(’update:num’, 2)//update是規(guī)定的寫法,不可更換

3.v-model

先修改props和綁定的事件:

father:<son :value='num' @input='val => num = val'></son>son:this.$emit(’input’, 2) 可用v-model簡寫:<son v-model='num'></son>二、$parent、$children

$parent、$children可直接在父子組件中調(diào)用各自的方法以及修改數(shù)據(jù)

子組件中直接:this.$parent.num = 2

父組件中$children是個數(shù)組,因此具體是哪個子組件不太直觀,可以用$refs來操作子組件

vue官方并不推薦使用這種通信方式:節(jié)制地使用$parent和$children- 它們的主要目的是作為訪問組件的應(yīng)急方法,更推薦用 props 和 events 實現(xiàn)父子組件通信。

三、$attrs、$listeners

$attrs可以拿到父組件傳過來的屬性:

<div>我是兒子:<input type='button' value='兒子' @click='change'/>數(shù)字為:{{$attrs}}</div>

超詳細(xì)的vue組件間通信總結(jié)

dom節(jié)點:

超詳細(xì)的vue組件間通信總結(jié)

$attrs會直接將傳過來的屬性放到對應(yīng)的標(biāo)簽上,反觀props就不會。如果想去掉標(biāo)簽中的這些屬性,可以用inheritAttrs:

超詳細(xì)的vue組件間通信總結(jié)

值得注意的是:props的優(yōu)先級大于$attrs,即當(dāng)props存在的時候,$attrs為空對象:

超詳細(xì)的vue組件間通信總結(jié)

$attrs常用于跨多級組件傳遞屬性,比如祖孫組件,用父組件做中轉(zhuǎn):

father:

<son v-bind='$attrs'></son>

$attrs用于屬性跨級傳遞,方法跨級傳遞則用$listeners。

grandFather.vue:

<template> <div> <div>我是祖父: 數(shù)字為:{{nums}}</div> <father :nums='nums' @up='up' @down='down'></father> </div></template><script>import father from './father.vue';export default { name: 'App', components: { father, }, data(){ return { nums:0 } }, methods: { up() { alert(’up’) },down() { alert(’down’)}, },};</script>

father.vue:

<son v-bind='$attrs' v-on='$listeners'></son>

son.vue:

<div>我是兒子:<input type='button' value='兒子' @click='$listeners.up'/></div>

超詳細(xì)的vue組件間通信總結(jié)

四、provide、inject

這對選項需要一起使用,以允許一個祖先組件向其所有子孫后代注入一個依賴,不論組件層次有多深,并在其上下游關(guān)系成立的時間里始終生效

provide選項應(yīng)該是一個對象或返回一個對象的函數(shù)。

inject選項應(yīng)該是一個字符串?dāng)?shù)組或一個對象。

App:

...export default { provide(){ return {vm: this} },...

son:

...export default { inject: [’vm’], data(){}, mounted(){console.log(this.vm) }...

超詳細(xì)的vue組件間通信總結(jié)

注意:provide 和 inject 綁定并不是可響應(yīng)的。這是刻意為之的。然而,如果你傳入了一個可監(jiān)聽的對象,那么其對象的 property 還是可響應(yīng)的。

 inject注入中的值會沿著組件向上查找,遵從'就近原則'。

 provide 和 inject中的數(shù)據(jù)流是雙向的。

五、eventBus(事件總線)

eventBus通過發(fā)布訂閱全局事件,供其他組件使用。

在main.js中:

Vue.prototype.$bus = new Vue();

parent.vue:

<template> <div> <son1></son1> <son2></son2> </div></template><script>import son1 from ’./son1.vue’import son2 from ’./son2.vue’export default { name: ’parent’, components: { son1, son2 }, created(){ this.$bus.$on(’busEvent’,(v)=>{ console.log(v); }) }, beforeDestroy(){ this.$bus.off(’busEvent’) }}</script>

son1和son2中的mounted:

son1:mounted(){ this.$bus.$emit(’busEvent’,’son1哈哈’)}son2:mounted(){ this.$bus.$emit(’busEvent’, ’son2嘻嘻’)}

打印結(jié)果:

超詳細(xì)的vue組件間通信總結(jié)

使用eventBus有三點需要注意,1.$bus.on應(yīng)該在created鉤子內(nèi)使用,如果在mounted使用,它可能接收不到其他組件來自created鉤子內(nèi)發(fā)出的事件;

2.$bus.emit應(yīng)該在mounted中使用,等待created中的$bus.on事件綁定完成;

3.發(fā)布訂閱的事件在beforeDestory鉤子里需要使用$bus.off解除,組件銷毀后沒必要一直監(jiān)聽。

六、vuex

借助vuex的狀態(tài)管理來實現(xiàn)組件通信,vuex適用于較為復(fù)雜的項目,頻繁的數(shù)據(jù)共享且數(shù)據(jù)量比較大。

store/index.js:

import Vue from ’vue’import Vuex from ’vuex’Vue.use(Vuex)const store = new Vuex.Store({ state: { isLogin: false }, mutations: { loginState (state, isLogin) { state.isLogin = isLogin } }})export default store

App.vue:

created(){ this.$store.commit(’loginState’,true)// 設(shè)置登錄狀態(tài)為true},

son.vue:

<template> <div>我是兒子:<input type='button' value='兒子' />登錄狀態(tài):{{isLogin}}</div></template><script>import {mapState} from ’vuex’;export default { name: 'son', computed:{ ...mapState([’isLogin’]) }};</script>

超詳細(xì)的vue組件間通信總結(jié)

七、localstorage

localstorage是瀏覽器的本地存儲,將會長期存儲在瀏覽器中,非常龐大的數(shù)據(jù)不建議用此方式。

App.vue

created(){ localStorage.setItem(’isLogin’, true)},

son.vue:

computed:{ isLogin(){ return localStorage.getItem(’isLogin’) }}

常見的組件通信方式基本就是這些啦,有什么遺漏或不足的,歡迎評論區(qū)留言!

總結(jié)

到此這篇關(guān)于vue組件間通信的文章就介紹到這了,更多相關(guān)vue組件間通信內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
水蜜桃精品av一区二区| 天堂俺去俺来也www久久婷婷| 国产免费播放一区二区| 日韩欧美中文字幕在线视频| 日av在线不卡| 激情欧美亚洲| 亚洲国产专区| 99riav国产精品| 一区在线免费观看| 在线亚洲成人| 免费的成人av| 91欧美精品| 久久天堂影院| 亚洲精品**中文毛片| 日韩精品欧美| 怡红院精品视频在线观看极品| 亚洲一区二区动漫| 亚洲欧洲美洲国产香蕉| 日本va欧美va精品发布| 免费日韩一区二区三区| 精品一区二区三区四区五区| 中文在线免费视频| 91久久久久| 欧美日韩精品一区二区三区视频 | 久久黄色影院| 亚洲欧洲一区| 日韩国产欧美一区二区三区| 日韩黄色av| 高清av一区| 亚洲一区国产一区| 日韩高清一区二区| 超碰在线99| 国产亚洲精品久久久久婷婷瑜伽| 四虎精品永久免费| 欧美激情福利| 激情欧美国产欧美| 欧美日韩亚洲一区在线观看| 国产日韩电影| 极品av在线| 久久国产影院| 天堂va蜜桃一区二区三区| 日韩精品成人在线观看| 欧美日韩1区2区3区| 国产91在线播放精品| 久久久久国产| 亚洲精品少妇| 福利视频一区| 久久高清一区| 精品国产亚洲日本| 国产精品美女久久久| 国产精品自在| 欧美日韩高清| 国产日本久久| 久久久精品日韩| 一本综合精品| 色爱综合网欧美| 亚洲天堂日韩在线| 国产高清精品二区| 91久久中文| 国产一区二区三区日韩精品| 国产精品日本| 成人黄色av| 亚洲精品无播放器在线播放| 麻豆成全视频免费观看在线看| 亚洲欧美成人综合| 国内在线观看一区二区三区| 国产一区导航| 日韩高清欧美| 国产一级成人av| 国内激情久久| 精品国产一级| 综合五月婷婷| 日本激情一区| 日韩高清不卡在线| 午夜国产欧美理论在线播放| 麻豆国产欧美一区二区三区| 久久最新视频| 神马午夜久久| 久久精品国产福利| 日韩精品中文字幕吗一区二区| 久久国产亚洲| 久久精品欧洲| 日本不卡在线视频| 亚洲一区二区三区高清| 欧美成人基地| 欧美黄色一区| 日韩欧美美女在线观看| 欧美综合另类| 精品国产黄a∨片高清在线| 日本中文字幕一区二区| 2023国产精品久久久精品双| 高清av不卡| 免费在线日韩av| 婷婷亚洲成人| 国产一级一区二区| 亚洲黑丝一区二区| 日韩精品电影| 精品99在线| 久久尤物视频| 国产欧美日韩精品一区二区三区| 久久亚洲美女| 午夜一级在线看亚洲| 久久久精品日韩| 日韩欧美网址| 亚洲国产欧美日本视频| 精品国产99| 欧美激情福利| 久久精品国产一区二区| 久久99蜜桃| 啪啪亚洲精品| 日韩成人在线看| 日韩精品欧美大片| 亚洲不卡视频| 最近国产精品视频| 在线观看一区| 综合激情婷婷| 综合一区av| 亚洲精品乱码久久久久久蜜桃麻豆| 午夜欧美精品| 亚洲一区国产一区| 日韩影院免费视频| 美美哒免费高清在线观看视频一区二区| 欧美 日韩 国产一区二区在线视频| 99久久99视频只有精品| 最近高清中文在线字幕在线观看1| 日本久久精品| 秋霞国产精品| 亚洲香蕉网站| 国产66精品| 国产精品videossex久久发布| 欧美偷窥清纯综合图区| 日韩不卡免费视频| 久久亚洲二区| 伊人久久视频| 毛片在线网站| 日韩在线二区| 国精品一区二区三区| 婷婷激情久久| av不卡在线| 日韩中文字幕| 国产精品一区二区精品| 久久精品欧洲| 久久精品青草| 午夜在线观看免费一区| 婷婷精品久久久久久久久久不卡| 日韩av网站免费在线| 国产精品久久久网站| 久久99蜜桃| 日韩欧美1区| 亚洲专区一区| 91亚洲精品视频在线观看| 精品精品久久| 久久久久久美女精品| 国产精品美女久久久浪潮软件| 性欧美长视频| 国产精品麻豆成人av电影艾秋| 久久精品国产亚洲一区二区三区| 日韩在线短视频| 国产精品日韩久久久| 国产欧美一区二区精品久久久| 大香伊人久久精品一区二区| 亚洲网站视频| 亚洲精品伊人| 精品视频在线你懂得| 免费视频亚洲| 青青草国产精品亚洲专区无| 国产精品久久久久久久久妇女| 国产高清久久| 久久狠狠久久| 日韩精品一卡| 日韩精品久久久久久久软件91| 精品日韩在线| 久久国产精品毛片| 国产精品xxx在线观看| 久久要要av| 日本h片久久| 日韩三区免费| 性一交一乱一区二区洋洋av| 国产精品一页| 激情综合自拍| 青草久久视频| 久久久成人网| 久久激情五月婷婷| 欧美日韩高清| 麻豆国产91在线播放| 日韩午夜av| 成人亚洲一区| 日本一不卡视频| 日韩一区亚洲二区| 日本成人在线一区| 999国产精品999久久久久久| 日本中文字幕视频一区| 日本精品不卡| 日韩av一级片| 国产一区日韩欧美| 国产精品久久久久毛片大屁完整版| 红桃视频亚洲| 正在播放日韩精品| 国产欧美日韩视频在线| 亚洲一区欧美二区|