电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

超詳細的vue組件間通信總結

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

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

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

超詳細的vue組件間通信總結

father.vue:

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

超詳細的vue組件間通信總結

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

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

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是規定的寫法,不可更換

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可直接在父子組件中調用各自的方法以及修改數據

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

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

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

三、$attrs、$listeners

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

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

超詳細的vue組件間通信總結

dom節點:

超詳細的vue組件間通信總結

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

超詳細的vue組件間通信總結

值得注意的是:props的優先級大于$attrs,即當props存在的時候,$attrs為空對象:

超詳細的vue組件間通信總結

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

father:

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

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

grandFather.vue:

<template> <div> <div>我是祖父: 數字為:{{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>

超詳細的vue組件間通信總結

四、provide、inject

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

provide選項應該是一個對象或返回一個對象的函數。

inject選項應該是一個字符串數組或一個對象。

App:

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

son:

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

超詳細的vue組件間通信總結

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

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

 provide 和 inject中的數據流是雙向的。

五、eventBus(事件總線)

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

在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嘻嘻’)}

打印結果:

超詳細的vue組件間通信總結

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

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

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

六、vuex

借助vuex的狀態管理來實現組件通信,vuex適用于較為復雜的項目,頻繁的數據共享且數據量比較大。

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)// 設置登錄狀態為true},

son.vue:

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

超詳細的vue組件間通信總結

七、localstorage

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

App.vue

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

son.vue:

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

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

總結

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

標簽: Vue
相關文章:
主站蜘蛛池模板: 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 开云(中国)Kaiyun·官方网站-登录入口| 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 广州小程序开发_APP开发公司_分销商城系统定制_小跑科技 | 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 品牌设计_VI设计_电影海报设计_包装设计_LOGO设计-Bacross新越品牌顾问 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 科昊仪器超纯水机系统-可成气相液氮罐-美菱超低温冰箱-西安昊兴生物科技有限公司 | 传爱自考网_传爱自学考试网| 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 都江堰招聘网-都江堰人才网 都江堰人事人才网 都江堰人才招聘网 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 999范文网_优质范文下载写作帮手 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 天津云仓-天津仓储物流-天津云仓一件代发-顺东云仓 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 便携式表面粗糙度仪-彩屏硬度计-分体式粗糙度仪-北京凯达科仪科技有限公司 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 双齿辊破碎机-大型狼牙破碎机视频-对辊破碎机价格/型号图片-金联机械设备生产厂家 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 写方案网_方案策划方案模板下载| COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 生物颗粒燃烧机-生物质燃烧机-热风炉-生物颗粒蒸汽发生器-丽水市久凯能源设备有限公司 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 无味渗透剂,泡沫抑尘剂,烷基糖苷-威海威能化工有限公司 | 长信科技产业园官网_西安厂房_陕西标准工业厂房 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 |