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

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

Vue組件間數據傳遞的方式(3種)

瀏覽:3日期:2023-01-08 09:01:14
vue中傳遞數據的方式有哪些數據流的方式傳遞數據

通過 props 傳遞屬性

父級給demo2組件綁定一個msg數據

父組件

<template> <div class=’container’> <demo2 :msg='msg' @change='change' /> </div></template><script>import demo2 from ’./demo2’export default { data(){ return { msg:’這是測試數據’ } }, methods:{ change(value){ this.msg = value } }, components: { demo2 }}</script>

子組件通過定義props來使用msg,$emit觸發外部的函數來改變父級傳入的值

子組件

<template> <div class=’container’> {{msg}} <button @click='change'>點一下</button> </div></template><script>export default { props:[’msg’], methods:{ change(){ this.$emit(’change’,’這是新的數據’) } }}</script>

通過 $attrs 來收集屬性

$attrs 會收集組件上綁定的屬性,對應class和style不會處理。如果與props同用,props的優先級要高于attrs

父組件

<template> <div class='container'> <demo2 :msg='msg' /> </div></template><script>import demo2 from './demo2';export default { data() { return { msg: '這是測試數據' }; }, components: { demo2 }};</script>

子組件中this.$attrs會收集組件上綁定的屬性

子組件

<template> <div class='container'>{{$attrs.msg}} </div></template><script>export default { // inheritAttrs:true, // 會隱藏行間的屬性 // props:[’msg’], // 這里props的優先級比$attrs要高,如果設置了props,那么msg會在data上,而$attrs中就沒有msg created(){ console.log(this.$attrs) // 對象中只有msg一個屬性 }};</script>

通過$listeners 來收集方法

$listeners 會收集組件上綁定的方法。 可以通過傳遞實參的方式改變父組件的值

父組件

<template> <div class=’container’> {{msg}} <demo2 @msgChange='change'/> </div></template><script>import demo2 from ’./demo2’export default { data () { return { msg: ’這是測試數據’ } }, methods: { change(newvalue){ this.msg = newvalue; } }, components: { demo2 }}</script>

子組件中this.$listeners會收集綁定在組件上的方法。通過this.$listeners.XXX()可以直接調用,以此可以來修改父組件data中的值

子組件

<template> <div class='container'> <button @click='change'>點一下</button> </div></template><script>export default { // inheritAttrs:true, created(){ console.log(this) }, methods:{ change(){ // this.$emit(’msgChange’) // this.$parent.change() // 與$emit功能相同,$parent也能夠實現該效果 this.$listeners.msgChange(’改變后的值’) } }};</script>

通過provide提供依賴,inject注入依賴實現數據跨多級子組件傳遞

通過給父級的 provide 提供一個依賴對象,讓其所用子組件都能訪問到這個對象

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

其實也就是說provide 和 inject 綁定本身不做額外的事情(數據綁定之類),只是將提供的數據暴露給子組件。那么暴露出來的數據是不是可相應的就取決與數據本身

父組件

<template> <div class=’container’> <demo2 :msg='msg' @msgChange='change'/> </div></template><script>import demo2 from ’./demo2’export default { provide(){ return { msg:this.msg, msgChange:this.change, // 這里this本身就是一個可監聽的對象。 // this也就是當前vue實例本身已完成了數據響應,這里只是將這個實例暴露給了他的所用子組件 app:this } }, data () { return { msg: ’這是測試數據’ } }, methods: { change(){ this.msg += 1; } }, components: { demo2 }}</script>

后代的子組件可以通過reject注入相應的依賴

子組件

<template> <div class='container'> <!-- 這個msg的值不會變 --> <div>{{msg}} </div> <!-- msg的值會變,因為依然指向父組件的vue實例 --> <div>{{app.$data.msg}}</div> <button @click='msgChange'>點一下</button> </div></template><script>export default { inject:[’msg’,’msgChange’,’app’]};</script>直接訪問組件實例的方式獲取數據

通過 ref 獲取組件實例

ref 屬性定義在組件上獲取的是組件的vue實例,定義在原生標簽上獲取的是對應的dom

需要等掛載之后才能拿到$refs中的內容

父組件

<template> <div class=’container’> {{msg}} <demo2 ref='test'/> </div></template><script>import demo2 from ’./demo2’export default { data () { return { msg: ’’ } }, // 需要等掛載之后才能拿到$refs中的內容。 // 所用不能在模板中使用 mounted(){ this.msg = this.$refs.test.msg }, components: { demo2 }}</script>

子組件

<script>export default { data(){ return { msg:’這是子組件的數據’ } }}</script>

通過$parent/$children 獲取組件實例

同樣的也是必須在mounted之后才能獲取對應實例

這里是父組件展示子組件中的msg,子組件展示父組件的msg

父組件通過$children獲取子組件實例

父組件

<template> <div class=’container’> {{msg}} <demo2/> </div></template><script>import demo2 from ’./demo2’export default { data () { return { msg: ’’, fatherMsg:'這是父組件的內容' } }, mounted(){ console.log(this.$children) //獲取子組件實例上的sonMsg,$children是個數組需要選擇對應的索引 this.msg = this.$children[0].sonMsg; }, components: { demo2 }}</script>

子組件通過$paren獲取父組件實例

子組件

<template> <div class=’container’> {{msg}} </div></template><script>export default { data () { return { msg:’’, sonMsg: ’這是子組件的數據’ } }, mounted(){ //獲取父組件的實例上的fatherMsg this.msg = this.$parent.fatherMsg; }}</script>定義一個公共倉庫共享數據

定義 eventBus 共享數據

在Vue原型上添加一個$bus為一個新的vue對象,可以在全局的vue實例中通過$bus獲取到這個vue對象,從而獲取這個對象上的屬性和方法。

在main.js中定義

Vue.prototype.$bus = new Vue({ data:{ a:1, b:2 }, methods:{ log(){ console.log(this.a) } }})

全局Vue實例都能獲取到定義在$bus上的屬性和方法

通過 Vuex 共享數據

官方給出的跨多組件傳遞數據的解決方案。

store index.js

import Vue from ’vue’import Vuex from ’vuex’Vue.use(Vuex)export default new Vuex.Store({ state: { test:’123123123’, test2:’123123123’, }, mutations: { changeTest(state,payload){ console.log(state,payload) state.test = payload.value }, changeTest2(state,payload){ console.log(state,payload) state.test2 = payload.value } }, actions: { asyncChageTest({commit},payload){ setTimeout( ()=>{ commit(’changeTest2’,payload) },2000) } }, modules: { }})

在組件中使用

<template> <div class=’container’> {{this.$store.state.test}} {{test}} {{this.$store.state.test2}} {{test2}} <button @click='change'>點一下</button> <button @click='asyncChange'>點一下</button> </div></template><script>// 引入mapState輔助函數改造state數據import { mapState,mapMutations,mapActions } from ’vuex’export default { data(){ return { msg:’這是測試數據’ } }, computed:{ ...mapState([’test’,’test2’]) }, methods:{ // 放異步或者同步的方法引入 ...mapMutations([’changeTest’]), ...mapActions([’asyncChageTest’]), change(){ // 同步修改state值的兩種方法 this.$store.commit(’changeTest’,{value:’改變后test的值’}); // this.changeTest({value:’改變后的值’}) }, asyncChange(){ // 異步修改state值的兩種方法 this.$store.dispatch(’asyncChageTest’,{value:’改變后test2的值’}) // this.asyncChageTest({value:’改變后test2的值’}) } },}</script>

以上就是對Vue中組件間數據傳遞的方式進行了一個總結,在日常的開發中還是需要根據使用的場景采取合適的方式進行數據的傳遞

到此這篇關于Vue組件間數據傳遞的方式(3種)的文章就介紹到這了,更多相關Vue組件間數據傳遞內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
主站蜘蛛池模板: 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 分轨 | 上传文件,即刻分离人声和伴奏 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 驾驶人在线_专业学车门户网站| Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器| MTK核心板|MTK开发板|MTK模块|4G核心板|4G模块|5G核心板|5G模块|安卓核心板|安卓模块|高通核心板-深圳市新移科技有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 工业雾炮机_超细雾炮_远程抑尘射雾器-世纪润德环保设备 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 兰州UPS电源,兰州山特UPS-兰州万胜商贸 | TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 |