Vue2组件通信方式

Vue2与Vue3组件间通信方式总结 我们都知道Vue作为一个轻量级的低门槛入门前端框架,其核心就是 组件化开发 。Vue就是由多个组件组建成的,组件化是它的精髓,更是它的强大之处。各组件实例之间是相互独立的,这也就意味着不同组件之间数据是无法相互共用。 但实际项目开发中,我们时常需要其他组件的数据,为此诞生了组件通信的问题。针对组件之前的关系:父子、兄弟、子孙的不同选用的数据传输方式也不一样,今天就来做个总结。 Vue2组件通信 父组件向子组件传值 Props 父组件以属性的方式传值给子组件 子组件... 阅读详情

Vue2组件通信方式包括如下几种方式

  • props、$emit(父传子props,子传父$emit)
  • $emit、$on(即EventBus传值,依赖全局Vue干线)
  • provide、inject(父组件通过provide提供参数,子孙组件通过inject注入参数)
  • $attrs、$listeners(创建高层次组件时使用,attrs包含了父组件中没有被props声明的参数,listeners包含了父组件中不含.native修饰器的事件监听器)
  • Vuex通信

1、父子传参(props和$emit)

父组件

//父组件
<template>
	<div class="main-panel">
        //子组件
		<banner-module :lang="test" @textFun="textFun" />
		<ensure-module :lang="test" />
	</div>
</template>

<script>
//引入子组件
import bannerModule  from './tabs/banner/index.vue'						
import ensureModule from './tabs/ensure/index.vue'						
export default {
    data () {
        return {
            test: 1    
        }
    },
    //声明子组件
    components :{
		bannerModule,
		ensureModule
	},
    methods:{
        textFun(val){
            console.log(val)
        }
    }    
}
</script>

<style>
	
</style>

子组件不可直接改变父组件的值,需要定义新的变量接受父组件的传递值,将新值使用$emit返回给父组件

<template>
	<div class="product-banner">
		<div class="product-notice">
			<p>{{num}}</p>
		</div>
        <van-button @click="addtest">新增</van-button>
	</div>
</template>

<script>
export default {
    //props接受
	props :{
		lang : {
			type : Number,
			default : 1
		}
	},
    data(){
        return{
            num: this.lang
        }
    },
    methods: {
        addtest(){
            //不可以直接改变父组件的值,需要定义新的变量
            this.num ++
            //通知父组件接受新值
            this.$emit("textFun", this.num)
        }
    }
}
</script>
<style scoped>
</style>

2、$emit和$on(全局组件通信)

利用Vue实例作为中央事件总线,来触发和监听事件。实现父子、兄弟、跨级之间的通信

//A组件
<template>
	<div class="main-panel">
        {{test}}
        <div @click="sendBData">发送</div>
	</div>
</template>

<script>
import eventBus from './utils/bus.js'					
export default {
    data () {
        return {
            test: 1    
        }
    },
    methods:{
        sendBData(){
            this.test ++ 
            //发送receiptData方法到全局Vue
            eventBus.$emit("receiptData", this.test)
        }
    }    
}
</script>
//B组件
<template>
	<div class="main-panel">
        {{number}}
	</div>
</template>

<script>
import eventBus from './utils/bus.js'					
export default {
    data () {
        return {
            number: 0  
        }
    },
    created(){
        //监听receiptData方法
        eventBus.$on("receiptData", (val)=>{
            this.number = val
        })
    },
    methods:{
    }    
}
</script>

bus.js 

import Vue from "vue"
var eventBus  =  new Vue()
export default eventBus

3、provide、inject

provide是一个对象,或者是一个返回对象的函数;inject 是一个字符串数组,或者是一个对象

provide和inject绑定不是响应的,所以A组件中值改变,B组件中是不会改变的。

//A组件
<template>
	<div class="main-panel">
        {{text}}
        <p @click="changeText">修改</p>
	</div>
</template>

<script>				
export default {
    provide() {
       return: {
           name: "A组件", //无法修改
           app: this,
           test: this.text
       }     
    },
    data () {
        return {
            text: 1,
            name: 'A',    
        }
    },
    methods: {
        changeText(){
            this.text++  //修改后B组件视图不更新
            this.name = 'C' //修改后B组件视图会更新
        }
    }    
}
</script>
//B组件
<template>
	<div class="main-panel">
        <p>组件A的名称:{{app.name}}</p>
        <p>组件A的text:{{text}},组件B的text:{{num}}</p>
	</div>
</template>

<script>
import eventBus from './utils/bus.js'					
export default {
    inject: ['name', 'app', 'text'],
    data () {
        return {
            num: 1    
        }
    }    
}
</script>

4、$attrs、$listeners

A组件向B(子组件)使用props传递了message参数,C组件是B组件的子组件,这时候如果A向C传递参数的话就用到$attrs 监听C返回的变化就用到了listeners

//A组件
<template>
	<div class="main-panel">
      <B :message="message" @getCData="getCData" @getBData="getBData"></B>
	</div>
</template>

<script>
import B from '...B.vue'				
export default {
    data () {
        return {
            message:'hello',
            messageC:'hello C',
        }
    },
    components: {
        B
    },
    methods:{
        getCData(val){
            console.log("这是C的参数",val)
        },
        getBData(val){
            console.log("这是B的参数",val)
        }
    }    
}
</script>

C组件可以直接触发getCData在于B在调用C的时候使用v-on绑定了$listeners属性
通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的)

上面这句话的意思是:如果我们在给B传递数据时,多传递一个名字叫做messageB的参数,但是在B组件中没有去接受messageB参数,那么在C组件中也可以访问到messageB,而message是访问不到的

//B组件
<template>
	<div class="main-panel">
      <p>A组件传给B组件的参数: {{message}}</p>
      <button @click="sendBData">和A交互</button>
      <C v-bind="$attrs" v-on="$listeners"></C>
	</div>
</template>

<script>
import C from '...C.vue'				
export default {
    props: {
        messsage: {
            type: String,
            default: ''
        } 
    },
    data () {
        return {
            b: 1
        }
    },
    components: {
        C
    },
    methods:{
        sendBData(){
            this.$emit("getBData", this.b++)
        }
    }    
}
</script>
//C组件
<template>
	<div class="main-panel">
      <p>A组件传给C组件的参数: {{$attrs.messageC}}</p>
      <button @click="sendCData">和A交互</button>
	</div>
</template>

<script>			
export default {
    data () {
        return {
            c: '我是C组件'
        }
    },
    components: {
        C
    },
    methods:{
        sendCData(){
            this.$emit("getCData", this.c)
        }
    }    
}
</script>

5、Vuex

Vuex是专为 Vue.js 应用程序开发的状态管理模式,收集管理应用的所有组件状态。解决了多个视图依赖同一状态和来自不同视图的行为更改同一个状态的问题。

Vuex包含5大模块(state,getters,mutations,actions,modules),后边会有介绍Vuex的文章。

Vuex通信类似于EventBus。

创建store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {  //声明state状态树
   message: {
      title: '',
      content: '',
    },
   messageB: ''
  },
  mutations: {    //mutation中提交需要改变的方法
    sendMessage(state, obj) {
      state.message = {
        title: obj.title,
        content: obj.content,
      }
    },
    sendBMessage(state, val){
        state.messageB = val.BMsg
    }
  }
})

在组件A中获取Vuex的数据,同理可在B组件中获取。如果通过A要改变B的数据可通过单独提供给B的方法修改

//A组件
<template>
	<div class="main-panel">
      <p>获取到的title:{{title}},获取到的content:{{content}}
      <div @click="sendB">点击发送</div>
      <B />
	</div>
</template>

<script>
import B from '...B.vue'				
export default {
    data () {
        return {
            bMessage: '我是B组件'
        }
    },
    components: {
        B
    },
    computed:{
        title(){
            return this.$store.state.message.title
        },
        content(){
            return this.$store.state.message.content
        }
    },
    methods: {
        sendB(){
            // 触发sendBMessage,将B组件的数据存放到store里去
            this.$store.commit('sendBMessage', {
              BMsg: this.bMessage
            })
        }
    }   
}
</script>
卡诺图化简法注意事项+竞争冒险知识点总结 今天反思以下卡诺图化简法中的注意事项。 卡诺图看起来简单,但如果不熟悉的话很容易出错,因此要对画圈的规则比较熟悉。 阅读详情

相关推荐

23.501中英对照(46):5QI到Qos特征的映射

注4:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为1毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注5:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为2毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注6:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为5毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注:建议为任何新的非GBR资源类型的标准化5QI分配小于64的值。

51学通信的博客 1294

Vue2 组件通信 ( 12种 )

Vue2全部组件间通信方式

qq_57491020的博客 6476

BUCK 电路详解

参考内容: 手撕Buck!Buck公式推导过程 电力电子的基础应用 《精通开关电源设计(第二版)》 Buck电源芯片输出有问题?检查这几样 原来PWM这么简单! BUCK 电路构建 根据高中所学习的物理知识可以很容易的想到,使用一个滑动变阻器即可实现降压和稳压的效果。当负载波动时,通过改变滑动变阻器的阻值,可以调节负载所获得的电压。但是使用滑动变阻器的劣势也很明显,大量的耗能会导致器件温度快速升高。 上面所提到的电路主要缺点在于导通器件(变阻器或三极管)本身存在耗能,那么有没有不会耗能的导通器件呢?

Guanngxu的博客 3985

Vue2中10种组件通信方式和实践技巧

Vue2中10种组件通信方式和实践技巧

qq_40147756的博客 2072

开关电源的纹波和噪声电压-抑制方法

开关电源(包括AC/DC转换器、DC/DC转换器、AC/DC模块和DC/DC模块)与线性电源相比较,最突出的优点是转换效率高,一般可达80%~85%,高的可达90%~97%;其次,开关电源采用高频变压器替代了笨重的工频变压器,不仅重量减轻,体积也减小了,因此应用范围越来越广。 但开关电源的缺点是由于其开关管工作于高频开关状态,输出的纹波和噪声电压较大,一般为输出电压的1%左右(低的为输出电压的0.5%左右),最好产品的纹波和噪声电压也有几十mV;而线性电源的调整管工作于线性状态,无纹波电压,输出的噪声电压也

ltqdxl的博客 1万+

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(上)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2778

Vue2基础六、组件通信

- 组件通信, 就是指 `组件与组件` 之间的`数据传递`。 - 组件的数据是独立的,无法直接访问其他组件的数据。 - 想使用其他组件的数据,就需要组件通信

李宥的博客 1443

基于 MFC 和 C++ 的语音识别客户端实现方案

语音 SDK:[Microsoft Speech SDK](https://learn.microsoft.com/zh-cn/azure/cognitive-services/speech-service/speech-sdk)(建议使用最新版)1. **Azure 语音服务密钥**:需要在 [Azure 门户](https://portal.azure.com/) 中创建语音资源,获取密钥和区域(如 `eastasia`),替换代码中的占位符。

寒寒豆豆软件公司的博客 151

Vue2组件通信专题

props 适用于的场景:父子组件通信 注意事项: 如果父组件给子组件传递数据(函数):本质其实是子组件给父组件传递数据。 如果父组件给子组件传递数据(非函数):本质就是父组件给子组件传递数据。

weixin_43599321的博客 1311

【TIDB】TiDB认证考试PTCA 练习题 题库

TiDB认证考试PTCA 练习题 题库

DBA之路的博客 4718

SAP FI 会计科目表(COA)可直接套用配置模板

摘要:本文提供了SAP S/4HANA环境下可直接套用的会计科目表(COA)配置模板,包含科目编码规则、号段规划、科目组设置等核心内容。模板采用10位数字编码,按资产(1000)、负债(2000)、权益(3000)、成本(4000)、收入(5000)、费用(6000)六大类划分号段,并预设科目组控制字段状态。适用于集团/单一公司、国内/跨国企业场景,支持多表架构映射,配置完成后可通过事务码SAKO验证科目清单。模板遵循"前4位固定一级科目"原则,企业可根据行业特性调整明细科目。

金牌架构师 266

Vue2组件通信方式大全:8种方法助你打通组件间数据流

组件通信是Vue开发的核心能力。本文系统梳理Vue2中8大组件通信方式,从基础到进阶,帮你彻底解决“组件间如何传值”的问题。

2301_81137804的博客 951

【Android Performance】Android CPU调度模式详解:从performance到schedutil的Governor调优指南

本文系统讲解Android/Linux系统中的CPU频率调节策略(Governor),涵盖六大调度模式的底层工作原理:performance(性能优先)、powersave(省电优先)、conservative(保守调频)、ondemand(按需调频)、userspace(手动控制)以及schedutil(调度器驱动)。文中深入拆解每种Governor的调频决策逻辑、上升/下降曲线的差异、适用场景与选型建议,并配以实操命令演示如何查看可用Governor列表、动态切换调度模式以及多Cluster架构下的统一

weixin_44081096的博客 430

Vue2、Vue3的组件通信方式

本文主要介绍Vue2和Vue3几种常用的组件通信方式以及具体使用案例

weixin_45946310的博客 1388

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Vue2】组件通信方式有哪些?

详细介绍了vue2中组件之间的通信方式

欢迎指出不足之处 1430

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

vue常用组件通信方式及vue2和vue3写法对比

本文结合vue2和vue3写法对比,总结了vue中组件通信常用的几种方式。父子组件:props / $emit、 ref / $parent隔代组件:provide / inject、eventBus、Vuex / Pinia兄弟组件:eventBus、Vuex / Pinia写作不易,你的一赞一评,就是我前行的最大动力。如有问题,欢迎指出!

~~~ 2866

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Vue3与Vue2的组件通信方式对比:8种 vs 12种

希望可以帮助小伙伴们更好理解,如有不对的或者遗漏的,欢迎指正,你的一赞一评都是我前行最大的动力,感谢!

m0_67212141的博客 1142

Vue2 vs Vue3组件通信方式全景对比指南

本文全面对比了Vue2与Vue3在组件通信方式上的主要差异。同时还介绍了Event Bus的替代方案和Pinia状态管理的优势。

x15514104477的博客 1131

在Vue2中,组件间通信主要的几种方式

子组件: 跨多层级组件通 兄弟组件通信(事件总线)2.子父组件通信( 和 )事件总线是一种简单的发布-订阅模式,它允许你在组件间发送和接收事件。你可以在一个文件中创建一个 Vue 实例,并将其作为事件总线,在所有需要通信的组件中导入并使用它。先创建一个js文件 “EventBus.js”内容如下 在需要通信的地方导入EventBus.js文件第二种方式 挂载到Vue原型上 下面是具体使用方式 1. ComponentA.vue 2. ComponentB.vue 在Vue.js中,使

m0_53992752的博客 1706

Vue2中组件的通信方式总结

发送消息给父组件methods: {')</script>-- 父组件 --><template><script>methods: {

MayByUP的博客 564

vue2中组件通信的12种方式

vue2中提供了多种组件通信方式,以满足不同场景下的开发需求,本文对12种通信方式进行了总结

qq_74114417的博客 2404

vue2组件通信的几种方式

vue2 组件之前通信

jianwei的博客 523

Vue——vue2和vue3的一些区别以及组件通信方式

通信方向Vue2 方法Vue3 方法说明父 → 子propsprops属性传递子 → 父$emitemit事件触发兄弟Vue3 不再推荐 EventBus跨层级Vue3 提供响应式版本全局VuexPiniaPinia 更轻量简洁特殊场景ref + $refs 调用父直接调用子函数。

weixin_44547668的博客 869

大白话Vue2和Vue3 组件通信,方式有哪些,都有什么区别?

创建一个事件总线对象,组件可以通过它来触发事件和监听事件,从而实现非父子组件之间的通信。咱们来聊聊 Vue2 和 Vue3 里组件通信的事儿,组件通信就像是不同部门之间传递消息,让各个组件能协同工作。Vue3 除了可以继续用 Vuex,还推荐使用 Pinia,Pinia 更符合现代 JavaScript 的特性,代码更简洁,使用起来也更方便。触发一个自定义事件,父组件监听这个事件,当事件触发时,子组件可以把数据传递给父组件。把数据传递给子组件。父组件在使用子组件的标签上,用自定义属性来传递数据,子组件在。

前端大白话 482

Vue2与Vue3组件通信方式总结

我们都知道Vue作为一个轻量级的低门槛入门前端框架,其核心就是 组件化开发 。Vue就是由多个组件组建成的,组件化是它的精髓,更是它的强大之处。各组件实例之间是相互独立的,这也就意味着不同组件之间数据是无法相互共用。 但实际项目开发中,我们时常需要其他组件的数据,为此诞生了组件通信的问题。针对组件之前的关系:父子、兄弟、子孙的不同选用的数据传输方式也不一样,今天就来做个总结。 Vue2组件通信 父组件向子组件传值 props 父组件以属性的方式传值给子组件子组件通过props方式接收数据 在父组件中引

Smell_rookie的博客 1090

vue2组件通信和vue3组件通信的方式

使用场景:[子给父传递数据]儿子$emit----> 父亲$on[简写@]父亲中的两种写法:[简单写法|复杂写法]mounted(){自定义事件子向父传递数据事件类型 回调函数 谁调用 默认传递的是什么?1、事件类型 无数个2、回调函数 自己去定义的3、谁调用 自己去调用自己使用$emit触发调用的4、默认传递的是什么?默认传递的是自己给的参数有就有,没有就没有 (undefined)

flower886的博客 252
上一篇: Vue2 和 Vue3的区别
下一篇: vue+mint-ui 组件实现省市县三级联动功能
逩跑鍀小学生
博客等级 码龄5年 37粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值