首页 > 其他分享 >组件之间的数据共享

组件之间的数据共享

时间:2023-06-08 09:37:09浏览次数:29  
标签:default bus 数据共享 传递 export 之间 组件 eventBus

组件之间的数据共享

组件之间的关系:

最常见:父子关系;兄弟关系

关于传递

传递对象的引用

在 Vue 的组件中,使用 props 传递数据时,对于对象类型的属性,实际上是传递对象的引用。

在给子组件 <son> 传递 user 属性时,如果 userinfo 是一个对象,那么传递的是该对象的引用,而不是对象的副本。这意味着当父组件中的 userinfo 对象发生改变时,子组件中的 user 属性也会随之改变,因为它们引用同一个对象。

简单数据类型是复制一份传过去,复杂数据类型是复制一份数据的引用。

值传递和引用传递

值传递是指将变量的值复制一份传递给函数或另一个变量。这意味着在函数或变量中对参数进行修改不会影响到原始变量。在值传递中,对参数的任何修改都只在当前作用域中有效。

引用传递是指将变量的引用(内存地址)传递给函数或另一个变量。这意味着在函数或变量中对参数进行修改会影响到原始变量,因为它们都指向同一个内存位置。在引用传递中,对参数的修改会在所有引用该参数的地方都可见。

具体的传递方式取决于编程语言和数据类型。一些编程语言只支持值传递,而另一些编程语言支持值传递和引用传递的区分。

在 JavaScript 中,基本数据类型(如数字、字符串、布尔值)被传递给函数时是按值传递的,而对象和数组则是按引用传递的。这意味着对基本数据类型的修改不会影响原始变量,但对对象和数组的修改会影响原始对象或数组。

父子组件之间的数据共享

父向子

使用自定义属性props

父组件提供数据传递给子组件,子组件通过自定义属性来接收。

<template>
 <son :msg="message" :user="userinfo"></son>
</template>

<script>//父
export default {
   data(){
       return{
           message:'aaa',
           userinfo:{name:'bbb',age:15}
      }
  }
}
</script>
<template>
 <div>
   <p>父传递来的msg:'{{ msg }}'</p>
   <p>父传递来的user:'{{ user }}'</p>
 </div>
</template>

<script>//子
export default {
 props: ['msg', 'user']
}
</script>

<style></style>

子向父

子组件向父组件共享数据使用自定义事件(非属性!),

示例代码

如下:先子后父

<script>//子组件
 export default {
   data() {
     return {
       //子组件自己的数据,将count传递给父组件
       count: 0
    };
  },
   methods: {
     add(){
       this.count += 1;
       //修改数据时,通过$emit()触发自定义事件,并传递数据
       this.$emit('numchange',this.count)
    }
  }
};
</script>
<Right @numchange="getNewCount">这是父组件第一步</Right>
<!-- 1;getNewCount事件处理函数 -->
<script>//
 export default {
   data() {
     return {
       flag: true,

       //定义countFromSon对象接收子组件传递过来的数据。
       countFromSon:0,
    }
  },

   methods:{
     getNewCount(val){//这是父组件第二步
       this.countFromSon = val
    }
  },
</script>

$emit方法

$emit()表示触发自定义事件,并传递数据

$emit方法可以接受两个参数:

  1. 事件名称(event):作为第一个参数,用于指定要触发的自定义事件的名称。这个名称可以是任意字符串,但最好使用有意义的名称来描述事件的用途。

  2. 数据(payload):作为可选的第二个参数,用于向父组件传递数据。这个数据可以是任何 JavaScript 数据类型,包括字符串、数字、对象、数组等。

兄弟组件之间的数据共享

eventBus

在vue.2.x中,兄弟组件之间数据共享的方案是eventBus。

步骤

  1. 在发送方,先定义要发送的数据;在接收方,定义接受的数据放哪里。

  2. 创建eventBus.js模块,并向外共享一个vue的实例对象。

  3. 在数据发送方,导入bus,调用bus.$emit('事件名称',要发送的数据)方法触发自定义事件。

  4. 在数据接收方,导入bus,调用bus.$on('事件名称',事件处理函数)方法注册一个自定义事件。

示例

兄弟组件A(数据发送方) eventBus.js 兄弟组件c(数据接收方)

兄弟组件A(数据发送方)

//导入bus
import bus from './eventBus.js'

export default {
   data() {
       return {
           msg: 'this a message'
      }
  },
   methods: {
       sendMsg() {
           bus.$emit('share', this.msg)
      }
  }
}

 

eventBus.js

import Vue from 'vue'

//向外共享vue的实例对象。
export default new Vue()

 

兄弟组件c(数据接收方)


import bus from './eventBus.js'

export default {
   data() {
       return {
           msgFromLeft: ''
      }
  },
   created() { //组件的data,methods已生成好,但模板结构尚未生成,
       bus.$on('share', val => {
           this.msgFromLeft = val
      })
  }
}

 

实例

Left(数据发送方)

<template>
 <div class="left-container">
   <button @click="sendStr">sendabc</button>
 </div>
</template>
 
<script>
import bus from './eventBus'
export default {
 data() {
   return {
     str: 'aaabbbccc',
  }
},
 methods: {
   sendStr() {
     bus.$emit('share', this.str)
  }
}
}
</script>

 

Right(数据接收方)

<template>
 <div>
   <div>{{ msgFromLeft }}</div>
 </div>
</template>
 
<script>
import bus from './eventBus'
export default {
 data() {
   return {
     msgFromLeft: '',
  };
},
 created() { //组件的data,methods已生成好,但模板结构尚未生成,
   bus.$on('share', val => {
     console.log('abc !');
     this.msgFromLeft = val
  })
},
};
</script>
 

标签:default,bus,数据共享,传递,export,之间,组件,eventBus
From: https://www.cnblogs.com/yxxcl51/p/17465215.html

相关文章

  • TsVSJs之间的区别
    一、观察1.JS平常的数据类型letval;val=123;val="123";val=true;val=[1,3,5];注意点:由于JS是弱类型的,所以只要定义了一个变量,就可以往这个变量中存储任意类型的数据也正是因为如此,所以会给我们带来一个问题2.假设a是一个数组,b是一个数值functiontest......
  • Vue组件
    目录一组件介绍1.1组件是什么?有什么作用1.2组件的分类二组件的定义方式2.1定义全局组件2.2定义局部组件2.3总结三组件间通信3.1父传子属性验证3.2子传父3.3ref属性(也可以实现组件间通信:子和父都可以实现通信)1.ref属性放在普通标签上2.ref属性放在组件上四动态组件4.1......
  • 动态组件,插槽,vue-cli创建项目,目录结构,编写规范,导入导出语法
    1动态组件#<component:is="who"></component>#component标签的is属性等于组件名字,这里就会显示这个组件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>......
  • vue封装组件并发布到Npm
    前言vue封装组件是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用,甚至我们可以直接从npm仓库下载别人封装好的组件使用,入element-ui这一类的组件库。1、环境准备因为我们此次封装的是Vue组件,所以我们直接在Vue脚手架项目里面进行封装即可。(1)、初始化项目vuec......
  • 日历组件html
    <!DOCTYPEhtml><html><head> <title>CalendarComponent</title> <style> body{ font-family:Arial,sans-serif; background-color:#f2f2f2; } h1{ text-align:center; margin-top:50px; margin-bottom......
  • Oracle 19C组件ID、组件名称和组件全称对应关系以及dbca静默组件选择
     Oracle19C组件ID、组件名称和组件全称对应关系以及dbca静默组件选择 dbca可以调用图形化界面来创建数据库,当选择“CustomDatabase”模板的时候会出现“DatabaseOptions”来选择options安装对应组件,总共8个options。PS:在安装数据库期间,组件实际说法为options,安装数据库选......
  • sqlserver2014在新建维护计划时提示代理XP组件已做为此服务器安全配置的一部分被关闭,
     在sqlserver配置管理器中打开sqlserver代理即可 ......
  • sqlserver2014在新建维护计划时提示代理XP组件已做为此服务器安全配置的一部分被关闭,
    在sqlserver配置管理器中打开sqlserver代理即可 ......
  • springcloud中的组件
    1、注册中心组件有多种支持,例如:服务治理NetflixEureka、Consul、Zookeeper2、负载均衡组件NetflixRibbon客户端负载均衡组件2、容错组件NetflixHystrix用于服务熔断降级容错,Resilience4j是G版本推荐的轻量级容错方案,专为Java8和函数式编程而设计,借鉴了Hy......
  • JavaWeb基础(5)—— 浅析 Servlet 与 JSP 两者之间的区别
    维基百科中JSP的定义JSP(全称JavaServerPages)是一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。JSP使Java代码和特定的......