一、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. c++中共享内存原理及实现

    共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , ...

  2. Spark学习(2) RDD编程

    什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.弹性.里面的元素可并行计算的集合 RDD允 ...

  3. php中让数组顺序随机化,打乱顺序等

    php中有很多排序的函数,sort,rsort,ksort,krsort,asort,arsort,natcasesort,这些函数用来对数组的键或值进行这样,或那样的排序. 可以终究有时候还需要一些 ...

  4. 应用中有多个Spring Property PlaceHolder导致@Value只能获取到默认值

    背景 工作中负责的一套计费系统需要开发一个新通知功能,在扣费等事件触发后发送MQ,然后消费MQ发送邮件或短信通知给客户.因为有多套环境,测试时需要知道是从哪套环境发出的邮件,又不想维护多套通知模板,因 ...

  5. win7安装镜像注入USB3.0,NVMe驱动

    现在的新款主板和笔记本因为原生自带了USB3.0和NVMe,在安装WIN7的时候会出现进入安装界面后不识别USB设备且在硬盘列表中无法读取M.2类型的固态硬盘信息.导致这个现象的原因就是在WIN7安装 ...

  6. mssql server 排序 以及like语句

    当我们按照某个字段排序时,通常使用order by语句,如果该字段存在null值,则会把null值的这条放到最上面, 那我们是否有办法解决呢? 答案是肯定的: ORDER BY CASE WHEN O ...

  7. JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP

    网页框架类APP实现国际化参考文案一 参考:https://blog.csdn.net/CSDN_LQR/article/details/78026254 另外付有自己实现的方法 本人用于H5版的AP ...

  8. pandas-13 时间序列操作方法pd.date_range()

    pandas-13 时间序列操作方法pd.date_range() 在pandas中拥有强大的时间序列操作方法. 使用 pd.date_range() 生成 'pandas.core.indexes. ...

  9. 简单后台管理系统框架--HTML练手项目2【Frameset】

    [本文为原创,转载请注明出处] 技术[HTML]   布局[Frameset] 无步骤 <!DOCTYPE html> <html lang="en"> & ...

  10. Leetcode刷题python

    Two Sum 两数==target 方法二更好 题1,对时间复杂度有要求O(n),所以维护一个字典,遍历过的数值放在字典中,直接遍历时候查找字典中有没有出现差,查找字典时间复杂度是O(1),所以O( ...