vue 中的多种组之间通讯方式

Vue3 10多种组件通讯方法 本文简介 点赞 + 关注 + 收藏 = 学会了 本文讲解 Vue 3.2 组件多种通讯方式的基础用法,并且使用了 单文件组件 <script setup> 。 众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。 本文适合: 有 Vue 3 基础的读者。 打算开发组件库的读者。 本文会涉及的知识点: Props emits expose / ref Non-Props v-model 插槽 slot provide 阅读详情

通过我近期面试的100多人中发现前三种使用的比较多 会vue的人基本都了解使用原理 后面几种可能适用性不会那么高 不过特定的问题解决起来也是很方便的

1. 大家使用做多肯定是父子组件间的通讯了 props和$emit

Vue.component('child',{
        data(){
            return {
                mymessage:this.message
            }
        },
        template:`
            <div>
                <input type="text" v-model="mymessage" @input="passData(mymessage)"> </div>
        `,
        props:['message'],//得到父组件传递过来的数据
        methods:{
            passData(val){
                //触发父组件中的事件
                this.$emit('getChildData',val)
            }
        }
    })
    Vue.component('parent',{
        template:`
            <div>
                <p>this is parent compoent!</p>
                <child :message="message" v-on:getChildData="getChildData"></child>
            </div>
        `,
        data(){
            return {
                message:'hello'
            }
        },
        methods:{
            //执行子组件触发的事件
            getChildData(val){
                console.log(val)
            }
        }
    })
    var app=new Vue({
        el:'#app',
        template:`
            <div>
                <parent></parent>
            </div>
        `
    })

这个大家肯定都会了 就不在详细描述,如果又不懂的小伙伴可以去 VUE官网了解
https://cn.vuejs.org/v2/guide/

2. 中央事件总线

一般处理兄弟组件的传值,或者没有关联的组件。
新建一个Vue事件bus对象,然后通过bus. e m i t 触 发 事 件 , b u s . emit触发事件,bus. emit触发事件,bus.on监听触发的事件。

Vue.component('brother1',{
    data(){
      return {
        mymessage:'hello brother1'
      }
    },
    template:`
      <div>
        <p>this is brother1 compoent!</p>
        <input type="text" v-model="mymessage" @input="passData(mymessage)">
      </div>
    `,
    methods:{
      passData(val){
        //触发全局事件globalEvent
        bus.$emit('globalEvent',val)
      }
    }
  })
  Vue.component('brother2',{
    template:`
      <div>
        <p>this is brother2 compoent!</p>
        <p>brother1传递过来的数据:{{brothermessage}}</p>
      </div>
    `,
    data(){
      return {
        mymessage:'hello brother2',
        brothermessage:''
      }
    },
    mounted(){
      //绑定全局事件globalEvent
      bus.$on('globalEvent',(val)=>{
        this.brothermessage=val;
      })
    }
  })
  //中央事件总线
  var bus=new Vue();
  var app=new Vue({
    el:'#app',
    template:`
      <div>
        <brother1></brother1>
        <brother2></brother2>
      </div>
    `
  })

3. vuex

什么时候要用vuex呢?
项目中出现过多的非父子组件状态管理问题 状态混乱 需要集中管控时。
一张图就够了其实
在这里插入图片描述
需要详细了解的可以借步 https://vuex.vuejs.org/zh/guide/

4. $attrs和$listeners 爷爷组件和孙子组件传值

Vue 2.4开始提供了 a t t r s 和 attrs和 attrs和listeners来解决爷爷组件和孙子组件传值问题

Vue.component('C',{
    template:`
      <div>
        <input type="text" v-model="$attrs.messagec" @input="passCData($attrs.messagec)"> </div>
    `,
    methods:{
      passCData(val){
        //触发父组件A中的事件
        this.$emit('getCData',val)
      }
    }
  })//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力
  Vue.component('B',{
    data(){
      return {
        mymessage:this.message
      }
    },
    template:`
      <div>
        <input type="text" v-model="mymessage" @input="passData(mymessage)">
        <!-- C组件中能直接触发getCData的原因在于 B组件调用C组件时 使用 v-on 绑定了$listeners 属性 -->
        <!-- 通过v-bind 绑定$attrs属性,C组件可以直接获取到A组件中传递下来的props(除了B组件中props声明的) -->
        <C v-bind="$attrs" v-on="$listeners"></C>
      </div>
    `,
    props:['message'],//得到父组件传递过来的数据
    methods:{
      passData(val){
        //触发父组件中的事件
        this.$emit('getChildData',val)
      }
    }
  })
  Vue.component('A',{
    template:`
      <div>
        <p>this is parent compoent!</p>
        <B :messagec="messagec" :message="message" v-on:getCData="getCData" v-on:getChildData="getChildData(message)"></B>
      </div>
    `,//在此我向大家推荐一个前端全栈开发交流圈:619586920 突破技术瓶颈,提升思维能力
    data(){
      return {
        message:'hello',
        messagec:'hello c' //传递给c组件的数据
      }
    },
    methods:{
      getChildData(val){
        console.log('这是来自B组件的数据')
      },
      //执行C子组件触发的事件
      getCData(val){
        console.log("这是来自C组件的数据:"+val)
      }
    }
  })
  var app=new Vue({
    el:'#app',
    template:`
      <div>
        <A></A>
      </div>
    `
  })

5. provide和inject

父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量。不论子组件有多深,只要调用了inject那么就可以注入provider中的数据。而不是局限于只能从当前父组件的prop属性来获取数据,只要在父组件的生命周期内,子组件都可以调用。

Vue.component('child',{
    inject:['for'],//得到父组件传递过来的数据
    data(){
      return {
        mymessage:this.for
      }
    },
    template:`
      <div>
        <input type="tet" v-model="mymessage">
      </div>
  })
  Vue.component('parent',{
    template:`
      <div>
        <p>this is parent compoent!</p>
        <child></child>
      </div>
    `,
    provide:{
      for:'test'
    },
    data(){
      return {
        message:'hello'
      }
    }
  })
  var app=new Vue({
    el:'#app',
    template:`
      <div>
        <parent></parent>
      </div>
    `
  })

6. v-model

父组件通过v-model传递值给子组件时,会自动传递一个value的prop属性,在子组件中通过this.$emit(‘input’,val)自动修改v-model绑定的值

Vue.component('child',{
    props:{
      value:String, //v-model会自动传递一个字段为value的prop属性
    },
    data(){
      return {
        mymessage:this.value
      }
    },
    methods:{
      changeValue(){
        this.$emit('input',this.mymessage);//通过如此调用可以改变父组件上v-model绑定的值
      }
    },
    template:`
      <div>
        <input type="text" v-model="mymessage" @change="changeValue">
      </div>
  })
  Vue.component('parent',{
    template:`
      <div>
        <p>this is parent compoent!</p>
        <p>{{message}}</p>
        <child v-model="message"></child>
      </div>
    `,
    data(){
      return {
        message:'hello'
      }
    }
  })
  var app=new Vue({
    el:'#app',
    template:`
      <div>
        <parent></parent>
      </div>
    `
  })

7. $parent和$children

在组件内部可以直接通过子组件 p a r e n t 对 父 组 件 进 行 操 作 , 父 组 件 通 过 parent对父组件进行操作,父组件通过 parent对父组件进行操作,父组件通过children对子组件进行操作.

Vue.component('child',{
    props:{
      value:String, //v-model会自动传递一个字段为value的prop属性
    },
    data(){
      return {
        mymessage:this.value
      }
    },
    methods:{
      changeValue(){
        this.$parent.message = this.mymessage;//通过如此调用可以改变父组件的值
      }
    },
    template:`
      <div>
        <input type="text" v-model="mymessage" @change="changeValue">
      </div>
  })
  Vue.component('parent',{
    template:`
      <div>
        <p>this is parent compoent!</p>
        <button @click="changeChildValue">test</button >
        <child></child>
      </div>
    `,
    methods:{
      changeChildValue(){
        this.$children[0].mymessage = 'hello';
      }
    },
    data(){
      return {
        message:'hello'
      }
    }
  })
  var app=new Vue({
    el:'#app',
    template:`
      <div>
        <parent></parent>
      </div>
    `
  })

8. boradcast和dispatch(高版本vue已被弃用)

vue1.0中提供了这种方式,但vue2.0中没有,但很多开源软件都自己封装了这种方式,比如min ui、element ui和iview等。
比如如下代码,一般都作为一个mixins去使用, broadcast是向特定的父组件,触发事件,dispatch是向特定的子组件触发事件,本质上这种方式还是on和on和emit的封装,但在一些基础组件中却很实用

function broadcast(componentName, eventName, params) {
 this.$children.forEach(child => {
  var name = child.$options.componentName;
  if (name === componentName) {
   child.$emit.apply(child, [eventName].concat(params));
  } else {
   broadcast.apply(child, [componentName, eventName].concat(params));
  }
 });
}
export default {
 methods: {
  dispatch(componentName, eventName, params) {
   var parent = this.$parent;
   var name = parent.$options.componentName;
   while (parent && (!name || name !== componentName)) {
    parent = parent.$parent;
    if (parent) {
     name = parent.$options.componentName;
    }
   }
   if (parent) {
    parent.$emit.apply(parent, [eventName].concat(params));
   }
  },
  broadcast(componentName, eventName, params) {
   broadcast.call(this, componentName, eventName, params);
  }
 }
};
利用腾讯云轻量服务器快速搭建网站CDN 腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚 阅读详情

相关推荐

UE4-(蓝图)第五十五课图片九宫格拉伸的使用

一、为什么使用九宫格拉伸 在UI布局的时候,有时候使用的图片与我们要制作的UI大小有差距,如果图片是普通方式直接拉伸很可能造成图片四个角上的效果与原图片差距太大甚至是变形,这时候使用九宫格模式拉伸,可以保持图片四个角上的样式不发生改变,只对中间区域拉伸。 原始 正常拉伸: 九宫格拉伸: 二、图片参数设置 1.新建一个UI 控件蓝图,在CanvasPanel下拖入一个Image,选择一张...

Stone的博客 7890

vue手写多对多关联图,连线用leader-line

【代码】vue手写多对多关联图,连线用leader-line。

weixin_51263829的博客 2349

ROBOGUIDE教程:FANUC机器人X型焊枪气动点焊焊接

FANUC机器人X型焊枪气动点焊焊接虚拟仿真实现方法。

IndRobSim 4387

vue $listeners用法记录

有了这个$listenersproperty,你就可以配合v-on="$listeners"将所有的事件监听器指向这个组件的某个特定的子元素。下面直接上代码,$listeners就是多级子组件emit传递偷懒写法(还有一个attr) <template> <div>这是子组件1-1</div> </template> <script> export default { mounted: function(...

Shape 1万+

开发基于GDL235KBQ6开发板的IAP升级程序(HEX协议+串口空闲中断 + DMA接收数据)

使用GDL235kB开发板,实现串口iap升级程序的bootloader代码编写,app为led灯闪烁,并完成通信c代码

zhaozijuncc的博客 647

将AD域服务从windows server 2008 R2 迁移到windows server 2019

添加一台windows 2019 的服务器并加入现有林的域中,并将角色升级为域控制器。然后迁移FSMO角色,使其成为PDC,然后降级旧DC,并提升域和林的功能级别。最后还要说下,Server 2008 R2我们还可以删除角色并退出当前域,这里就不做操作了。2)右键 mingling.com(我的域为mingling.com)--提升域级别功能。勾选 将域控制器添加到现有域,使用域管理员将DC2加入到现有的AD域。1)打开服务器管理器---工具---AD域和信任关系。2)运行域安装服务向导,选择下一步。

lionxam的博客 3662

关于 vue2.x 的 $attrs 和 $listeners

Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475 $attrs $attrs 用于多层次组件传递参数(组件标签的attribute,class和style除外),爷爷辈组件向孙子辈组件传递参数(注:参数不能被父辈prop识别,一旦被父辈prop识别且获取,则孙子辈组件不能获取到该参数) 写法如下:(注:v-bind不能用简写

虚幻私塾 1711

Mysql授权允许远程访问

前言 Mysql授权允许远程登录后,linux中安装的mysql可以与Navicat for Mysql(可视化)等连接,在可视化软件下管理数据库。 注意:不能使用临时密码 设置密码命令: alter user 'root'@'localhost' identified by '这里是你的密码'; 授权允许远程访问 一、授权命令: grant all privileges on *.* to '...

🏆 前端领域优质创作者 3万+

Vue组件通信-$attrs与$listeners概念与应用

一、$attrs与$listeners是什么$attrs与$listeners都是是属于组件实例自身的一个属性:包含了父作用域中不包含在props中的属性,这些属性可以在组件内部使用,也可以通过v-bind="$attrs"传递给子组件使用。:包含了父作用域中的(不含.sync修饰器的)v-on事件监听器,这些监听器可以在组件内部使用,也可以通过v-on="$listeners"传递给子组件使用。

weixin_71403100的博客 6782

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

视觉人机器视觉的博客 2646

基于STM32设计的校园智慧路灯系统(华为云IOT)(212)

当前设计并研发了基于STM32的智慧路灯系统,本系统的目的是打造一个高效节能、智能化管理的校园照明环境。通过集成STM32F103RCT6高性能微控制器为核心,结合多种传感器模块如BH1750光敏传感器、热释电人体感应模块以及中科微电子GPS模块等,实现了对校园路灯的精准控制与实时监控。

5139

Vue--$attrs, $listeners--使用/教程/实例

​ 说明 本文用示例介绍Vue的$attrs和$listener的用法 官网 API — Vue.js $attrs 和 $listeners介绍 Vue2.4 中,引入了attrs 和 listeners , 新增了 inheritAttrs 选项。 $attrs:包含了父作用域中没有被 prop 接收的所有属性(不包含class 和 style 属性)。可以通过 v-bind="$attrs" 直接将这些属性传入内部组件。 $

IT利刃出鞘的博客 3540

基于互联网的智能旧衣回收箱设计与实现

本文介绍了基于嵌入式系统的智能旧衣回收箱的设计与实现,涵盖了硬件设计、软件开发、图像识别、物联网连接等方面的内容。通过利用最新的技术,如图像识别、物联网和云计算,实现了智能、便捷的旧衣物回收系统。未来,随着技术的不断进步,智能回收系统将会在环保领域发挥更大的作用。

2201_76125393的博客 908

Vue:Vue的路由,组件通讯、传值的多种方式

Vue里面的所有通信方式(组件,动态路由等等)

lyj15390447067的博客 2493

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Vue组件之间的通讯方式

目录Vue组件之间的通讯方式父子通讯子父通讯兄弟通讯 Vue组件之间的通讯方式 父子通讯 子父通讯 兄弟通讯

youhebuke225的博客 462

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

vue中组件之间通讯的13种方式

vue中组件之间通讯的13种方式

v610379640的博客 1050

vue组件之间的多种通讯方式

一、父组件传递参数给子组件 1、父组件传递参数 <template> <div> <Son1 :name="name" :age="20" :bookList="['三国演义', '西游记']" :details="{'name': '张三', address: '广东深圳'}" :isAct...

水痕 433

超详细的vue组件之间通讯的8种方式

想要深入了解 vue 组件之间的通讯,这一篇文章足矣,里面详细讲解了组织之间通讯的8种方式,一篇文章即可掌握组件通讯。

weixin_70134200的博客 7092

vue组件之间如何通信?vue通信的多种方式

vue组件之间如何通信?vue通信的多种方式前言:一、vuex状态管理模式其数据流向如下:使用:二、EventBus使用:eventBusOne组件引入:eventBusTwo组件监听:效果如下:三、使用最多之 props与$emit使用 propsOne(父组件)使用 propsTwo(子组件)效果如下:四、$refs 、$parent、$children其他总结: 前言: 写在前面: vu...

王一诺Eno 585

[vuejs] 在vuejs中使用websocket进行实时通讯

在vuejs框架中使用websocket , 可以比较方便的运用到vuejs框架的响应式系统 , 以及一些简单的生命周期函数 var app=new Vue({ el: '#app', data: { server:"ws://127.0.0.1:8080/chat_server", socket:...

程序员老狼专注开发aigc或客服系统应用 1515

vue组件和组件之间的通讯

vue组件和组件之间的通讯组件简介全局组件局部组件动态组件异步组件组件之间通讯 组件简介 组件系统是vue的一个重要的概念,它允许我们使用小型、独立和通常可复用的组件构建大型应用。 创建组件的两种方式:1、全局组件 2、局部组件 1、全局组件通常使用 Vue.component(tagName,{option})的格式注册; 2、局部组件在实例中的components中注册; 注意: 1、要确...

cedricdx的博客 943

vue组件通讯的几种方式(全面)

组件通讯的几种方式(全面总结)1 组件通讯的意义是什么?1.1 vue框架开发的基本原理(了解)1.2 组件通讯的意义?2 组件通讯类型和各自实现原理?(传统型)2.1 常见的组件通讯类型2.2 父组件到子组件(父传子)2.3 子组件到父组件(子传父$emit和events方法)2.4 父子组件,兄弟组件,隔代组件(中央事件处理总线bus和bus和bus和on)3 组件通讯的方式(VueX插件型) 1 组件通讯的意义是什么? 1.1 vue框架开发的基本原理(了解) ①数据驱动视图 ②自底层向上增量开发

aurora 1641

Vue3 过10种组件通讯方式

本文简介 点赞 + 关注 + 收藏 = 学会了 本文讲解 Vue 3.2 组件多种通讯方式的基础用法,并且使用了 单文件组件 <script setup> 。 众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。 本文适合: 有 Vue 3 基础的读者。 打算开发组件库的读者。 本文会涉及的知识点: Props em...

weixin_39415598的博客 1127

vue3组件之间通讯

当父组件向子组件传递数据,在子组件中并未声明使用则数据会暂存到组件$attrs中,此时子组件可以通过v-bind="$attrs",将这些暂存数据传递给孙组件中。插槽分为:默认插槽,具名插槽,作用域插槽(父组件插槽内容使用子组件数据)父组件通过provide传递数据,后代组件通过inject接收数据。组件通过defineExpose对外暴露要传递的数据,1. props,实现父组件向子组件通讯。2. emit,实现子组件向父组件通讯。3.mitt,实现任意组件之间通讯。

m0_58889179的博客 2441

Vue组件之间的通讯方式——父传子、子传父、兄弟组件间的通讯

目录 一、父传子 1、props 属性传递 2、方法传递 3、 $parent获取方法和属性 二、子传父 1、 属性传递 2 、通过$refs主动获取子组件方法和属性 3 、通过$children主动获取子组件方法和属性 三、兄弟间的通讯 1 、通过共同的父亲进行传递信息 2、全局事件总线—EventBus 3、 通过PubSub通讯 4 、通过Vuex通讯 组件之间传值通讯分为三种: 父传子、子传父、兄弟组件之间的通讯; 前提 这里我们使用了vue/cli4使用默认配.

王春燕的博客 2535

Vue3组件通讯方式详解

在网上看教程时,各种五花八门的组件通讯看的人头皮发麻,其中不乏按钮点击触发事件,修改父组件或子组件的值,使本来混沌的大脑更加懵逼。本篇讲解特点就是简单!简单!简单!不搞花里胡哨的例子,只有简化到极致的案例。

xiaolouuuu的博客 1122
上一篇: 状态码301和302区别
下一篇: 前端初学electron
wen_binObject
博客等级 码龄10年 51粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值