一、Props传递数据

components

  |-Grandson1.vue //孙子1
  |-Grandson2.vue //孙子2
  |-Parent.vue //父亲
  |-Grandson1.vue //儿子1
  |-Grandson1.vue //儿子2

在父组件中使用儿子组件

<template>

  <div>
    父组件:{{money}}
    <Son1 :money="money"><Son1>
  </div>

</template>

<script>
  import Son1 from ''./Son1";
  export default{
    components:{

      Son1
    },

    data(){
      return { money: 100};
    }
  };
</script>
子组件接受数据

props:{
  value:{
    type:Number,

    default:1
  }
}

如果是数组

props:{
  value:{
    type:Array,

    default: ()=>[]
  }
}

二、$emit使用
子组件触发父组件方法,通过回调的方式将修改的内容传递给父组件

父组件

<template>

  <div>
    父组件:{{money}}
    <Son1 :money="money" @input="change"><Son1>
  </div>

</template>

<script>
  import Son1 from ''./Son1";
  export default{
    methods:{
     change(data){
       this.money = data
      } 
    },
    components:{
      Son1
    },

    data(){
      return { money: 100};
    }
  };
</script>

子组件触发绑定自己身上的方法

<template>

  <div>
    子组件1:{{money}}
    <button @click="$emit('input',200)">修改父组件的值<Son1>
  </div>

</template>

<script>
  export default{
    props:{
     money:{
       type:Number
     }
    }

  };
</script>

同步父子组件的数据=>语法糖的写法

.sync
<Son1 :money:sync="money"></Son1>
<--触发的事件名 update:(绑定.sync属性的名字)-->
<button @click="$emit('update:money',200)">更改</button>

v-model
<Son1 v-model="money"></Son1>

<template>

  <div>
    子组件1:{{value}}//触发的时间只能是input
    <button @click="$emit('input',200)">修改父组件的值<Son1>
  </div>

</template>

<script>
  export default{
    props:{
     value:{ //接收到的属性名只能叫value
       type:Number
     }
    }

  };
</script>

三、$parent、$children
多层级传递

<Grandson1 :value="value"></Grandson1>

<template>

  <div>
    孙子1:{{value}}
    <---调用父组件的input事件-->
    <button @click="$parent.$emit('input',200)">更改<Son1>
  </div>

</template>

<script>
  export default{
    props:{
     value:{ 
       type:Number
     }
    }

  };
</script>

如果层级很深就会出现$parent.$parent...这里封装一个$dispach方法进行向上派发
$dispatch
Vue.prototype.$dispatch = function $dispatch(eventName, data){
  let parent  = this.$parent;
  while (parent){
    parent.$emit(eventName,data){
      parent.$emit(eventName,data);
      parent = parent.$parent;
    }
  }
}
$broadcast 向下派发
Vue.prototype.$broadcast = function $broadcast(eventName, data){
  const broadcast  = function () {
    this.$children.forEach((child)=>{
      child.$emit(eventName, data);

      if(child.$children){
        $broadcast.call(child,eventName,data);
      }
    })
  }
  broadcast.call(this,eventName,data);
}

四、$attrs、 $listeners
$attrs批量向下传入属性
<Son2 name="小明" age="18"></Son2>
<--可以在son2组件中使用$attrs,可以将属性继续向下传递-->
<div>
  儿子2:{{  $attrs.name }}
  <Grandson2  v-bind="$attrs"></Grandson2>
</div>
<tempalte>
  <div>孙子:{{$attrs}}</div>
</template>

$listeners批量向下传入方法
<Son2 name="小明" age="18" @click=“()=>{this.money  =500}”></Son2>

<--可以在son2组件中使用$attrs,可以将属性继续向下传递-->

<Grandson2  v-bind="$attrs" v-on="$listeners"></Grandson2>

<button @click="$listeners.click()">更改<Son1>

五、Provide&Inject

Provide 在父级中注入数据
provide(){

  return {parentMsg:'父亲'};

}
Inject
在任意子组件中可以注入父级数据
inject:['parentMsg']//会将数据挂载在当前实例上

六 ref使用
获取组件实例
<Grandson2  name="花花" ref="grand2"></Grandson2>

mounted(){
  console.log(this.$refs.grand2.name);
}

七 EventBus

用于跨组件通知(简单项目)

Vue.prototype.$bus = new Vue();
Son2组件和Grandson1互相通信
mounted() {
  //父亲组件注册
  this.$bus.$on('my',data=>{

    console.log(data)
  })
}

mounted(){
  //侄子组件调用

  this.$nextTick(()=>{

    this.$bus.$emit('my',"我是小红”);
  })

}

八 vuex状态管理

vue组件通信方式(多种方案)的更多相关文章

  1. 整理4种Vue组件通信方式

    整理4种Vue组件通信方式 重点是梳理了前两个,父子组件通信和eventBus通信,我觉得Vue文档里的说明还是有一些简易,我自己第一遍是没看明白. 父子组件的通信 非父子组件的eventBus通信 ...

  2. Vue组件通信方式全面详解

    vue组件通信方式全面详解 众所周知,Vue主要思想就是组件化开发.因为,在实际的项目开发中,肯定会以组件的开发模式进行.形如页面和页面之间需要通信一样,Vue 组件和组件之间肯定也需要互通有无.共享 ...

  3. Vue组件通信方式(一)

    组件与组件的关系,通常有父子关系,兄弟关系以及隔代关系. 针对不同的场景,如何选用适合的通信方式呢? (一) props/$emit parentComponent ==> childCompo ...

  4. 最全的Vue组件通信方式总结

    1.一图认清组件关系名词 父子关系:A与B.A与C.B与D.C与E 兄弟关系:B与C 隔代关系:A与D.A与E 非直系亲属:D与E 总结为三大类: 父子组件之间通信 兄弟组件之间通信 跨级通信 2.8 ...

  5. Vue组件通信方式(8种)

    1.一图认清组件关系名词 父子关系:A与B.A与C.B与D.C与E 兄弟关系:B与C 隔代关系:A与D.A与E 非直系亲属:D与E 总结为三大类: 父子组件之间通信 兄弟组件之间通信 跨级通信 2.8 ...

  6. vue组件通信方式总结

    对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的各种方式的总结,总共有8种方式. 1. props和$emit 父组件向子组件传递数据是通过prop传递的,子组件传递数据给 ...

  7. 如果你也想写个完整的 Vue 组件项目

    1.一个完整的组件项目需要什么? 必要的: 组件构建方式 ( webpack / rollup 之类 ),并提供至少一个主流的输出格式 (ESModule) Demo 及 Demo 源码 文档,可以是 ...

  8. Vue组件间通信6种方式

    摘要: 总有一款合适的通信方式. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的 ...

  9. 解放生产力,自动化生成vue组件文档

    一.现状 Vue框架在前端开发中应用广泛,当一个多人开发的Vue项目经过长期维护之后往往会沉淀出很多的公共组件,这个时候经常会出现一个人 开发了一个组件而其他维护者或新接手的人却不知道这个组件是做什么 ...

随机推荐

  1. 53 容器(八)——TreeMap 红黑树

    红黑树是比较难以理解的一种数据结构.它能从10亿数据中进行10几次比较就能查找到需要的数据.效率非常高. 理解起内部结构也难. 现阶段我们知道有这种东西就行了. 参考文章: https://www.j ...

  2. STC单片机Flash做EEPROM的代码

    STC官方给出的建议: /***************************************************************Author:Liming*** * @brie ...

  3. lsyncd实时同步工具

    简介 Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实 ...

  4. Robot Arms AtCoder - 4432 (构造)

    大意: 给定平面上$n$个点$(x_i,y_i)$. 要求构造一个序列$d$, $d_i$表示每步走的距离, 再构造$n$个命令串, 要求从原点出发按照第$i$个命令走, 走完恰好到达$(x_i,y_ ...

  5. .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖

    原文:.NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖 我们有多种工具可以将程序集合并成为一个.比如 ILMerge.Mono.Merge.前者不可定制.运 ...

  6. selenium中的元素操作之下拉列表操作(四)

    下拉列表操作中分为两种:select.非select 1.非select的下拉框操作 非select下拉列表操作与网页元素操作一致,找到元素,定位元素,设置等待,点击元素等等 接下来操作百度的设置按钮 ...

  7. dump net core windbg 安装

    安装 1.下载工具windbg 地址:https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86?SilentAuth=1&rt ...

  8. 雪妖现世:给SAP Fiori Launchpad增添雪花纷飞的效果

    1995年7月,台湾大宇公司发布了一款国产单机角色扮演游戏神作:<仙剑奇侠传1>,所谓"一包烟,一杯茶",就能在电脑面前坐一整天. 这么经典的游戏Jerry当然已经通关 ...

  9. 图说jdk1.8新特性(3)--- 注解与类型推测优化

    获取同一类型多个注解 ​ jdk1.8的java.lang.Class类新增了方法getAnnotationsByType方法,该方法可以获取某一个类型的注解列表,具体代码示例如下: public c ...

  10. 为什么在定义hashcode时要使用31这个数呢?

    散列计算就是计算元素应该放在数组的哪个元素里.准确的说是放到哪个链表里面.按照Java的规则,如果你要想将一个对象放入HashMap中,你的对象的类必须提供hashcode方法,返回一个整数值. ht ...