一、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. Django-11-Form组件

    1. 概述 Django的Form组件一般功能有: 验证用户输入 生成html代码 返回错误信息 创建Form类 from django.shortcuts import render, redire ...

  2. c,使用lib,dll

    lib使用: #include "xxx.h" // lib的头文件 #pragma comment(lib, "xxx.lib") 这样会将lib里的数据编译 ...

  3. 魔法 [线段树优化DP]

    也许更好的阅读体验 \(\mathcal{Description}\) 小 \(D\) 正在研究魔法. 小 \(D\) 得到了远古时期的魔法咒语 \(S\),这个咒语共有 \(n\) 个音节,每个音节 ...

  4. .net core中的Session以及HttpContext对象使用小结

    session用于识别用户并保持用户信息,就是一个会话 ,在浏览器不关闭的前提下,可以保存用户的信息,比如登录的保存用户信息从一个网页跳转到另一个网页,你的用户信息就可以用session. .net ...

  5. 华为、华三 交换机 开启SNMP 简单网络管理协议

    [huawei]snmp-agent //使能SNMP代理 [huawei]snmp-agent sys-info version all //允许所有SNMP 支持 协议 [huawei]snmp- ...

  6. 3.将模型添加到 ASP.NET Core MVC 应用

    添加数据模型类 右键单击 Models 文件夹,然后单击“添加” > “类”. 将类命名“Movie”.向 Movie 类添加以下属性: using System;using System.Co ...

  7. java之mybatis之字段映射及多对一

    1. 数据库中表的列名和实体类的属性名称不一致. 可以使用 resultMap来解决. <select id="findAll" resultMap="UserMa ...

  8. python 安装 SQLAlchemy 报错

    安装 SQLAlchemy 报错 安装命令 pip install -i https://pypi.doubanio.com/simple SQLAlchemy 报错截图 编码错误,这里我们需要改下源 ...

  9. 重要知识点angularjs $http.get 和 $http.post 传递参数(!!!格式不一样!!!!)

    $http.get请求数据的格式 $http.get(URL,{ params: { "id":id } }) .success(function(response, status ...

  10. vue-quill-edito 字体倾斜加粗无效

    长话短说,出现这种情况的原因80%-90%的概率在你项目里面有一个全局的 一般在reset.css重置文件中 font-weight:normal; font-style:normal; font-s ...